Java数据包处理程序线程

时间:2015-05-10 15:39:46

标签: java multithreading sockets netty

我有一个简短的一般问题。我目前正在使用Netty来处理来自客户端的TCP和UDP数据包。我在每个单独的线程上都有套接字监听器,它工作得很好。

我现在关注的是,当流量开始大量攻击时,我认为每个处理程序管理消息的单个线程都不够。每条消息生成一个新线程是否正确(我觉得不是)?或者我应该使用像Threadpool这样的东西?任何建议都将不胜感激。

以下是消息处理程序的一些示例代码。我写了一些伪代码来可视化这个过程。它也可以帮助你们。

    @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 个答案:

答案 0 :(得分:2)

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

我的意思是说你应该考虑以下编程观点来进行服务器端设计。

1)这台服务器做什么?它只是中继消息还是要处理? 如果存在需要完成的过程,则处理传入消息的可能性很大,因为过程可能是限制因素。

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

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

但实际上你应该尝试创建一个服务器进行测试。我建议使用单线程消息监听器/数据包处理程序。如果你需要处理一些东西射击另一个处理线程。 真正的服务器设计原则就像你所要求的那样,只对数千名用户产生了全面的影响。即便如此,它在很大程度上取决于您在服务器上运行所需的过程。