Netty 带重放解码器的大消息
我在两个Java进程之间建立了连接,双方都使用Netty。解码端使用ReplayDecoder并使用它来反序列化更复杂的消息类型 大多数信息都很小。然而,我今天发现了一个较大消息(~4MB)的性能问题,这种情况很少发生 我已经猜到了以下几点Netty 带重放解码器的大消息,netty,Netty,我在两个Java进程之间建立了连接,双方都使用Netty。解码端使用ReplayDecoder并使用它来反序列化更复杂的消息类型 大多数信息都很小。然而,我今天发现了一个较大消息(~4MB)的性能问题,这种情况很少发生 我已经猜到了以下几点 消息不需要是4MB,我可以使它们更小 ReplayDecoder可能不是处理此类大型消息的最佳选择,因为它没有某种长度头来反复保存解析 除此之外,我不确定它为什么这么慢。我花了好几分钟把信息从一边传到另一边 写入操作如下所示 创建动态缓冲区 将整个消息
- 消息不需要是4MB,我可以使它们更小
- ReplayDecoder可能不是处理此类大型消息的最佳选择,因为它没有某种长度头来反复保存解析
- 创建动态缓冲区
- 将整个消息写入缓冲区
- 使用缓冲区调用channel.write()一次
我能提供的更多信息或需要进一步调试的地方请告诉我。根据Java文档 “如果网络速度较慢且消息格式复杂,则性能可能会更差。解码器可能需要反复解码消息的同一部分。” 为了避免这种情况,您必须使用检查点保持解码状态
您可以从Java文档注释中获得更多信息 根据Java文档 “如果网络速度较慢且消息格式复杂,则性能可能会更差。解码器可能需要反复解码消息的同一部分。” 为了避免这种情况,您必须使用检查点保持解码状态
您可以从Java文档注释中获得更多信息 查看Netty中的
HttpMessageDecoder
源代码。您将发现如何处理大量内容。基本上,您可以按照Jestan的建议频繁调用checkpoint()
,并生成较小的消息块。查看Netty中的HttpMessageDecoder
源代码。您将发现如何处理大量内容。基本上,您可以按照Jestan的建议频繁调用checkpoint()
,并生成更小的消息块。是的,我理解,但这是同一台机器上的两个进程(上面添加了更多细节),因此网络不应该像我看到的那样慢。@MikeQ您说过,您正在解码“更复杂的消息类型”,那么,您是否尝试过ReplayDecoder Java文档中提到的检查点?是的,我理解,但这是同一台机器上的两个进程(上面添加了更多细节),因此网络不应该像我看到的那样慢。@MikeQ您说过,您正在解码“更复杂的消息类型”,那么您是否尝试过Java文档中提到的检查点?