关于mq食物以什么样的方式解决了什么样的问题可以参考这里:

https://www.jianshu.com/p/cc5c10221aa1

上文中示例基于mq版本较低较新的版本中TransactionListener替换掉了TransactionCheckListener,整个流程有了一些改变,但还是小事务+异步的模式 不再详述

具体的实现中:

在本地事务执行之前会先send一个prepare消息。之后执行本地事务,带着一个transactionId。

最后在endTransaction里更新事务消息的状态:

=====================

org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl#sendKernelImpl:

在消息发送之前,如果消息为prepare类型,则设置消息标准为prepare消息类型,方便消息服务期正确识别事务类型的消息。

========================

broker收到消息在sendMessageProcessor中:

如果是prepare消息执行prepareMessage方法。

事务消息存储在在未提交之前并不会存入消息原有主题,自然也不会被消费者消费。既然变更了主题,rocketmq通常会采用定时任务(单独的线程)去消费该主题,然后将该消息在满足特定条件下回复消息主题,进而被消费者消费。它与rocketmq定时消息的处理过程如出一辙。

=======================

endTransaction

Broker服务端的结束事务处理器为:EndTransactionProcessor。

如果结束事务动作为提交事务,则执行提交事务逻辑,其关键实现如下:

1.首先从结束事务请求命令中获取消息的物理偏移量(commitOffset)

2.然后回复消息的主题,消费队列,构建新的消息对象

3.然后将消息再次存储在commitlog文件中,此时的消息主题则为业务方发送的消息,将被转发到对应的消息消费队列,供消息消费者消费。

4.消息存储后,删除prepare消息,其实现方法并不是真正的删除,而是将prepare消息存储到RMQ_SYS_TRANS_OP_HALF_TOPIC主题中,表示该事务消息已经处理过,为未处理的事务回查提供查找依据。

事务回滚与提交的唯一差别是无需将消息恢复原主题,直接删除prepare消息即可。

==================

事务回查

执行完贝蒂事务返回本地事务状态为UN_KNOW时,结束事务时将不做任何处理,而是通过事务状态定时回查,以期得到发送端明确的事务操作(提交或回滚事务)

mq通过TransactionalMessageCheckService定时检查RMQ_SYS_TRANS_HALF_TOPIC中的消息,回查消息的事务状态。检测频率默认为1分钟。

重点看下其check方法:

获取RMQ_SYS_TRANS_HALF_TOPIC中的所有消息依次处理。

获取已处理消息的消息消费队列:RMQ_SYS_TRANS_OP_HALF_TOPIC。

处理已处理过的消息,这些消息不再发送事务状态回查请求。

经过一系列check之后

如果需要发送事务状态回查消息,则先将消息再次发送到RMQ_SYS_TRANS_HALF_TOPIC主题中(很奇怪不是吗)处于性能考虑。简化prepare消息队列的消息消费进度处理。后面回查的时候成功和失败进度都会前进,失败的话commitlog中的消息会再次回查,成功的话,op配合map会防止重复回查

