开发运维视角下,影响软件高可扩展性的6个因素

作者|GeshanManandhar
译者|孙简一
策划|万佳
软件可扩展性是一个有趣的话题 。 实现软件可扩展性涉及很多因素 , 我们在本文将讨论一些与开发和运维方面相关的因素 。
我们将深入讨论如何编写软件(软件开发)以及如何运行软件(运维)来实现软件可扩展性 。 对于初学者来说 , 成本和可扩展性通常是成比例的 。
开发运维视角下,影响软件高可扩展性的6个因素
开发运维视角下,影响软件高可扩展性的6个因素
文章图片
1什么是软件可扩展性Full-scaleblog将软件可扩展性定义为:
软件可扩展性是工具或系统的一种属性 , 可以根据用户需求增加其容量和功能 。 可扩展的软件可以在适应变化、升级、检修和资源伸缩的同时保持稳定 。
因此 , 如果软件可以弹性的处理负载 , 当请求量增加时分配更多资源(通常是动态分配) , 那我们可以说这个软件是可扩展的 。 现实中要实现这一点 , 我们还需要重视代码部分 。
2开发视角的软件可扩展性软件工程师应该知道如何编写可扩展的软件 。 你应该专注于优先编写能使软件易于扩展的代码 。 编写勉强可用的软件很容易 , 但编写易于测试、可维护、易扩展的代码却很难 。 以下是一些能让软件更易扩展的编程方法 。
可扩展软件的高性能代码软件应用程序编写时可以只要求能用就行 , 也可以考虑到软件的可扩展性、维护性和弹性 。
选择合适算法
基于时间和空间复杂度 , 选择适合场景的合适算法可以产生很好的效果 。
了解大O符号和流处理来对抗空间复杂度 , 对编写可扩展的软件非常有帮助 。
例如 , 您可以采用二分搜索代替线性搜索来加快算法执行 。 在空间复杂度要求高的场景下 , 您可以基于少量内存的流式处理来实现小内存复制大文件 。 看看这个用来可视化展示排序算法的6分钟视频 。
https://www.youtube.com/watch?v=kPRA0W1kECg
更好的内存管理
作为一位软件工程师 , 您应该关心像内存管理、垃圾收集这样的事情 , 不要让它们成为可扩展性的障碍 。 对于可扩展软件来说 , 预测资源争用的情况并为其编写代码也是至关重要的 。
选择高性能函数库
还有其他有助于软件可扩展性的方法 , 包括对比和使用更多的高性能解决方案 。 例如 , 您可以使用javascript代替lodash来获得更快更高性能 。
另外 , 不要仅仅因为某个库或软件包很流行就使用它 , 还要检查性能和软件可扩展性的影响 。
例如 , 您可以使用Day.js代替Moment.js来执行简单的日期操作 。 需要的话 , 还可以使用原生方法来使软件更具可扩展性 。
异步处理想象一下 , 当客户已经成功下单需要发送一封订单确认邮件 , 您会怎么做?我总是会建议大家异步地执行它 , 因为它是流程中非关键的部分 。
使用队列和消费者
您可以轻松地设置队列和消费者 , 来完成下单后电子邮件的发送任务 。 即便邮件发送晚了1分钟也没问题 。
如果您的订单量很大 , 可以通过扩展消费者数量来降低延迟 。 任何非关键或非阻塞的任务都可以推到后台异步完成 , 这有助于实现无故障的最优化可用资源 。
适当使用异步代码
异步处理的另一个例子是使用异步代码 。 根据编程语言的具体情况 , 您应该都能够将某些任务推送到后台执行 。 当任务被执行时 , 可以发送一个响应表明它已经被调度过 。 您可以查看一个Node.js的异步响应示例 。 当然 , 这取决于您所选择的语言 , 有些语言(比如PHP)可能不提供开箱即用的异步代码 。
https://geshan.com.np/blog/2020/11/nodejs-for-php-developers/#node.js-code-execution-is-async-and-non-sequential
为可扩展软件编写无状态的程序无状态是高可扩展性软件的先决条件 。 正如Redhat在比较无状态与有状态时提到的“将无状态事务想象成一台自动售货机:一个请求对应一个响应” , 而将有状态程序描述为“您可以将有状态事务视为与同一个人进行中的多轮对话” 。
无状态软件在请求之间不会共享任何东西 , 也不依赖于本地文件系统之类的东西 。
不要使用本地文件系统
如果需要保存文件 , 应该使用可靠的远程系统如可进行访问控制的存储 , 例如AmazonS3bucket 。
这使得它很容易保存文件并通过CDN来提供可扩展的服务 , 它通过动静分离来提高软件扩展性 。 如图像和其他类似PDF文件的静态内容 , 通过使用CDN来提供服务会比网站服务更高效 。 利用Apache或Nginx构建网站服务来提供动态内容 , 会比提供静态内容更好 。