这句话是什么意思 - 将可扩展性设计到应用程序中。是否存在可以使应用程序更具可扩展性的设计模式?这个问题主要针对 Web 应用程序或基于 SOA 中间件的应用程序。
当我想到“大规模应用程序”时,我想到了三个截然不同的事情:
将在大型横向扩展集群(远大于 1024 个核心)上运行的应用程序。
将处理比物理内存大得多的数据集的应用程序。
具有非常大的代码源库的应用程序。
每种“可扩展性”都会引入不同类型的复杂性,并且需要一组不同的妥协。
横向扩展应用程序通常依赖于使用 MPI 来协调各种进程的库。有些应用程序是“令人尴尬的并行”,并且需要很少(甚至不需要)不同进程之间的通信才能完成任务(例如渲染动画电影的不同帧)。这种类型的应用程序往往会受到基于 CPU 时钟速率或内存带宽的性能限制。在大多数情况下,添加更多核心几乎总是会增加应用程序的“可扩展性”。其他应用程序需要不同进程之间存在大量消息流量,以确保解决方案取得进展。这种类型的应用程序往往会受到节点之间互连的整体性能的限制。这些消息密集型应用程序可能受益于非常高的带宽、低延迟的互连(例如 InfiniBand)。这种类型的应用程序的可扩展性首先是尽量减少所有进程对共享文件或资源的使用。
第二种类型的可扩展性是在少量服务器(包括单个 SMP 类型服务器)上运行的应用程序,但处理非常大的数据集或大量事务。向系统添加物理内存通常可以提高应用程序的可扩展性。然而,在某些时候物理内存将会耗尽。大多数情况下,性能瓶颈会与系统的磁盘I/O性能有关。在这些情况下,添加高性能持久存储(例如剥离硬盘阵列),甚至添加高性能互连到某种 SAN 都有助于提高应用程序的可扩展性。这种类型的应用程序的工程可扩展性始于算法决策,这些决策将最大限度地减少重复接触相同数据(或设置相同基础设施)的需要,而不是完成任务所需的次数(例如,打开与数据库的持久连接,而不是打开每笔交易都有一个新连接)。
最后,还有与源代码库的总体大小相关的可扩展性的情况。在这些情况下,良好的软件工程实践可以帮助最大限度地减少冲突,并保持代码库干净。这本书大规模C++软件设计 https://rads.stackoverflow.com/amzn/click/com/0201633620是我遇到的第一个真正接受为大型源代码软件开发提供最佳实践的挑战的人。本书重点关注 C++ 作为实现语言,但指南和实践可以应用于任何项目或语言。这种类型的应用程序的工程可扩展性涉及对代码结构做出高层决策,以最大限度地减少代码库内的依赖关系(例如,不要有单个 .h,当更改时将强制重建整个代码库,请使用构建系统将尽可能重用 .o)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)