Aeron订阅者术语轮换时未接收消息是否丢失及相关场景问询
Aeron 3术语(Active/Dirty/Clean)机制常见问题解答
问题1:若Aeron订阅者尚未接收某条消息,对应的术语已完成轮换,该消息是否会丢失?
- 会丢失。在3术语机制中,术语完成轮换进入Clean状态后,其内存块会被发布端回收复用。如果订阅者在术语完成轮换(即从Dirty转为Clean)前未读取这条消息,后续将无法再访问该术语的内容,消息直接丢失。
- 补充说明:术语从Active转Dirty是发布端写完当前术语后的常规操作;而从Dirty转Clean的前提是所有订阅者都确认已读取完该术语的全部消息。但如果订阅者处理延迟过高,导致3个术语全部被占用(Active+Dirty各一个,第三个也即将被写满),发布端会强制将最早的Dirty术语标记为Clean并复用,此时该术语中未被读取的消息会直接丢失。
问题2:若某术语的最后一条消息未被订阅者接收,但订阅者已接收下一术语的后续消息,此时术语会完成轮换吗?该未接收消息会丢失吗?还是只要在所属术语被垃圾回收前接收即可?
- 术语轮换判定:不会完成轮换。术语从Dirty到Clean的切换,只取决于订阅者是否确认读取完该术语的全部消息,和订阅者是否接收下一术语的消息无关。哪怕订阅者已经开始消费下一个术语的内容,只要当前Dirty术语还有未确认的消息,它就会保持Dirty状态,不会被轮换为Clean。
- 消息丢失风险:只要该术语仍处于Dirty状态,订阅者可以回溯读取这条未接收的消息;只有当该术语被标记为Clean并被回收后,这条消息才会丢失。
- 特殊场景:如果发布端因术语耗尽(3个术语全部被占用)强制回收该Dirty术语,即使订阅者还没读取这条消息,消息也会丢失——这种情况多发生在订阅者处理速度远落后于发布端的场景下。
内容的提问来源于stack exchange,提问作者starbucks pete
相关产品推荐
相关产品推荐

