译者:李睿
削减云计算成本需要包括开发人员在内整个团队的努力。以下是开发人员在云中运行成本更低的软件的一些技巧。
没有什么比看到开发的应用程序得到病*式传播更能振奋开发团队的精神了。这是一种美妙的感觉,至少在每月的云账单到来之前是这样。一些开发人员认为,管理计算成本是Devops团队的责任。程序员在编写软件之后并将其发布,然而却让他人担心成本问题。没有比这更离谱的了。
明智的开发人员知道他们开发的应用程序对企业的收入有很大的影响。如果编写大量代码导致应用程度运行速度较慢,需要更多的云计算资源才能运行。而选择更好的算法和编写更紧凑的代码不仅仅是速度提升,而且编写良好的代码运行成本更低。
开发人员并不总是能看到这种联系。在他们自己的机器上编写代码很容易,而购买机器时需要为更多的内存和额外的磁盘空间支付更多的费用。如果有2TB的磁盘空间,可能不会注意到开发的代码消耗了多少空间。如果一个新算法的运行时间是原来的两倍,那么谁会注意到额外的几毫秒呢?但几乎可以肯定的是,计算量倍增将会导致更大的云计算成本。
现代云平台擅长将资源利用率转化为单项费用。优秀的云计算开发人员明白,他们有能力在编写代码时做出更明智的决策。它可以像运行分析器来识别问题一样简单,或者避免不存储必要的数据以减少内存占用。
以下是开发人员可以简化编程的12种方法,使应用程序运行起来更精简、更快、更便宜。
1.编写更快的代码
大多数开发人员不会花费太多时间优化他们的代码。如果应用程序在他们的笔记本电脑上快速运行,不会注意到它是否会随着时间的推移慢20%、30%甚至%。该程序仍在瞬间响应和运营。但是在服务器上发生数百万次时,它们就会累积起来。仔细分析可以标记缓慢的部分。重写它们可以减少应用程序需要的实例数量。
2.降低内存占用空间
使用的内存数量是云实例定价的一个重要参数。在许多情况下,加倍使用内存也会使成本加倍。开发人员可以通过避免将数据保存在内存中来降低内存占用空间。一些流算法,如Java的流类,设计用于处理大型数据文件,而无需将其全部加载到内存中。ApacheDataSketches项目在不占用所有内存的情况下为复杂的大数据统计数据生成近似答案。另一个好处是,减少内存的占用可以加快算法。有时,操作系统会开始使用虚拟内存将数据卸载到磁盘上。这可以防止崩溃,但会显著降低应用程序的速度。
3.使用较低分辨率的图像和视频
使用较低分辨率的图像和视频可以通过多种方式获得回报。首先,存储这样的图像和视频将会降低更多的成本。其次,任何数据迁移费用都会降低。第三,应用程序对用户来说似乎更快捷。所有静态图像都应该从一开始就最小化。而最小化并不简单,因为在某些时候视觉质量下降到足以让用户看到的程度。找到正确的权衡是一些程序员需要做出的设计决策。一些使用上传图像的应用程序还可以在收到图像后创建更小的缩略图和降低分辨率的版本。像ImageMagik这样的工具包和像WebP这样的格式就是为此目的而开发的。
4.转储不必要的数据
许多开发人员都在存储大量信息以备将来需要。他们用无穷无尽的列填写表格,然后从不删除行。如果拥有硬件并且磁盘驱动器有足够的空间,那么额外的数据不会花费任何费用。但是云计算对一切服务都收费。那么在将来真的需要所有这些数据吗?用户需要这么多细节吗?转储一些旧数据可以节省存储和过滤数据的费用。
5.限制磁盘存储
在云实例上使用本地磁盘不仅面临风险,而且成本高昂。本地磁盘空间通常设计得足够快以保持操作系统高效运行。许多开发人员在具有1TB或更多TB存储空间的个人计算机上创建代码。云存储很少如此便宜或容易获得。云计算供应商通常根据数据的存储规模计费,因此最好的方法是使用尽可能少的存储空间。因此,开发人员需要考虑如何最大限度地减少应用程序创建的临时文件,以及所需的系统库和软件包。
6.清理日志
日志文件非常适合在开发过程中识别问题和调试软件。但是一旦代码投入生产,就不需要保留所有代码。所有额外信息都会阻塞本地磁盘或对象存储。在设计日志系统时,将其配置为经常删除日志。许多日志包(如Log4j)可以设置为保留最少数量的日志并定期删除它们。
7.采用无服务器
无服务器架构计划仅在其代码运行时计费,这在负载间歇性时可以节省大量费用。即使是拥有持续不断的用户流的应用程序,其死区时间也比开发人员预期的要长。许多无服务器定价计划致力提供精简的编码和非常快的性能,同时占用更少的内存。计费公式以毫秒为单位计算响应时间,并仅按处理器被占用的时间计费。作为开发人员,可以立即获得反馈,因为开发人员可以直接跟踪响应时间,并查看代码更改对响应时间的影响。无服务器方法非常适合较小或更多实验性项目,并且其费用通常可以低至每月几美分。如果应用程序只是偶尔运行某些功能,那么使用无服务器可能是有意义的。
8.归档旧数据
随着数据越来越旧,访问频率也越来越低。可以通过设置应用程序将旧数据迁移到成本更低的存储设备来预测这一点。一些云平台对所谓的“冷存储”收费要低得多,这可能需要数分钟甚至数小时才能传送数据。Wasabi或Backblaze等其他云平台专门用于AmazonS3对象的存档存储,其收费远低于主要云平台。在某些情况下,他们甚至不收取数据流动费用。一旦数据不再处于高需求状态,立即卸载数据可能会非常经济高效。
9.简化CSS布局
如果看过一些框架生成的HTML标签,就会知道布局是多么的荒谬。它只是一直嵌套在DIV标签中的DIV标签,而生成和交付都需要支付费用。而网页设计师表示,只需通过更明智地使用CSS创建更简单的布局,就可以将带宽费用削减30%。
10.建立静态网站
像React这样的一些框架需要大量的计算能力,尤其是当它们使用服务器端渲染等功能时。所有这些代码都会增加每月的云计算账单。一个相反的理念是创建一个静态站点,由从缓存逐字提供的不变的HTML、CSS和JavaScript块构建。使用内容交付网络可以通过将缓存移近用户来进一步加快交付速度。各种框架都包含这种静态哲学。Jekyll、Hugo、Gridsome和Pelican只是一些工具,它们可以将所有内容打包成一组紧凑而不变的文件。仍然可以使用AJAX调用将个性化构建到页面中,但是网站的大部分在服务器上产生的负载很小。
11.外化计算和存储
随着浏览器的功能变得越来越强大,一些框架使得将更多计算直接移动到客户端变得更加简单。出色的JavaScript或WebAssembly代码可以将更多的负载推到用户的机器上。一些开发人员正在将其云层简化为一个数据库,其中包含一些用于身份验证的业务逻辑。而开发人员使用静态HTML和带有输出JSON的嵌入式过程的PostgreSQL服务器端版本运行所有内容。浏览器还有更复杂的本地存储信息选项,如HTMLWeb存储标准和W3C索引数据库API。它不再只是短字符串和Cookie。这些数据可以更快地获得,因为它不会通过互联网传播,并且它让用户知道他们的数据没有存储在一个集中的、可破解的数据库中。当数据可以免费存在于用户的机器上时,为什么还要为数据存储和泄露支付费用呢?
12.任命成本工程师
一些开发人员专门负责处理数据库,而有些人喜欢用精心设计的前端来创造美好的印象。现在云成本如此灵活,一些团队正式任命“成本工程师”来管理代码成本和效率。成本工程师的首要任务是让应用程序代码运行得更干净、更快、更轻,从而更便宜。让这个任务成为成本工程师工作的一部分,并传达说明管理代码成本作为开发团队角色和责任一部分的重要性的信息。