1

我正在寻找一些关于使用 Netty 实现测验服务器的理论建议。服务器的三个主要要求是:

  • 服务器是权威的并控制测验的进展。例如,用户注册参加测验(如房间/大厅)。准备就绪后,服务器会继续处理问题,并在经过一段时间或每个人都回答后继续进行下一个问题。

  • 用户有十秒钟的时间来回答问题。他们回答问题所花费的时间和剩余的时间对测验很重要。参与测验的用户在地理上是不同的(即通过 WAN 链接)。

  • 它必须是可扩展的,例如一个测验可能有十个问题和三十个用户,而下一个可能有一百个问题和一万用户。

Netty 会是一个合适的解决方案吗?有没有关于Netty的好书?我在亚马逊上看不到任何 Kindle 书籍。谁能提供关于第二点的任何建议或示例(特别是考虑延迟/传输时间的时间关键型客户端/服务器示例)?

4

1 回答 1

3

不幸的是,我不知道任何有关 netty 的书籍,但是在线文档以及 JavaDocs 和示例都非常好。这里有几个例子:

  • 如果您想为数千个并发用户/连接提供服务,非阻塞 I/O 是您唯一的选择。Java(和操作系统)无法有效处理阻塞 I/O 所需的数千个线程。netty 可以,而无需创建那么多线程。

  • netty 与底层协议(TCP/IP 或 UDP)一样好。您无法解决网络延迟问题。例如,从美国向欧洲发送一个数据包大约需要 150 毫秒。

  • 如果时间如此重要,您可能需要以某种方式同步时钟或使用中央时间源。看看

  • 您必须决定您的协议将如何与服务器交互:

    • 短请求/响应连接,每次用户想要上传问题或获得新的 one-think 时建立。这将非常慢,但非常可靠(您不必担心长期连接被中断

    • 为每个用户建立一个连接,持续整个测验。这将最大限度地减少延迟,但您必须手动处理断开的连接并重新连接。

    • 混合方法 - 选择带有选项的协议Keep-alive

  • 在 netty 中,避免复制字节数组(ChannelBuffer/ByteBuf非常擅长)并创建太多垃圾

  • 避免阻塞 netty 工作线程中的 I/O 操作。监控使用了多少工作线程,避免网络事件排队。

于 2012-08-24T16:24:22.943 回答