我从事嵌入式系统和硬件接口系统编程 至今。为了获得有趣和个人的知识,最近我一直在努力学习更多关于服务器编程的知识。我一直在考虑从C ++ / Java前瞻性思考服务器,现在我想知道如何使用C ++或Java等技术构建可扩展系统。
我已经读过,由于上下文切换和有限的内存,每个客户端的线程处理程序是不现实的。通常会创建一个线程池,并使用工作线程和异步I / O的混合来处理请求。我想知道,首先,如何确定线程池大小?是否只需要测量并找到最佳平衡?最终,随着系统扩展,可能需要多个服务器来处理请求。如何在处理大型客户端的多个服务器上管理请求?
我正在寻找一些方向,以便我可以阅读更多内容并找到问题的答案。我将在这个领域获得更多信息的计算机科学领域?这个计算领域有没有设计模式?
答案 0 :(得分:3)
你的问题太笼统,无法得到一个好的答案。答案在很大程度上取决于上下文,任何一个Thread处理的程度,请求到达的速度,使用的CPU系列,正在使用的Web容器以及许多其他因素。
答案 1 :(得分:1)
C++ Network Programming: Mastering Complexity Using ACE and Patterns和 C++ Network Programming: Systematic Reuse with ACE and Frameworks是非常好的书籍,描述了许多设计模式及其在高度可移植的ACE库中的使用。
答案 2 :(得分:1)
与Lothar一样,我们使用包含reactor和proactor模式的ACE库来处理异步事件和使用C ++代码的异步I / O.我们使用相当大的工作线程池,根据需要增长(达到可配置的最大值)并随着时间的推移而缩小。
C ++的一个技巧是如何跨网络边界传播异常和错误情况(语言无法处理)。我知道.NET有办法在这些网络边界上抛出异常。
您可以考虑的一件事是研究SOA(面向服务的体系结构)来处理更高级别的分布式系统问题。 ACE,如果真的是在机器的裸机上运行。
答案 3 :(得分:1)
对于C ++我使用了boost :: asio,它是非常现代的C ++,非常适合使用。此外,C ++ 0x网络库将基于ASIO的实现,因此它具有宝贵的知识。
至于每个客户的1thread设计,不起作用,正如您已经学到的那样。对于高性能多线程,最佳线程数似乎是CoresX2,但对于服务器,每个请求有很多IO,这意味着大量空闲等待。根据经验,看看Apache,MySQL和Oracle的线程数量是关于数据库服务器的CoresX10,以及用于Web服务器的CoresX40,不是说这些是理想,但它们似乎是成功系统的模式,所以如果你的系统可以平衡以最佳方式使用相似的数字,至少你知道你的设计并不完全糟糕。