【mq读书笔记】mq事务消息的更多相关文章

  1. 【mq读书笔记】顺序消息

    注意异常情况导致整个消费无限重试 阻塞消费 mq支持局部消息顺序消费,可以确保同一个消息消费队列中的消息被顺序消费.看下针对顺序消息在整个消费过程中做的调整: 队列负载: DefaultMQPushC ...

  2. 【mq读书笔记】定时消息

    mq不支持任意的时间京都,如果要支持,不可避免的需要在Broker层做消息排序,加上持久化方面的考量,将不可避免地带来巨大的性能消耗,所以rocketMQ只支持特定级别的延迟消息. 在Broker短通 ...

  3. 【mq读书笔记】消息队列负载与重新分配(分配 新队列pullRequest入队)

    回顾PullMessageService#run: 如果队列总没有PullRequest对象,线程将阻塞. 围绕PullRequest有2个问题: 1.PullRequest对象在什么时候创建并加入p ...

  4. 【mq读书笔记】消费进度管理

    从前2节可以看到,一次消费后消息会从ProcessQueue处理队列中移除该批消息,返回ProcessQueue最小偏移量,并存入消息进度表中.那消息进度文件存储在哪合适呢? 广播模式:同一个消费组的 ...

  5. 【mq读书笔记】消息消费队列和索引文件的更新

    ConsumeQueue,IndexFile需要及时更新,否则无法及时被消费,根据消息属性查找消息也会出现较大延迟. mq通过开启一个线程ReputMessageService来准时转发commitL ...

  6. 【mq读书笔记】消息过滤机制

    mq支持表达式过滤和类过滤两种模式,其中表达式又分为TAG和SQL92.类过滤模式允许提交一个过滤类到FilterServer,消息消费者从FilterServer拉取消息,消息经过FilterSer ...

  7. 【mq读书笔记】消息确认(失败消息,定时队列重新消费)

    接上文的集群模式,监听器返回RECONSUME_LATER,需要将将这些消息发送给Broker延迟消息.如果发送ack消息失败,将延迟5s后提交线程池进行消费. 入口:ConsumeMessageCo ...

  8. 【mq读书笔记】消息消费过程(钩子 失败重试 消费偏移记录)

    在https://www.cnblogs.com/lccsblog/p/12249265.html中,PullMessageService负责对消息队列进行消息拉取,从远端服务器拉取消息后将消息存入P ...

  9. 【mq读书笔记】消息拉取长轮训机制(Broker端)

    RocketMQ并没有真正实现推模式,而是消费者主动想消息服务器拉取消息,推模式是循环向消息服务端发送消息拉取请求. 如果消息消费者向RocketMQ发送消息拉取时,消息未到达消费队列: 如果不启用长 ...

随机推荐

  1. Hadoop基础------>MR框架-->WordCount

    认识Mapreduce Mapreduce编程思想 Mapreduce执行流程 java版本WordCount实例 1. 简介: Mapreduce源于Google一遍论文,是谷歌Mapreduce的 ...

  2. Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号

    Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...

  3. 【Luogu】P6232 [eJOI2019]挂架 题解

    这道题跟CSP/S 2019 D1T1有点像. 我们先来模拟一下 \(n=4\) 的情况, 不难得出,最后的衣架挂钩顺序: 下标: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...

  4. 843. Guess the Word —— weekly contest 86

    题目链接:https://leetcode.com/problems/guess-the-word/description/ 占坑 据说要用启发式算法,可参考下述答案进行学习:https://leet ...

  5. C++常见的面试题目整理

    本文列出C++面试中经常遇到的一些问题,都是一些常见的面试考点,如果后续遇到其他常见面试问题还会再次更新.希望对近期参加面试的同学有一些帮助.先后顺序与问题的重要性无关,查看的时候,最好是全面了解一下 ...

  6. 依赖注入DI(IOC)容器快速入门

    1.什么是IOC IOC是一种设计模式,全程控制翻转或叫依赖注入.更详细介绍见http://martinfowler.com/articles/injection.html 2.为什么用IOC 我们通 ...

  7. kafka生产者数据可靠性保证

    为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(ackn ...

  8. Docker安装Oracle11g

    为什么使用docker安装oracle,因为自己搭建配置的话可能时间太久太繁琐等等原因,也因为docker实在太方便了 本文主要是使用docker-compose安装Oracle 11g,因为使用do ...

  9. switch,case语句易误区

    switch case 语句语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可 ...

  10. 【涂鸦物联网足迹】涂鸦云平台消息服务—顺带Pulsar简单介绍

    前序系列文章>>> [涂鸦物联网足迹]涂鸦云平台标准指令集 开放消息平台主要通过 Pulsar 主动推送各种事件数据给外部合作伙伴,以满足合作伙伴对消息实时性和消息持久化的要求. 一 ...