如何保证三个消息文件的最终一致性。

Posted lccsblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何保证三个消息文件的最终一致性。相关的知识,希望对你有一定的参考价值。

考虑转发任务未成功执行,此时消息服务器Broker宕机,导致commitlog,consumeQueue,IndexFile文件数据不一致。

看一下mq关于存储文件的加载流程:

public boolean load() {
        boolean result = true;

        try {
            boolean lastExitOK = !this.isTempFileExist();
            log.info("last shutdown {}", lastExitOK ? "normally" : "abnormally");

            if (null != scheduleMessageService) {
                result = result && this.scheduleMessageService.load();
            }

            // load Commit Log
            result = result && this.commitLog.load();

            // load Consume Queue
            result = result && this.loadConsumeQueue();

            if (result) {
                this.storeCheckpoint =
                    new StoreCheckpoint(StorePathConfigHelper.getStoreCheckpoint(this.messageStoreConfig.getStorePathRootDir()));

                this.indexService.load(lastExitOK);

                this.recover(lastExitOK);

                log.info("load over, and the max phy offset = {}", this.getMaxPhyOffset());
            }
        } catch (Exception e) {
            log.error("load exception", e);
            result = false;
        }

        if (!result) {
            this.allocateMappedFileService.shutdown();
        }

        return result;
    }

技术图片

 

判断上一次退出是否正常,broker在启动时创建abort文件,在退出时通过注册jvm钩子函数删除abort文件。如果下一次启动时存在abort文件。说明Broker是异常退出的。

 

以上是关于如何保证三个消息文件的最终一致性。的主要内容,如果未能解决你的问题,请参考以下文章

保证MQ消息传递的一致性

如何保证分布式系统的消息最终一致性

分布式事务解决方案-柔性事务(可靠消息保证最终一致性)

场景应用:分布式系统如何保证数据的最终一致性?

场景应用:分布式系统如何保证数据的最终一致性?

微服务分布式事务