首页 > 其他分享 >Kafka事务实现原理

Kafka事务实现原理

时间:2024-09-01 22:24:30浏览次数:5  
标签:事务 Exactly 协调者 Kafka 消息 原理 Once

1 Kafka的事务 V.S RocketMQ

RocketMQ事务主要解决问题:确保执行本地事务和发消息这俩操作都成功/失败。RocketMQ还有事务反查机制兜底,更提高事务执行的成功率和数据一致性。

而Kafka事务,是为确保在一个事务中发送的多条消息,要么都成功,要么都失败。 这里的多条消息不一定在同一个topic和partition,可以是发往多个topic和partition的消息。当然,你可在Kafka事务执行过程中,加入本地事务,来实现和RocketMQ事务类似效果,但Kafka没有事务反查机制。

Kafka这种事务机制,单独使用场景不多。更多是配合Kafka幂等机制,实现Kafka的Exactly Once语义。这里Exactly Once和一般MQ服务水平的Exactly Once不同!

1.1 Exactly Once

一般MQ服务水平中的,指消息从Pro发送到Broker,Con再从Broker拉消息消费。这过程中,确保每条消息恰好传输一次,不重复、不丢弃。

1.2 At Least Once

包括Kafka在内的几个常见MQ,都只能做到At Least Once(至少一次),即保证消息不丢,但可能重复,达不到Exactly Once。

2 Kafka的Exactly Once

使用场景:解决流计算中,用Kafka作数据源,并将计算结果保存到Kafka。数据从Kafka的某topic中消费,在计算集群中计算,再把计算结果保存在Kafka的其他topic。

这样的过程中,保证每条消息都被恰好计算一次,确保计算结果正确。

2.1 案例

将所有订单消息保存在Kafka主题Order,在Flink集群中运行一个计算任务,统计每分钟的订单收入,然后把结果保存在另一个Kafka主题Income。

要保证计算结果准确,就要确保无论Kafka集群 or Flink集群中任何节点故障,每条消息都只能被计算一次,不能重复计算,否则计算结果就错。很重要的限制条件:数据须来自Kafka且计算结果都保存到Kafka,才可应用到Kafka的Excactly Once机制。

所以Kafka的Exactly Once是为解决在“读数据-计算-保存结果”的计算过程中,数据不重也不丢,并非一般MQ消息生产消费过程中的Exactly Once。

3 Kafka的事务实现

实现原理和RocketMQ事务差不多,都基于两阶段提交。为解决分布式事务,Kafka引入

3.1 事务协调者

在服务端协调整个事务。非独立进程,而是Broker进程的一部分,协调者和分区一样通过选举保证HA。

类似RocketMQ,Kafka集群也有一个特殊的用于记录事务日志的topic,该事务日志topic的实现和普通topic一样,里面记录数据类似“开启事务”“提交事务”这样的事务日志。日志topic同样也包含很多分区。

Kafka集群中,可存在多个协调者,每个协调者负责管理和使用事务日志中的几个分区。就是为能并行执行多个事务,提升性能。

3.2 Kafka事务实现流程

开启事务时,pro给协调者发请求开启事务,协调者在事务日志中记录下事务ID。

然后,pro发消息前,还要给协调者发请求,告知发送的消息属于哪个主题和分区,这个信息也会被协调者记录在事务日志。

接下来,pro就可像发送普通消息一样发事务消息,和RocketMQ不同在于:

  • RocketMQ把未提交的事务消息保存在特殊queue
  • 而Kafka在处理未提交的事务消息时,和普通消息一样,直接发给Broker,保存在这些消息对应的分区中,Kafka会在客户端的Con中,暂时过滤未提交的事务消息

消息发送完成后,pro给协调者发送提交或回滚事务的请求,由协调者来开始两阶段提交,完成事务:

  • 第一阶段,协调者把事务的状态设置为“预提交”,并写入事务日志。至此,事务实际上已经成功,无论接下来发生什么,事务最终都会被提交
  • 第二阶段,协调者在事务相关的所有分区中,都会写一条“事务结束”的特殊消息,当Kafka的消费者,也就是client,读到该事务结束的特殊消息后,就可把之前暂时过滤的那些未提交的事务消息,放行给业务代码消费
  • 最后,协调者记录最后一条事务日志,标识该事务已结束

3.3 事务执行时序图

3.4 准备阶段

生产者发消息给协调者开启事务,然后消息发送到每个分区上

3.5 提交阶段

生产者发消息给协调者提交事务,协调者给每个分区发一条“事务结束”的消息,完成分布式事务提交。

