Netty-应用程序顺序逻辑以及如何避免上下文切换



我正在使用Netty编写一个消息传递系统。在第一条消息成功发送之前,我无法发送后续消息(有时会等待对等端点的发送响应)。我看到建议不要在ChannelHandlerAdapter中等待未来的完成,因为它会占用EventLoop中的cpu周期。

那么问题来了——我如何在不等待ChannelHandlerAdapter EventLoop中的第一次发送完成的情况下实现这种顺序逻辑,或者避免应用程序线程和事件循环线程之间的线程上下文切换?

a) 如果我在ChannelHandlerAdapter中等待ChannelFuture完成,它会占用cpu周期。如果我在向写入的channelFuture注册的侦听器中发送后续消息,通过使侦听器中的应用程序逻辑向该通道的ChanelFuture注册,这也会占用EventLoop中的cpu周期。

或者,

b) 如果我在应用程序线程中使用通道并写入该通道,则会有一个从应用程序线程到通道线程的线程上下文切换。在这个用例中,有没有一种方法可以避免这种线程上下文切换?

有更好的方法吗?

理想情况下,如果您的应用程序是完全异步的,那么您可以在不离开I/O线程的情况下完成所有操作。

这通常需要:

  • 你对处理期货很熟悉。异步操作通常返回future或需要回调作为参数。您必须在将来添加一个侦听器,或者指定一个适当的回调实现,以便在完成请求的异步操作时执行您想要执行的操作。有了正确的编码,以后就不需要调用future.await()或类似的阻塞调用了
  • 您使用的库是异步的

最新更新