我试图找到处理 akka Payloadsizeexceeded 异常。但是由于没有办法处理它,我想知道正在传递的消息的大小。为此,我想计算消息的大小,这个大小需要给出传递的集群消息的确切大小,而不仅仅是我请求中的 json 大小。有没有办法知道这个尺寸?
例如,我的 json 大小是 31998 字节,但是当消息在参与者之间传递时,会发生一些编码,传递的消息的实际大小增加到 32778。我怎么知道这个最终的消息大小?
当你在 Actor 系统之间发送消息时,消息有效负载周围有一个信封,其中包含接收者 Actor 引用、发送者 Actor 引用、标识要使用的序列化程序以及其他一些内容。其中一些包含字符串(actor 路径、actor 系统名称、节点主机名),这会影响到很难准确说出开销有多大。
我建议您添加测试覆盖率,在预期的参与者之间远程发送消息,然后考虑到在决定接受多大的有效负载时主机名可能会有所不同,所以要保守。
请注意,如果您需要比默认 128k 大很多倍的有效负载,最好考虑将有效负载拆分为更小的消息,或者使用某种形式的侧通道来传输数据,因为它会导致其他较小的行头阻塞诸如远程处理心跳之类的消息使远程处理和集群不太稳定。
使用新的远程处理子系统,它还不稳定/生产就绪,它支持大消息的单独通道,另外还压缩actor refs,以便经常远程通信的actor 将通过缓存中的索引而不是完整的索引来识别序列化的演员参考。