簡體   English   中英

Netty-TCP-HTTP-MQTT設計

[英]Netty-TCP-HTTP-MQTT design

我正在嘗試編寫一個服務器端Java應用程序,它可以接受tcp,http和mqtt通信(接收和發送/ MongoDB作為存儲)。 通過研究,我們認為它可能是基於Netty和paho的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. 對於數據存儲,將所有傳入的消息跨所有線程/通道推送到並發HashMap是一項明智的設計。 最后,通過另一個運行計划任務的線程,將此並發哈希表存儲到MongoDB中並重置。 或者也許使用隊列而不是並發HashMap

如果將Netty用於所有這些,則可以為所有服務器共享相同的EventLoopGroup ,這意味着所有服務器都將共享相同的Threads

您不必使用三個線程來啟動Server。 您只能在一個ServerBootstrap中完成所有這些操作。 並將邏輯放在ChannelHandler中。

Netty的ChannelPipeline在獲得連接時可以動態更改ChannelHandler。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM