通过 Netty 的 Channel.write() 发送的消息在开始发送到网络时是否保留其顺序?

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

我正在进行某种加密,这取决于通过 Netty 通道发送的消息的顺序。我期望的是,如果我在消息 B 之前将消息 A 写入通道,那么它们应该按照我将它们写入通道的顺序发送到远程套接字。那么我需要的案例是否已经得到了 Netty 的支持?

另一方面,Netty 的 Channel 接受并发写入调用,我怀疑我的要求是否已经得到满足。由于数据结构的当前状态,我今天必须在有状态(每个通道一个)编码器上进行同步。但是我仍然不确定过滤器内同步是否能满足我的需求。

netty
3个回答
6
投票

是的,消息将以与您调用 Channel.write(..) 相同的顺序传输。在这里您无需担心。


3
投票

此问题获取答案。 (谢谢

Scottmitch@github
)。

Netty可以在以下情况下提供“排序”:

  1. 您正在从
    EventLoop
    线程执行所有写入操作;或
  2. 您没有从
    EventLoop
    线程进行任何写入(即所有写入都在其他线程中完成)。

记住这一点很微妙但很重要,因为它可能会导致痛苦的错误。如果一些

channel.write()
调用来自应用程序线程,而一些来自
EventLoop
,那么从应用程序的角度来看,写入可能会出现乱序。查看有关链接问题的更多详细信息。

这个问题似乎是 Netty 写入排序的热门搜索结果,因此想确保它提到了这个重要的警告。


0
投票

以上答案是错误的,至少对于 Netty >= 4.1.96 而言。

在内部,写入任务被转发到下一个可用的执行器线程(请参阅 AbstractChannelHandlerContext.write() 方法)。

您可以通过将 EventLoopGroup 的最大线程数设置为 1 来防止此行为。

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