(关于增强的讨论)在SYNC_MASTER和SYNC_flush设置中的刷新和从复制操作之后,应将消

在阅读有关consumerQueue的源代码时,我发现recommitMessageService依赖commitLog.getMaxOffset()将消息附加到consumer队列。但是,commitLog.getMaxOffset()的值可能会在消息实际刷新到磁盘或由从属服务器复制之前发生更改。那么,消费者是否有可能看到从属服务器尚未刷新和复制的消息?

核心冲突在于,recommitMessageService()使用commitedOffset从commitLog获取数据。但是,CommitRealTimeService()会在另一个线程中定期更新commitedOffset。在另一个线程中还设置了服务等待刷新和从属复制。这些线程之间缺乏同步。因此,consumerQueue可能只有一条消息,即使在SYNC_MASTER和SYNC_FLUSH设置中也没有写入磁盘和从机。

我检查了ha服务和handleDiskFlush的逻辑是在更改commitLog的maxOffset之后发生的,并且repeatMessage服务与这些逻辑是并发的。我错过什么了吗?

原提问者GitHub用户saharaheart

展开
收起
芬奇福贵 2023-05-26 11:03:53 96 分享 版权
1 条回答
写回答
取消 提交回答
  • org.apache.rocketmq.store.CommitLog#asyncPutMessages 没有看到你说的代码

    回答20.png

    原回答者GitHub用户panzhi33

    2023-05-26 17:23:01
    赞同 展开评论
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

还有其他疑问?
咨询AI助理