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

时间:2012-01-26 21:57:10

标签: sockets network-programming d

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

  1. 1个线程/连接(阻塞)
  2. 制作客户列表,并循环播放(非阻塞)
  3. 选择(基本上是一个具有可选超时的所有客户端的阻止语句?)
  4. 过去我用过1,但众所周知,它不能很好地扩展。 2是可以的,但我有一种复杂的感觉,关于一个客户在技术上能够让其他人冻结。 3听起来很有趣(比2好一点),但我听说它不适合太多连接。 那么,最好的方法是什么(在D中)?还有其他选择吗?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

要考虑的一个选项是让一个线程运行select / pole / epoll但不处理结果。相反,它将已知具有结果的连接排队,并允许从中获取线程池。如果检查已读入完整请求是否便宜,则可以在具有非阻塞IO的轮询线程中执行此操作,并仅排队完整请求。

除了(可能)线程间通信和排队之外,我不知道D是否提供任何支持。