我知道“负载平衡”一词可能非常广泛,但我试图解释的主题更具体,我不知道正确的术语。我正在构建的是一组服务器/客户端应用程序。服务器需要能够处理大量的数据传输以及客户端连接,因此我开始研究多线程。
我基本上有3种方法可以看到为服务器实现任何类型的线程......
第三个是我想知道的。这包括这样的设置:
我目前还没有找到任何代码,但有关如何使用此类设置的信息,以及最好是在Delphi(XE2)中完成此操作的教程。即使是一个适当的单词或名称也足以让我自己进行搜索。
修改
我发现有必要解释一下这将用于什么。我将流式传输命令和图像,将有一个双插槽设置,其中有一个“主命令套接字”和另一个“附加图像流套接字”。所以真正的一个连接是2个套接字连接。
每个与服务器主套接字的连接都会创建(或重新使用)表示该连接所需的所有数据的对象,包括线程,图像,设置等。对于主套接字的每个连接,还有一个流套接字连接的。它并不总是流式传输图像,但命令套接字始终准备就绪。
关键是我在当前的设置中已经有了一个线程机制(每个会话对象一个线程),我想把它转移到类似池的多线程环境。这两个连接在一起需要对这些线程进行更高级别的控制,我不能依赖像Indy这样的东西来保持这些同步,我宁愿知道事情是如何工作的,而不是学会相信其他东西来做这项工作。我
答案 0 :(得分:4)
IOCP服务器。这是唯一的高性能解决方案。它在用户模式下基本上是异步的('M $ -speak中的重叠I / O),一个线程池发出WSARecv,WSASend,AcceptEx调用,然后所有等待IOCP队列的完成记录。当有用的东西发生时,内核线程池会执行实际的I / O,然后将完成记录排队。
您至少需要一个缓冲类和套接字类(可能还有其他类似的高性能 - objectPool和pooledObject类,因此您可以创建套接字和缓冲池)。
答案 1 :(得分:3)
500个线程在服务器类计算机上可能不是问题。阻塞TCP线程在等待服务器响应时没有做太多工作。
没有什么可以阻止您在服务器端创建某种类型的工作队列,由有限大小的线程池提供服务。一个简单的线程安全TList非常适合作为队列,你可以轻松地在每个服务器线程上放置一个消息处理程序来进行通知。
但是,在某些时候,服务器可能需要处理太多工作或太多线程。这通常通过添加另一个应用程序服务器来处理。
为了确保可扩展性,可以为多个服务器构思代码,并且可以通过添加硬件来扩展。
可能有某些原因限制实际工作线程的数量,例如限制数据库上的锁争用或类似的东西,但是,通常,您通过添加线程来分配工作,并让硬件(CPU,重定向器) ,开关,NAS等)安排负载。
答案 2 :(得分:2)
您的实施与您使用的通信组件完全相关。如果您使用Indy或任何基于Indy的东西,则每个连接是一个线程 - 期间!没有办法改变这一点。 Indy将扩展到100个连接,但不是1000个。您最好的希望将线程池与通信组件一起使用是IOCP,但在这里您的选择受到缺少第三方组件的限制。我以前做过所有调查,你可以在stackoverflow.com/questions/7150093/scalable-delphi-tcp-server-implementation看到我的问题。
我有一个完全有效的分布式开发框架(线程和通信),已经在超过6个独立系统中用于生产超过3年,基本上涵盖了您目前所提出的所有问题。代码也可以在网上找到。