Java 数据包处理程序线程

标签 java multithreading sockets netty

我有一个简单的一般性问题。我目前正在使用 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/

相关文章:

java - 为什么我应该使用 gRPC 而不是 IPC/Simple websocket?

java - JDialog 停止执行父 JFrame

c++ - 为什么无效套接字在 WinSock2.h (c++) 中定义为 ~0?

C++ 套接字不能接收超过 21845 个字节

java - Android:如何创建空 Realm 对象?

java - 使用面向对象获取重写方法中的值

android从线程调用外部函数

java - 一分钟后立即停止线程

java - 如何在自己的线程中启动 JavaFX GUI

java - 处理 TCP/IP 套接字上的多个请求