Netty嵌套管道/多路复用

6

我对Netty还比较陌生,但是在Netty 4.x中,如果多个协议(例如P1和P2)被封装在另一个协议中,应该如何实现呢?

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

有没有办法创建嵌套管道,使得主管道为 decoder<->encoder<->muxer<->demuxer 并且根据 demuxer 的决定将数据沿着 P1 或 P2 管道发送?或者也许有一种方式可以创建“子通道”,并且每个子通道都有自己的管道(为了清晰起见)?
2个回答

2

现在怎么样?还是不支持吗? - St.Antario
那么为了实现某种复用,我需要动态添加/删除处理程序吗?似乎会引入一些延迟...也许有更好的方法? - St.Antario

0
我在https://github.com/netty/netty/issues/8544上添加了以下评论:
我有一个建议,关于如何在当前和旧版本的netty中实现这个功能。
基本想法是定义一个单独的“前端”管道来处理真正的套接字和I/O操作,包括编码/解码。然后,不同的“后端”管道将被调用来处理各种相关协议(甚至对于应用层可以在单个连接上运行独立会话的协议,也可以使用单独的“会话”)。因此,后端管道是协议或会话/对话特定的,而前端更通用,并且映射到下游的单个真实网络连接,并知道如何实例化、检索和选择多个上游的后端通道。
我认为Netty中存在两个潜在的抽象层次,可以在这两个层次之间实现前端和后端管道的区分。
  1. 最可行(且较为复杂)的方法是为每个后端流水线声明一个全新的Bootstrap。这些后端引导程序将需要绑定到自定义的“虚拟套接字”,其实际由“前端”netty管道支持。换句话说,虚拟套接字并不直接映射到TCP连接或主机/端口,而是进一步的端点区分(主机、端口和协议或会话),但它保留了对调用它的单个特定“前端”通道/管道的引用。

  2. 一种较为轻量级的选择可能是在现有的引导程序中以某种方式实例化(并存储和检索)新的通道。我几乎还没有开始研究这是否可行。首先必须回答以下问题(以及可能我没有考虑过的其他问题):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接