数据流|开发企业软件的第一准则:可扩展性

开发企业软件绝非易事 。 设计一个平台来服务成千上万的用户、设备或数据流是一项艰巨的任务 。
在制定新的软件解决方案时 , 可扩展性是最重要的考虑因素之一 。 没有它 , 软件就无法支持用户增长而不损害用户体验 , 对销售也是如此 。 构建一个可扩展的软件平台很有挑战性 , 因为要事先知道供应商需要考虑哪些因素、选项和问题几乎是不可能的 , 这就需要不停迭代 。
我们来看看如何从头开始构建软件以快速支持扩展 。
不要总是相信开源
首先 , 利用现成的平台和工具 , 似乎是一个省钱省时的好方法 。 但是 , 当尝试扩展软件时 , 很快就会发现 , 虽然这些平台是通用的 , 并且适用于广泛的应用程序 , 但是当需要对特定平台或用例进行重大定制时 , 它们并不是最合适的 。
这是Forward Networks团队早年遇到的问题 。 最初 , 团队严重依赖Elasticsearch来计算、索引和存储平台的所有端到端网络行为计算 。 慢慢地发现这不是一个长期的解决方案 。 在Elasticsearch中预计算所有数据变得不可行 , 存储成本也越来越高 。 对这些开源工具的依赖开始成为一个问题 , 因此团队决定创建一个自己的分布式计算和搜索平台 。
在内部设计平台时 , 如果可能的话 , 采用延迟计算方法是明智的 。 通过预计算执行快速处理所需的足够数据 , 并在用户查询输入时执行特定于该查询的其余计算 , 将带来重大改进 。 计算能力和所需存储量的大幅降低 , 使得平台在未来的性能和可扩展性得到了迅速提高 。
极简主义设计
请记住软件平台必须在最小的内部硬件上运行 。 虽然在AWS、Azure或其他云提供商中提供1TB+RAM的实例非常容易 , 但大多数客户将在可用的最小RAM量上操作供应商的平台 。 特别是当一个潜在的客户在测试软件时 , 他们不想为一个不确定的平台提供大量的资源 。 使用128GB或256GB的RAM并不少见 。
一个简单的事实是 , 当软件需要大量的内部计算资源时 , 可能会引发担忧 。 另一方面 , 潜在客户要迅速开始使用该软件 , 以完成概念验证 , 否则他们还没有看到在环境中操作该平台的价值——这对转换销售绝对是关键 。
即使需要扩展到1000倍 , 也不能简单地使用具有1000个节点的集群 。 即使在极少数情况下这在技术上是可能的 , 这也是不现实的做法 。 软件供应商必须进行艰苦的工程工作 , 才能以最少的资源完成同样的扩展工作 。 以下是一些具体的方法 , 可以帮助团队在设计软件平台时牢记极简主义:
——避免重复计算 。
——消除内存和磁盘上的重复数据结构 。
——延迟计算:将处理延迟到实际需要时 。
——使核心数据结构尽可能紧凑 , 并且具有非常低的序列化和访问开销 。
——使用fastutil在Java中实现快速和内存高效的集合 。
——配置文件以检测和优化实际瓶颈的性能 。
如果可能的话 , 一个平台的资源需求在理想情况下应该很低 , 开发人员可以在笔记本电脑上运行整个堆栈 。 这对于实现快速调试和快速迭代至关重要 。 以这种方式构建在最小硬件上运行的软件平台可以加快采用速度 , 并最终为客户节省资金和提高利润率 。
总是收集数据
即使是设计得最好的软件 , 也可能存在一些根本无法预料的环境因素或数据模式 。 随着时间的推移 , 软件的计算核心可能需要多次重写或显著更改 , 以适应无法预见的新问题、约束或低效 。 可用于测试平台的数据集越大 , 团队就越早发现这些瓶颈和限制 。
但对于一家新成立的公司来说 , 这并非易事 。 为什么一个大型企业要花时间安装一个新供应商的平台 , 配置他们的安全策略以允许软件连接到他们的整个网络来获取他们的配置 , 并将数据发送给一个还没有经过验证的产品的小公司?大多数开发人员需要走很长的路 。 这意味着从客户和试点项目中收集任何可能可用的相关数据 , 以不断构建和扩展内部数据集 , 用于规模测试和改进 。 即使是不会带来新客户的软件试用 , 也可以为改进平台提供具有宝贵洞察力的新数据 。 然后 , 随着软件变得更好、更快和更具可扩展性 , 可以进入更大的客户环境 , 获得更大的数据集 , 并用于下一组平台瓶颈 。
【数据流|开发企业软件的第一准则:可扩展性】另一个复杂问题是 , 许多企业都有严格的安全和隐私政策 。 他们不会直接与软件供应商共享数据和信息 。 这些类型的公司需要花时间在平台中构建数据模糊处理功能 , 分析性能瓶颈 , 而不真正共享客户的实际数据 。
投资内部测试
当然 , 没有一家供应商希望自己的平台“崩溃” , 这对公司来说并不好看 , 而且可能会让客户花费数百万美元的时间来寻找解决方案 , 甚至更糟的是 , 寻找替代方案 。 对于那些希望在不破坏东西的情况下快速发展的软件平台供应商来说 , 投资复杂测试是至关重要的 。
通过雇佣足够的工程师来运行一致和彻底的测试 , 以检查正确性和性能回归 , 供应商可以使软件平台尽可能可靠和有弹性 。
不断进化
老实说 , 这些过程是一个不断循环的过程 。 没有一家供应商真正“完成”了对其软件平台的改进 。 始终需要进一步开发软件 , 以更好、更快、更高效地工作 , 并与市场上出现的新技术和平台兼容 。 所有这些在构建可伸缩的企业软件时都更加适用 。
随着越来越多的设备变得智能化和互联化 , 对可扩展解决方案的需求将成倍增长 。 以可扩展性为根本设计软件还可以提高性能、计算和存储效率和客户体验 。 这是一个明智的选择 , 它可以让供应商走在竞争对手的前面 , 并使他们取得长期成功 。
Developing Enterprise Software with Scalability Top of Mind – The New Stack

    推荐阅读