Java 数据包处理线程

Java Packet Handler Threading

我有一个简单的一般性问题。我目前正在使用 Netty 来处理来自客户端的 TCP 和 UDP 数据包。我将套接字侦听器分别放在一个单独的线程上,并且效果很好。

我现在担心的是,当流量开始受到严重影响时,我认为每个处理程序管理消息的单个线程是不够的。每条消息生成一个新线程是否正确(我觉得不正确)?或者我应该为此使用线程池之类的东西吗?任何建议将不胜感激。

这是消息处理程序的一些示例代码。我写了一些伪代码来可视化这个过程。说不定对你们也有帮助。

    @Override
public void messageReceived(ChannelHandlerContext ctx, DatagramPacket packet) {
    //This will likely need made into a thread
    //SocketDecoder.decode(packet.content().toString(CharsetUtil.US_ASCII));
    //Handle decoded message, will return CharSequence
    DatagramPacket response = Namespace.Decoder.createDatagram(packet, "hello");
    ctx.writeAndFlush(response);
}

你需要做出有根据的猜测。

我的意思是说,对于服务器端设计,您应该考虑以下编程观点。

1) 这个服务器是做什么的?它只是中继消息还是需要处理? 如果有需要完成的流程,那么处理传入消息很可能不会成为问题,因为流程可能是限制因素。

2) 您期望 "traffic" 多少?任何时候估计的服务器负载是多少? 我知道当您构建第一台服务器时这很难。但你需要知道你的目标。如果您认为全世界都会使用它,那么您真的需要为此做好准备。否则我建议只是尝试测试自己。

现在如您所知,许多游戏 servers/messaging 服务器是多服务器,它们有一个主服务器,它们将工作委托给其他服务器,如果需要,它们都可以相互通信。也许这就是您所需要的,具体取决于您所追求的程序类型。

但实际上你应该尝试创建一个服务器来测试。我建议使用单线程消息 listener/packet 处理程序。如果您需要处理某些东西,请关闭另一个处理线程。 真正的服务器设计原则,就像你所要求的那样,只会对成千上万的用户产生全面的影响。即便如此,它在很大程度上取决于您需要在服务器上 运行 的进程。