2009-04-18 67 views
3

我已经在嵌入式系统和系统编程中使用硬件接口 到目前为止。为了获得有趣和个人的知识,最近我一直在努力学习更多关于服务器编程的知识。我一直在回顾和思考C++/Java前瞻性的服务器,现在我想知道如何使用C++或Java等技术构建可伸缩系统。服务器设计和实现

我读过,由于上下文切换和内存有限,每个客户端线程处理器是不现实的。通常会创建线程池,并使用工作线程和异步I/O的混合来处理请求。我想知道,首先,如何确定线程池大小?人们是否需要测量并找到最佳平衡?最终随着系统扩展,可能需要多台服务器来处理请求。如何在处理大型客户群的多个服务器上管理请求?

我只是在寻找一些方向到我也许能读更多,并找到我的问题在哪里。我会查看哪些计算机科学领域的更多信息?这个计算领域是否有任何设计模式?

+0

我很欣赏这个问题,但也许它是四五个包装成一个。 – ojblass 2009-04-18 02:12:21

回答

1

为C++我使用的boost :: ASIO,这是非常现代的C++,相当plesant的工作。此外,C++ 0x网络库将基于ASIO的实现,因此它是有价值的知识。

至于设计1线程的客户端,不工作,因为你已经知道了。而对于高性能的多线程来说,最好的线程数似乎是CoresX2,但对于服务器来说,每个请求都有很多IO,这意味着很多空闲的等待。从经验来看,Apache,MySQL和Oracle的线程数量是关于数据库服务器的CoresX10和Web服务器的CoresX40,并不是说这些都是理想,但它们似乎是成功系统的模式,所以如果你的系统可以进行平衡,以相似的数字进行最佳工作,至少您会知道您的设计并不完全糟糕。

3

你的问题太笼统了,不能有一个很好的答案。答案很大程度上取决于上下文,任何一个线程的处理量,请求到达的速度,正在使用的CPU系列,正在使用的Web容器以及其他许多因素。

1

洛萨一样,我们使用ACE库含有反应器和摄模式用于处理异步事件和异步I/O与C++代码。我们使用可根据需要增长的大型工作程序线程池(达到可配置的最大值)并随时间缩短。

一个与C++的招数是你如何去传播跨越网络边界异常和错误的情况下(这不是由语言处理)。我知道.NET可以通过这些网络边界抛出异常。你可以考虑

有一件事是寻找到SOA(面向服务架构)用于处理更高层次的分布式系统的问题。 ACE如果真的在机器的裸机上运行。