【问题标题】:Netty-TCP-HTTP-MQTT designNetty-TCP-HTTP-MQTT 设计
【发布时间】:2017-11-16 17:39:42
【问题描述】:

我正在尝试编写一个可以接受 tcp、http 和 mqtt 通信的服务器端 java 应用程序(接收和发送/MongoDB 作为存储)。通过研究,我们认为它可以是一个基于 Netty 和 paho for mqtt 的 jar 应用程序。我们有 3 个项目使用其中三种协议,因此我正在尝试统一连接模块。它们各自有不同的协议风格,例如:

-tcp: 0102330123456700

-http: HTTP POST /URL/count {"id":"02","count":"01234567"}

-mqtt: 主题/02/count {"count":"01234567"}

由于我们的时间有点短,我以一种愚蠢但快速的方式运行它们三个——3 个不同的线程监听 3 个不同的端口。

public class ServerLauncher {
public static void main(String[] args) {
    NettyRestServer nettyRestServer = new NettyRestServer();
    MqttServer mqttServer = new MqttServer();
    EchoServer echoServer =  new EchoServer();

    new Thread(nettyRestServer,"HTTP Listening").start();
    new Thread(mqttServer,"Mqtt Listening").start();
    new Thread(echoServer,"socket Listening").start();
}

}

我的问题是:

  1. 既然都是基于tcp的,有没有什么好办法可以一起管理而不浪费线程资源呢?也许只运行一个线程来监听一个端口。我只找到单一协议的示例。
  2. 对于数据存储,将所有传入消息推送到跨所有线程/通道的 concurrentHashMap 是否是一个不错的设计。最后用另一个线程运行计划任务,将这个 concurrentHashMap 存储到 MongoDB 中并重置。或者可能使用队列而不是 concurrentHashMap

【问题讨论】:

    标签: java multithreading mongodb sockets netty


    【解决方案1】:

    如果您对所有这些都使用 Netty,您可以为所有服务器共享相同的 EventLoopGroup,这意味着所有服务器都将共享相同的 Threads。

    【讨论】:

    • 嗨,诺曼,我实际上是从你那里读到“Netty in Action”。无论如何,我现在已经重新安排了这种方式。但是我发现除了 java 文档之外的 netty-mqtt 信息很少。我想知道是否有任何我可以通过的资源
    【解决方案2】:

    您不必使用三个线程来启动服务器。您可以在一个 ServerBootstrap 中完成所有这些工作。并将逻辑放在ChannelHandler中。

    Netty的ChannelPipeline在获取连接时可以动态改变ChannelHandler。

      ctx.pipeline().addBefore(...)
      ctx.pipeline().addAfter(...)
      ctx.pipeline().remove(...)
    

    【讨论】:

    • 感谢 Frio,我现在在 ServerBootstrap 上分享。但是,管道将无法识别 tcp、http 或 mqtt。这是否意味着我必须先决定协议,然后选择要传递的逻辑。 ctx.pipeline().addBefore(new ProtoclSelector())这种安排?
    • 你是对的。我不确定mqtt是否基于tcp,我会假设它是基于tcp堆栈的。首先,你需要像这样等待tcp连接:b.group(bossGroup,workerGroup).channel(NioServerSocketChannel .class).childHandler(WebSocketServerInitializer)。然后,您需要预先定义一个已添加到 WebScoketServerInitializer 实例的解码器。解码器负责在读取头字节后添加跟随的解码器和处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2020-07-09
    • 2023-03-05
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多