今天,无需告诉任何人社会和经济的所有领域都对可持续利用我们的资源负有责任。这也适用于软件开发。在这篇博文中,我将向您展示一些基于 Java 的服务器应用程序的日常开发方法,旨在尽可能经济地使用资源。
使用高效的算法
首先,好消息:对于我们计算机科学家来说,效率是我们研究以来一直在处理的最重要的话题之一。因此,我们受过良好的培训,能够识别问题并应用有效的解决方案。坏消息:现在软件开发的复杂性非常高,识别和跟踪所有影响并不总是那么容易,特别是在使用库时(请参阅日志示例)。在我看来,一个好的策略是尽可能多地交流想法,并以“制度化”的方式进行,即通过代码审查、结对和群体编程、参加会议等。
当然,归并排序比冒泡排序更快,编写排序算法在日常生活中确实扮演了次要角色,但我们仍然编写了很多有时高效有时效率较低的代码。一般来说,Java 本身、Apache 或 Guava 都有强大的标准库,可以为我们接管标准任务并高效工作。
否则,您应该尽早使用强过滤器,特别是对于集合和列表的操作,从而避免对稍后将被丢弃的对象进行操作:
原则上,这些技术早已为人所知,甚至在绿色软件工程变得重 酒店电邮清单 要之前,高效开发就很重要。
但即使是高效的算法也不应该不必要地频繁执行。在复制微服务时代,如果一个实例可以执行“昂贵”的任务,则不应简单地由每个实例执行。例如,Kubernetes 环境中有可用的工作。
最小化CPU负载
第二点可能不太清楚。 Web 应用程序的 CPU 使用率通常取决于正在处理的请求。这些请求越频繁、越大,CPU 利用率就越高。如果当前没有收到任何请求,则利用率应接近 0。除了对 Web 应用程序的请求之外,还可以执行 CRON 作业,这也会生成负载。
我们应该快速了解一下响应请求所需的计算能力。当在客户端和 Web 应用程序之间交换对象时,有趣的事情之一是这些对象的序列化和反序列化,因为不同的框架和协议之间应该存在很大差异(参见Gson、Jackson 和 Mosh i 的比较和Jackson 对于 Kotlin 和 Kotlinx 序列化的比较)。例如,与二进制协议相比,基于文本的协议本质上相对较慢,并且流行的 Jackson 框架也不被认为是 CPU 友好的(请参阅 gson 或 kotlinx 等替代方案)。
此外,应注意高效的数据库或数据源连接。这会影响数据的存储和访问。访问数据时,序列化和反序列化问题也发挥着重要作用。缓存数据同样重要。这会增加内存消耗,但通过巧妙的策略可以降低 CPU 利用率。
在各种场景(启动、空闲、响应请求)下,微框架比传统 Web 框架需要更少的 CPU 容量(请参阅微服务框架回顾)。