处理传入消息的最佳方法是什么?

Mar*_*ars 8 sockets network-programming d

我正在为在线游戏编写服务器,最终应该能够处理1,000-2,000个客户端.我发现这样做的3种方法基本上是:

  1. 1个线程/连接(阻塞)
  2. 制作客户列表并循环遍历(非阻塞)
  3. 选择(基本上是所有客户端的阻塞语句,可选超时?)

在过去,我使用过1,但众所周知,它不能很好地扩展.2是可以的,但我有一种复杂的感觉,关于一个客户在技术上能够让其他人冻结.3听起来很有趣(比2好一点),但我听说它不适合太多连接.那么,最好的方法是什么(在D中)?还有其他选择吗?

Vla*_*eev 5

通常的做法是最接近3:异步编程与性能更高的select替代方案,如pollepoll系统调用在Linux上,IOCP在Windows,或更高级别的库包装他们.D不直接支持它们,但您可以找到D绑定或第三方D库(例如Tango)为它们提供支持.

性能更高的服务器(例如nginx)每个CPU核心使用一个线程/进程,并在该线程/进程中使用异步事件处理.