4 总结

Kafka基于两阶段提交来实现事务,利用特殊的主题中的队列和分区来记录事务日志。Kafka直接把消息放到对应业务分区中,配合客户端过滤,暂时屏蔽进行中的事务消息。

Kafka的事务则是用于实现它的Exactly Once机制,应用于实时计算的场景中。

参考

  • https://www.confluent.io/blog/transactions-apache-kafka/

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

本文由博客一文多发平台 OpenWrite 发布!

标签:事务,Exactly,协调者,Kafka,消息,原理,Once
From: https://blog.51cto.com/JavaEdge/11890435

相关文章

  • Java消息队列:RabbitMQ与Kafka的集成与应用
    Java消息队列:RabbitMQ与Kafka的集成与应用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代的分布式系统中,消息队列是实现系统间通信、解耦和提高可扩展性的重要组件。RabbitMQ和Kafka是两个广泛使用的消息队列系统,它们各有特点和优势。本文将介......
  • Kafka事务实现原理
    1Kafka的事务V.SRocketMQRocketMQ事务主要解决问题:确保执行本地事务和发消息这俩操作都成功/失败。RocketMQ还有事务反查机制兜底,更提高事务执行的成功率和数据一致性。而Kafka事务,是为确保在一个事务中发送的多条消息,要么都成功,要么都失败。这里的多条消息不一定在同一个to......
  • python threading 线程原理实验
    原理进程之间,编程语言可以不同,内存不共享。需要用socket/IRC/RPC等技术实现进程间通信线程之间,编程语言必须相同,内存共享。类变量self.xxx共享,分叉target的函数内变量private不共享。代码#!/usr/bin/env-Scondarun--live-stream-nbasepythonimportthreadingasthi......
  • “事事通”校园事务通知小程序的设计与实现-计算机毕业设计源码23598
    摘要 校园事务是大学生日常生活中不可或缺的一部分,包括课程查询、教务管理、校园活动信息等。然而,目前大多数学校在校园事务的通知发布和信息查询方面还依赖传统的官方网站和邮件通知,这种方式存在信息不及时、查找不方便等问题。本文旨在通过引入SpringBoot和Vue框架,结合云......
  • MySQL的索引原理及使用
    MySQL中的索引模型Mysql中的索引使用的数据结构一般为搜索树,这里的搜索树,一般使用B树,这里补一下数据结构中的B树结构;说B树之前,先顺一个前置的知识点,平衡二叉树;平衡二叉树二叉树应该都不陌生,大学数据结构的基本入门,二叉排序树是基于二叉树上多了个“有序”的概念,简单来说,即左<......
  • eureka原理与实践简单介绍
    目录@[TOC](目录)前言一、Eureka原理二、Eureka实践总结前言Eureka是Netflix开发的一个服务发现框架,广泛应用于微服务架构中。它通过提供服务的自动注册与发现机制,简化了服务间的依赖管理,提高了系统的灵活性和可扩展性。以下将从Eureka的原理和实践两个方面进行详细......
  • MySQL的索引原理及使用
    索引模型(基础数据结构)索引模型:哈希表、有序数组、搜索树,这里的模型是指索引的底层实现的基本数据结构,Mysql中不同的引擎对于索引的实现结构说的即是索引模型。 有序数组有序数组这个在数据结构中是最基础的结构,也是最简单的,对比理解的话就是我们编程中常用的数组、链表,它......
  • 可重复读隔离级别真的完全解决不可重复读问题了吗?读已提交隔离级别能避免不可重复读问
    一文带你搞懂MySQL事务的各个疑惑,不要再在脑子里一团浆糊啦!!事务的四大特性MySQL的三种日志事务的原子性是如何保证的?事务的隔离性是如何保证的?事务的持久性是如何保证的?数据库事务的隔离级别各隔离级别都各自解决了什么并发问题?什么是MVCC?读已提交和可重复读隔离级别实......
  • 转载-perf-深入探索 perf CPU Profiling 实现原理
    https://mazhen.tech/p/深入探索-perf-cpu-profiling-实现原理/深入探索perfCPUProfiling实现原理perf是什么perf是由Linux官方提供的系统性能分析工具。我们通常说的perf实际上包含两部分:perf命令,用户空间的应用程序perf_events,Linux内核中的一个子系统内......
  • 硬件工程师入门笔记---LDO原理和应用(来源--Trent带你学硬件)
    LDO原理LDO参数LDO手册解读 LDO设计要点及案例分析......