【问题标题】:How to send event to other handler in netty?如何将事件发送到 netty 中的其他处理程序?
【发布时间】:2012-01-04 10:57:28
【问题描述】:

与 boost.asio 不同,netty 没有 read-like 方法。以下情况不方便: 管理节点管理一些节点,客户端连接到管理节点以检索驻留在节点中的信息。管理节点收到客户端请求后,向对应节点发送请求,等待节点响应。当节点响应和管理节点在其“messageReceived”函数中获取信息时,如何将信息发送到属于客户端的通道?它需要向客户端请求的Handler发送一个事件。

1.获取客户端请求

2.向节点发送请求

3.读取该节点的响应

4.向客户端发送响应

所有这 4 步都可以在 boost.asio 中的一个函数中完成。但是netty不支持step3,read函数是独立的,用户不能直接调用。唯一的方法是在管理节点和节点之间的处理程序中收到响应后,将其重新发送到管理节点和客户端之间的处理程序。 执行此操作的典型方法是什么?

【问题讨论】:

    标签: netty


    【解决方案1】:

    Netty 使用异步 i/o 操作,因此第 2 步是异步的,是的,在第 3 步之前你不能阻塞。

    在大多数情况下,(不是特定于 Netty)你可以做的是:
    1) 为您的请求提供唯一 ID,节点应该在其响应中回显唯一 ID。
    2) 将它们存储在哈希图中,键作为请求的唯一 ID,通道(管理节点和客户端之间)作为其值
    3) 当你在管理节点中收到节点的响应时,你可以使用唯一的id从hashmap中查找通道,然后将响应发送给客户端。

    您还可以查看 Bruno de carvalho 的 Netty load balancer,这将为您提供对同一问题的另一个视角。他使用隧道来达到同样的效果。

    【讨论】:

    • 我将客户端的频道ID放入包从管理节点发送到节点,所以当节点响应时,我知道我应该使用哪个客户端频道。
    • 我想有一些实用程序或典型的技巧可以解决这个问题。顺便说一句,我觉得 netty 的设计理念是某种限制。事实上,我说的 4 个步骤也可以异步完成,asio 是通过完整的回调处理程序链来完成的。
    • 在 netty 中,channel.write() 将为您提供一个 ChannelFuture。您可以将 FutureListener 添加到此未来对象,即回调,因此您在 Netty 中也有类似的功能。所以你可以等待第 2 步,或者在它的最后做一些逻辑,但是第 3 步来自客户端,所以这个回调将无济于事。
    • 在 asio 中,我可以在 step2 中添加一个 callback2,这个 callback2 的工作是从节点异步读取(步骤 3)。并在 step3 中添加一个 callback3(回调已被链接),它执行 step4 工作。关键是异步读取不允许用户在netty中调用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多