Aeron publication突发停止消息传输及snd-lmt、sub-pos参数疑问
问题解答
1. snd-lmt过小阻碍传输的判断是否正确
判断完全正确。从给出的AeronStat指标可以明确验证:
- 发布端写入位置
pub-pos已经达到8,452,864,说明上层业务已经把大量数据写入了Aeron的发布缓冲区 - 发送端实际发出位置
snd-pos仅为130,496,和动态发送上限snd-lmt的131,072几乎齐平,说明发送端已经触达发送阈值,无法继续推送后续数据,直接导致数据流停止收发。
2. 如何调整snd-lmt相关限制
snd-lmt是Aeron内部动态计算的阈值,没有直接的静态配置参数,它的上限由两个核心因素决定,你可以根据根因调整对应配置:
- 接收端接收窗口大小:如果是窗口容量不足导致的限制,可以在订阅端的channel URI中增加
rcv-window参数调整,示例如下:
上述配置将接收窗口调整为2MB,可扩大发送端的动态阈值上限。aeron:udp?endpoint=localhost:40100|rcv-window=2097152 - 订阅者消费进度:Aeron默认会保证所有订阅者都能收到数据,因此发送端的上限不会超过最慢订阅者的消费进度,这种情况调整窗口无效,需要优化慢订阅者的消费逻辑。
你的场景中问题根源是存在未消费的订阅者,优先解决订阅者消费问题即可恢复传输。
3. 同channel下两条sub-pos条目的含义
sub-pos条目冒号后紧跟的数字是订阅者的注册ID,两条记录代表同一个channel+stream下存在两个独立的订阅者实例:
- 注册ID为8的订阅者消费正常,消费进度130,496和接收端的
rcv-pos完全一致 - 注册ID为2的订阅者完全没有消费数据,进度停留在0,这就是导致
snd-lmt无法上涨、数据流卡住的根本原因:Aeron需要等待该订阅者消费数据,因此限制了发送端的最大发送位置,整个流被这个异常卡住的订阅者拖停。
内容的提问来源于stack exchange,提问作者denisxor
相关产品推荐
相关产品推荐

