减少云费用的 12 个编程技巧

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

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627