25 | RocketMQ与Kafka中如何实现事务?
该思维导图由 AI 生成,仅供参考
RocketMQ 的事务是如何实现的?
- 深入了解
- 翻译
- 解释
- 总结
RocketMQ和Kafka是两种流行的消息中间件,它们都支持事务消息。本文深入解析了RocketMQ事务消息的实现细节,包括事务消息的发送、本地事务执行、事务反查以及Broker端的处理流程。通过对RocketMQ事务消息的工作原理和实现机制进行详细介绍,读者可以深入了解RocketMQ事务消息的特点和使用方法,为使用和定制RocketMQ提供了重要参考。 Kafka的事务机制解决的是在一个事务中发送的多条消息要么都成功,要么都失败的问题。它基于两阶段提交来实现事务,利用了特殊的主题中的队列和分区来记录事务日志。不同于RocketMQ,Kafka直接将事务消息放到对应的业务分区中,配合客户端过滤来暂时屏蔽进行中的事务消息。Kafka的事务适用于实现其Exactly Once机制,主要应用于实时计算的场景中。 总的来说,本文通过对RocketMQ和Kafka事务消息的实现细节进行深入分析,帮助读者了解了它们的工作原理和实现机制,以及它们在不同场景下的适用性。这对于从事消息中间件开发或使用的技术人员来说,是一份重要的参考资料。
《消息队列高手课》,新⼈⾸单¥59
全部留言(21)
- 最新
- 精选
- 丁小明也就是说其实kafka的Exactly Once模式,是kafka的consumer通过PID去实现了一个幂等操作,原理上来说是和at last once我们业务自己通过其他唯一ID实现幂等是一样的效果,并不是正真的只传输到客户端一次,而是重复传输实现了幂等。
作者回复: 是这样的。
2020-05-0823 - ξ!老师,如果本地事务是有返回值的话可不可以先执行本地事务如果有异常就抛出,再去执行发送消息,因为现在这么写获取不到执行完本地事务的结果呀
作者回复: 考虑这种情况: 1. 客户端提交了本地事务; 2. 本地事务在数据库执行成功了。 3. 这个时候客户端宕机了; 这种情况下,就没法保证一致性了。
2020-05-13212 - 二明儿老师好,请教个问题,kafka consumer将事务未提交的消息 在客户端过滤后不放行给业务代码消费,如果这样如果有大量未提交的消息对于客户端端内存会不会有影响?如果这个时候客户端重启或者发生reblance,offset已经提交会不会导致消息丢失?
作者回复: 大量未提交消息对客户端内存影响不大,因为Kafka客户端有一个固定大小的buffer用来保存拉取的消息。 只要你遵循:先执行消费业务逻辑,再提交,这样的原则。 即使客户端重启或者Rebalance,也不会丢消息。
2020-04-1027 - weilai查好像很多博客都说阿里已经把RocketMQ的这个反查接口给干掉了?老师,是这样吗?遇到这种问题,您是怎么找到答案的?
作者回复: 以官网文档和代码为准吧,至少目前的版本是没有变化的。 https://rocketmq.apache.org/docs/transaction-example/
2019-10-2426 - jack老师,如果仅仅把kafka作为数据源,流计算的结果保存到了其他数据库中,是不是就用不到kafka的事务了呢?
作者回复: 是这样的
2019-10-026 - miniluo老师,有个疑问:文中说到rocketmq#checkLocalTransaction这个方法反查到可能本地事务还在提交中就返回了unknow,那后续呢?还会通过定时轮询检查?求解,谢谢
作者回复: 会一直定时轮询,直到有结果或者超时。
2019-09-2146 - 不惑ing' Kafka 的事务则是用于实现它的 Exactly Once 机制,应用于实时计算的场景中。'这句话的意思理解为kafka的事务针对本地事务和发消息一致性没有rocketmq好,但是也可以用,这样理解对吗?
作者回复: 可以这么理解,Kafka没有RocketMQ的事务反查补偿机制。
2019-10-055 - A9请问老师,失败的半消息也是在commit log中存储着吧。如果失败的事务消息存储过多,会不会导致在读取commit log时频繁触发缺页?
作者回复: 一般来说不会,因为如果是已经关闭的事务,就不会再去读它对应的半消息了。 由于事务的超时机制存在,一般来说,活动的事务的日志大多都在commit log的尾部。
2019-10-273 - lmtookafka的第二阶段,事务协调者发送给每个分区的事务结束的消息,每个分区是怎么处理这个事务结束的消息的?这个事务结束的消息保存到哪儿了?是不是消费者挂机重启之后,事务结束的消息就没了?
作者回复: 事务结束消息就是一条特殊的消息,和普通消息一样保存在分区中。同普通消息一样,事务结束消息只要不被删除,就会一直存在。
2019-09-233 - jian请问老师,这里说“消息发送完成后,生产者给协调者发送提交或回滚事务的请求,由协调者来开始两阶段提交,完成事务。第一阶段,协调者把事务的状态设置为“预提交”,并写入事务日志。到这里,实际上事务已经成功了,无论接下来发生什么情况,事务最终都会被提交。”假如协调者执行完第一阶段之后还没有执行第二阶段,这时候机器宕机或者进程被KILL掉了,是不是重启之后会继续执行第二阶段呢?
作者回复: 是这样的。
2020-07-072