【问题标题】:Netty nested pipelines / multiplexingNetty 嵌套管道/多路复用
【发布时间】:2013-03-08 03:19:31
【问题描述】:

我对 Netty 很陌生,但是当多个协议(例如 P1 和 P2)封装在另一个协议中时,如何在 Netty 4.x 中实现一个案例?

              +-------------+
              |   decoder   |
              +-------------+
              |   encoder   |
              +-------------+
              |    muxer    |
              +-------------+
              |   demuxer   |
              +---+------+--+
                  |      |
                  |      |
           +------+      +------+
           |                    |
           |                    |
           v                    v
    +-------------+      +-------------+
    | P1 decoder  |      | P2 decoder  |
    +-------------+      +-------------+
    | P1 encoder  |      | P2 encoder  |
    +-------------+      +-------------+
    | P1 handler  |      | P2 handler  |
    +-------------+      +-------------+

有没有办法创建嵌套管道,以便decoder<->encoder<->muxer<->demuxer 作为主管道将根据解复用器的决定沿 P1 或 P2 管道发送数据?

或者也许有一种方法可以通过自己的管道以某种方式创建(为了清楚起见)“子通道”?

【问题讨论】:

    标签: nested netty pipeline multiplexing


    【解决方案1】:

    我在https://github.com/netty/netty/issues/8544添加了以下评论

    我有一个建议,如何在当前和旧版本的 netty 中实现这一点。

    基本思想是定义一个“前端”管道来处理真正的套接字和 I/O,包括编码/解码。然后,将为各种相关协议调用不同的“后端”管道(甚至对于应用层可以在单个连接上运行独立会话的协议,甚至是单独的“会话”)。因此,后端管道是特定于协议或会话/对话的,前端更通用,并且映射到下游的单个真实网络连接,并且知道如何从上游的多个后端通道中实例化、检索和选择。

    我在 Netty 中看到了两个潜在的抽象级别,其中前端和后端管道之间的区别可能是可能的:

    1. 最可行(也是重量级)的方法是为每个后端管道声明一个完整的其他 Bootstrap。这些后端引导程序必须绑定到一个自定义的“虚拟套接字”,该套接字实际上由“前端”网络管道支持。换句话说,虚拟套接字不直接映射到 TCP 连接或主机/端口,而是进一步区分端点(主机、端口和协议或会话),但它保持对单个特定“前端”的引用。 end' 调用它的通道/管道。

    2. 一个不太重要的选项可能是在现有引导程序中以某种方式实例化(以及存储和检索)新通道。我几乎还没有开始研究这是多么可行。必须首先回答以下问题(可能还有其他我没有想到的问题):

    • 是否可以在管道中实例化新通道,但将其添加到事件执行器中?
    • 后端通道是否应该在单独的事件执行器池中运行?
    • 如何从前端实例化、存储和检索后端通道实例
    • 后端通道仍必须使用与选项 1 相同的虚拟套接字概念
    • 渠道/渠道管道能否移交给其他渠道?
    • 这些后端通道能否写回调用它们的同一个前端通道?前端通道必须将回调(或对自身的引用)传递给后端通道。大概这个引用应该由虚拟套接字管理/持有。

    【讨论】:

      【解决方案2】:

      目前还不支持“嵌套管道”。它可能是 4.1.0 的一部分。现在您需要动态删除/添加处理程序。

      有关示例,请参见 [1]。

      [1]https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/portunification/PortUnificationServerHandler.java

      【讨论】:

      • 现在呢?仍然不支持?
      • 所以为了实现某种多路复用,我需要动态添加/删除处理程序?似乎引入了一些延迟......也许有更好的方法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      相关资源
      最近更新 更多