【问题标题】:Java Packet Handler ThreadingJava 数据包处理程序线程
【发布时间】:2015-05-10 15:39:46
【问题描述】:

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

【问题讨论】:

    标签: java multithreading sockets netty


    【解决方案1】:

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

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

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

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

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

    但实际上你应该尝试创建一个服务器进行测试。我建议使用单线程消息侦听器/数据包处理程序。如果您需要处理某些东西,请使用另一个处理线程。 真正的服务器设计原则,如你所要求的,只有在成千上万的用户中才能充分发挥作用。即便如此,它在很大程度上取决于您需要在服务器上运行的进程。

    【讨论】:

    • 这将是一个游戏服务器,但我们离与其他服务器通信的地步还很远。使用委托,它基本上只是通过网络进行服务调用,然后在返回时执行承诺?
    • 这听起来也是一个好主意,因为这会创建委托将强制我们进入的异步进程,因此最好从一开始就考虑到这一点,不会吗?
    • 最常见和最简单的例子是登录。对于游戏服务器来说,有很多处理,所以大多数游戏都有一些专用的登录/授权系统。另一个仅用于在服务器之间提供通信的服务器示例可以是服务器间好友列表...或世界分割/旅行屏幕某些游戏每个区域都是自己的服务器...尽管这些都是高需求游戏跨度>
    • 好的,这让我了解了所涉及的架构,所以我知道在构建它时要记住什么。感谢您的可视化。
    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多