我正在使用Netty编写一个消息传递系统。在第一条消息成功发送之前,我无法发送后续消息(有时会等待对等端点的发送响应)。我看到建议不要在ChannelHandlerAdapter中等待未来的完成,因为它会占用EventLoop中的cpu周期。
那么问题来了——我如何在不等待ChannelHandlerAdapter EventLoop中的第一次发送完成的情况下实现这种顺序逻辑,或者避免应用程序线程和事件循环线程之间的线程上下文切换?
a) 如果我在ChannelHandlerAdapter中等待ChannelFuture完成,它会占用cpu周期。如果我在向写入的channelFuture注册的侦听器中发送后续消息,通过使侦听器中的应用程序逻辑向该通道的ChanelFuture注册,这也会占用EventLoop中的cpu周期。
或者,
b) 如果我在应用程序线程中使用通道并写入该通道,则会有一个从应用程序线程到通道线程的线程上下文切换。在这个用例中,有没有一种方法可以避免这种线程上下文切换?
有更好的方法吗?
理想情况下,如果您的应用程序是完全异步的,那么您可以在不离开I/O线程的情况下完成所有操作。
这通常需要:
- 你对处理期货很熟悉。异步操作通常返回future或需要回调作为参数。您必须在将来添加一个侦听器,或者指定一个适当的回调实现,以便在完成请求的异步操作时执行您想要执行的操作。有了正确的编码,以后就不需要调用
future.await()
或类似的阻塞调用了 - 您使用的库是异步的