Netty 带重放解码器的大消息

Netty 带重放解码器的大消息,netty,Netty,我在两个Java进程之间建立了连接,双方都使用Netty。解码端使用ReplayDecoder并使用它来反序列化更复杂的消息类型 大多数信息都很小。然而,我今天发现了一个较大消息(~4MB)的性能问题,这种情况很少发生 我已经猜到了以下几点 消息不需要是4MB,我可以使它们更小 ReplayDecoder可能不是处理此类大型消息的最佳选择,因为它没有某种长度头来反复保存解析 除此之外,我不确定它为什么这么慢。我花了好几分钟把信息从一边传到另一边 写入操作如下所示 创建动态缓冲区 将整个消息

我在两个Java进程之间建立了连接,双方都使用Netty。解码端使用ReplayDecoder并使用它来反序列化更复杂的消息类型

大多数信息都很小。然而,我今天发现了一个较大消息(~4MB)的性能问题,这种情况很少发生

我已经猜到了以下几点

  • 消息不需要是4MB,我可以使它们更小
  • ReplayDecoder可能不是处理此类大型消息的最佳选择,因为它没有某种长度头来反复保存解析
除此之外,我不确定它为什么这么慢。我花了好几分钟把信息从一边传到另一边

写入操作如下所示

  • 创建动态缓冲区
  • 将整个消息写入缓冲区
  • 使用缓冲区调用channel.write()一次
这似乎相当快(观察未来何时完成)。消息大小约为4MB

从解码的角度看,我可以看到它每隔几秒钟就会碰到我的处理程序,在那里它试图解析一些东西、抛出、重放、等待更多的数据等等

然而,每次调用处理程序时(每秒左右),我只看到表明可用数据的缓冲区大小增加了50k左右。我希望缓冲区的填充速度比这个快得多

我在一个本地网络上,事实上同一台机器上的两个进程使用环回地址连接到网络的速度不应该是一个主要因素

这是预期的行为吗?是我的重复解析过程,这将阻止处理程序和任何序列化的处理程序运行,并可能像我预期的那样快速填充缓冲区

我使用的是Netty 3.1.1.GA(非常旧,如果有改进,可以升级测试)


我能提供的更多信息或需要进一步调试的地方请告诉我。

根据Java文档

“如果网络速度较慢且消息格式复杂,则性能可能会更差。解码器可能需要反复解码消息的同一部分。”

为了避免这种情况,您必须使用检查点保持解码状态


您可以从Java文档注释中获得更多信息

根据Java文档

“如果网络速度较慢且消息格式复杂,则性能可能会更差。解码器可能需要反复解码消息的同一部分。”

为了避免这种情况,您必须使用检查点保持解码状态


您可以从Java文档注释中获得更多信息

查看Netty中的
HttpMessageDecoder
源代码。您将发现如何处理大量内容。基本上,您可以按照Jestan的建议频繁调用
checkpoint()
,并生成较小的消息块。

查看Netty中的
HttpMessageDecoder
源代码。您将发现如何处理大量内容。基本上,您可以按照Jestan的建议频繁调用
checkpoint()
,并生成更小的消息块。

是的,我理解,但这是同一台机器上的两个进程(上面添加了更多细节),因此网络不应该像我看到的那样慢。@MikeQ您说过,您正在解码“更复杂的消息类型”,那么,您是否尝试过ReplayDecoder Java文档中提到的检查点?是的,我理解,但这是同一台机器上的两个进程(上面添加了更多细节),因此网络不应该像我看到的那样慢。@MikeQ您说过,您正在解码“更复杂的消息类型”,那么您是否尝试过Java文档中提到的检查点?