Netty中如何向其他处理器发送事件?

3
与boost.asio不同,netty没有类似于read的方法,在以下情况中会变得不方便: 一个管理节点负责管理一些节点,客户端连接到管理节点以检索驻留在节点中的信息。当管理节点接收到客户端请求时,它会向相应的节点发送一个请求并等待节点响应。当节点响应并且管理节点在其“messageReceived”函数中获取信息时,如何将信息发送到属于客户端的通道?需要向客户端请求的处理程序发送一个事件。
1.获取客户端请求
2.向节点发送请求
3.读取该节点的响应
4.将响应发送给客户端
所有这四个步骤可以在boost.asio中的一个函数中完成。但是netty不支持第三步,读取函数是独立的,用户无法直接调用它。唯一的方法是在管理节点和节点之间的处理程序中接收响应后,重新将其发送到管理节点和客户端之间的处理程序中。这样做的典型方式是什么?
1个回答

3
Netty使用异步I/O操作,因此步骤2是异步的,而且是的,你不能阻塞直到获得步骤3。
在大多数情况下(不特定于Netty),你可以这样做:
1)为你的请求提供唯一的ID,节点应该在它们的响应中回显唯一的ID。
2)将它们存储在哈希映射中,其中键为请求的唯一ID,值为通道(在管理节点和客户端之间)。
3)当你在管理节点接收到来自节点的响应时,你可以使用唯一的ID从哈希映射中查找通道,然后将响应发送给客户端。
你也可以看一下Bruno de carvalho的Netty负载均衡器,它会给你另一个解决方案的角度。他使用隧道技术来实现相同的效果。

我将客户端的频道ID放入从管理节点发送到节点的数据包中,因此当节点响应时,我知道应该使用哪个客户端频道。 - jean
我想可能有一些工具或典型的技巧可以解决这个问题。顺便说一下,我觉得Netty的设计哲学有点限制。实际上,我所说的4个步骤也可以异步完成,asio通过完整回调处理程序链来完成它。 - jean
在Netty中,channel.write()将为您提供一个ChannelFuture。您可以向此future对象添加FutureListener,即回调函数,因此您在Netty中也具有类似的功能。因此,您可以等待步骤2完成,或在其结束时执行一些逻辑,但步骤3来自客户端,因此此回调将无法帮助您。 - Abe
在asio中,我可以在步骤2中添加一个回调2,这个回调2的工作是从节点(步骤3)异步读取。并在步骤3中添加一个回调3(回调已经链接),它执行步骤4的工作。关键是异步读取不允许用户在netty中调用。 - jean

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