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