我有一个简单的一般性问题。我目前正在使用 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) 您预计有多少“流量”?任何时候的估计服务器负载是多少? 我知道当您构建第一台服务器时这很困难。但你需要知道你的目标。如果您认为全世界都会使用它,那么您确实需要为此做好准备。否则我建议只是尝试测试一下自己。
现在,正如您所知,许多游戏服务器/消息传递服务器都是多服务器,它们有一个主服务器,并将工作委托(delegate)给其他服务器,如果需要,这些服务器都可以相互通信。也许这就是您所需要的,具体取决于您想要的程序类型。
但实际上您应该尝试创建一个服务器来测试。我建议使用单线程消息监听器/数据包处理程序。如果您需要处理某些内容,请启动另一个处理线程。 真正的服务器设计原则就像“只有你问”这样的原则只有在超过数千个用户时才会完全生效。即便如此,它在很大程度上取决于您需要在服务器上运行的进程。
关于Java 数据包处理程序线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153293/