为什么要在 Netty 中将 InboundHandler 和 OutboundHandler 都插入到同一个管道中

问题描述 投票:0回答:1

我是Netty的初学者,对管道的设计感到困惑。

Netty 将 InBoundHandler 和 OutboundHandler 插入同一管道中。由于方向不匹配,消息会跳过一些处理程序。

A <---  InboundHandler ---  OutboundHandler  ----->  B

以我肤浅的观点,为什么不分别为入站和出站创建两个管道。我认为这样更清晰、更专注,一个方向一个管道。

A --> InboundHandler  --> B
  <-- OutboundHandler <-- 
netty
1个回答
0
投票

2 个管道的问题是,当入站处理程序想要写回某些内容时,您不知道在哪一点插入消息。您无法查看消息的类型,因为多个阶段可能使用字节缓冲区

以SMTP协议为例。从更高的层面来看,您只想将一个“请求”写入管道。使用 SMTP,您的管道可能包括

SMTPDecoder
SMTPEncoder
SMTPAggegrator

从更高的层面来看,您只是想发送邮件请求。

现在从右向左弹跳,

SMTPAggegrator
现在看到有一封电子邮件,它会等到服务器准备好,然后写入(发送到管道中的左侧)第一个数据包来识别自己。一旦收到有效响应,它就会发送另一个数据包启动 TLS。编码时,这会指示 SMTP 解码器准备好注入 SSL 处理程序,并在收到 SSL 已准备就绪的确认后自行注入。然后进行更多的往返,最后一个数据包一直到达管道的右侧,即来自聚合器的成功发送电子邮件响应。

您也可以在其他流程中看到这一点,内层处理诸如 ping 请求和发送 pong 之类的事情,而不会打扰右侧的层。

将 Netty 管道视为 游泳线图,其中左侧是网络层,右侧是程序

© www.soinside.com 2019 - 2024. All rights reserved.