可扩展的架构/应用

时间:2014-10-22 06:21:16

标签: architecture queue scalability distributed scalable

如今,我们在可扩展性方面存在很大的噪音,构建一个可以处理数百万个请求的应用程序。有许多库旨在帮助您开发可伸缩的应用程序,但毕竟只有几种方法可以扩展您的应用程序(并且库只是为您提供包装它们的包装器):

  • 有一个专用的任务队列(可以是显式队列,也可以是实现隐含的),并且有一个或多个线程处理队列中的任务
  • 在服务器之间分配执行(负载平衡/分片)

就是这样。这个假设是否正确?或者还有其他方法可以实现“可扩展”架构? 问题的关键在于验证是否只有有限的集合(从根本上)来扩展应用程序,而库/工具只是帮助您实现它们。

3 个答案:

答案 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比物理连接存储慢。