如今,我们在可扩展性方面有很大的争议,构建一个可以处理数百万个请求的应用程序。有许多库旨在帮助您开发可扩展的应用程序,但毕竟只有几种方法可以扩展您的应用程序(这些库只是为您提供围绕它们的包装器):
- 有一个专用的任务队列(它可以是显式队列,也可以是隐含的),并且有一个或多个线程来处理队列中的任务
- 在服务器之间分配执行(负载平衡/分片)
这就对了。这个假设正确吗?或者还有其他方法可以实现“可扩展”架构?问题的重点是验证是否只有有限的集合(从根本上)来扩展应用程序,而库/工具只是帮助您实现它们。
如今,我们在可扩展性方面有很大的争议,构建一个可以处理数百万个请求的应用程序。有许多库旨在帮助您开发可扩展的应用程序,但毕竟只有几种方法可以扩展您的应用程序(这些库只是为您提供围绕它们的包装器):
这就对了。这个假设正确吗?或者还有其他方法可以实现“可扩展”架构?问题的重点是验证是否只有有限的集合(从根本上)来扩展应用程序,而库/工具只是帮助您实现它们。
从负载均衡器向下一步进入各个服务器。
无论应用程序需要节省使用的线程数量,以便操作系统的调度程序花费尽可能少的 CPU 周期来确定最高优先级的线程。执行此操作的一种机制是 I/O 完成端口,可在 Windows 和一些 Unix 版本中找到。在 SO 上搜索 IOCP。
节省对共享资源(通信、数据库、总线、RAM 和 L3 缓存等)的访问,并尝试将线程和数据放入非共享资源(L2 和 L1 缓存)中,从而使应用程序更具可扩展性如果这些访问被忽略。有许多多线程应用程序运行速度比单线程应用程序慢的示例。
确定一个 SOAP 或 XML 格式的请求应该做什么是 CPU 密集型的 - 文本越多,工作就越大。如果应用程序使用二进制请求,它将有更多的资源用于执行请求,并且花费更少的时间来理解请求本身。冗长请求和响应的另一个方面是它们吞噬了通信带宽。一兆字节的响应需要大约十兆字节的带宽。这是一秒钟内 100 Mbps 连接容量的十分之一。因此,它会将您的响应能力限制为每秒最多 10 个响应。你要一千?您需要不超过 10 kB 的响应。
如果您的应用程序足够快,如果它需要转到另一台服务器来执行部分请求,它将被阻止。即使对于光纤互连也是如此。SAN 比物理连接的存储慢。
可扩展架构需要解决 N 层单体应用程序中如此普遍的耦合问题,SOA 正在尝试解决这个问题。
通过分布,使用异步通信(使用消息传递),垂直切片(自治)组件,不共享资源(包括数据),您可以实现可伸缩性和持久性,这是一个很大的话题......
我建议你阅读Udi Dahan 的博客。
NServiceBus是一种与 SOA 一致的解决方案,可以帮助您构建可扩展的持久系统。
在我以前去过的一家公司中,有这样的架构,所以
这个假设正确吗?
我想是的。该公司规模相对较大,并且拥有令人印象深刻的专业知识。您可以考虑他们最重要的产品架构之一,如下所示:
______________
-> API1: 1000
--------------
______________ ______________ ______________ | |
LoadBalancer -> API2: 1000 -> CacheServer -> | DB |
-------------- -------------- -------------- | |
______________
-> API3: 1000
--------------