How transactions work?
必须先了解以下几个事务的核心概念,才能更好的理解事务的运行原理。
事务协调器(TC)是运行在 Pulsar Broker 中的一个模块。
它维护事务的整个生命周期,并防止事务进入错误状态。
它处理事务超时,并确保事务在事务超时后中止。
事务日志
所有事务元数据都保存在事务日志中。 事务日志由 Pulsar 主题记录。 如果事务协调器崩溃,它可以从事务日志恢复事务元数据。
事务日志存储事务状态,而不是事务中的实际消息(实际消息存储在实际的主题分区中)。
事务缓存
向事务内的主题分区生成的消息存储在该主题分区的事务缓冲区(TB)中。 在提交事务之前,事务缓冲区中的消息对消费者不可见。 当事务中止时,事务缓冲区中的消息将被丢弃。
事务缓冲区将所有正在进行和中止的事务存储在内存中。 所有消息都发送到实际的分区 Pulsar 主题。 提交事务后,事务缓冲区中的消息对消费者具体化(可见)。 事务中止时,事务缓冲区中的消息将被丢弃。
事务ID(TxnID)标识Pulsar中的唯一事务。 事务 ID 长度是 128-bit。 最高 16 位保留给事务协调器的 ID,其余位用于每个事务协调器中单调递增的数字。 使用 TxnID 很容易定位事务崩溃。
待确认状态
挂起确认状态在事务完成之前维护事务中的消息确认。 如果消息处于挂起确认状态,则在该消息从挂起确认状态中移除之前,其他事务无法确认该消息。
挂起的确认状态被保留到挂起的确认日志中(cursor ledger)。 新启动的broker可以从挂起的确认日志中恢复状态,以确保状态确认不会丢失。
数据流
开启事务。
使用事务发布消息。
使用事务确认消息。
结束事务。
为了帮助您调试或调优事务以获得更好的性能,请查看以下图表和说明。
1. 开启事务
在Pulsar中引入事务之前,将创建一个生产者,然后将消息发送给 broker 并存储在数据日志中。
让我们浏览一下开启事务的步骤。
在此阶段,Pulsar 客户端进入一个事务循环,对组成事务的所有消息重复(消费-处理-生产)操作。 这是一个很长的阶段,可能由多个生成和确认请求组成。
让我们了解使用事务发布消息的步骤。
步骤 | 说明 |
2.1.1 将生成的分区添加到Txn | 在Pulsar客户端向一个新的主题分区生成消息之前,它向事务协调器发送一个请求,将该分区添加到事务中。 |
2.1.2 Txn的日志分区更改 | 事务协调器将事务的分区更改记录到事务日志中以确保持久性,从而确保事务协调器知道事务正在处理的所有分区。 事务协调器可以在结束分区阶段提交或中止每个分区上的更改。 |
2.1.3 发送结果 | 事务日志将记录新分区(用于生成消息)的结果发送给事务协调器。 |
2.1.4 发送结果 | 事务协调器将新确认的分区添加结果发送给事务。 |
2.2.1 向带有w/Txn的分区生产消息 | Pulsar客户端开始向分区生成消息。 此部分的流程与生成消息的正常流程相同,只是事务生成的消息批包含事务ID。 |
2.2.2 写入消息 | Broker 将消息写入分区。 |
3. 确认事务消息
让我们浏览一下使用事务确认消息的步骤。
4. 结束事务
在事务结束时,Pulsar客户端决定提交或中止事务。 当在确认消息上检测到冲突时,可以中止事务。
4.1 结束事务请求
Pulsar客户端完成事务后,会发出结束事务请求。
让我们浏览一下结束事务的步骤。
步骤 | 说明 |
4.1.1 结束Txn请求 | Pulsar客户端向事务协调器发出结束事务请求(带有一个指示事务是提交还是中止的字段)。 |
4.1.2 提交Txn | 事务协调器将提交或中止消息写入其事务日志。 |
4.1.3 发送结果 | 事务日志发送记录提交或中止状态的结果。 |
4.2 完成事务
事务协调器面向该事务中涉及的所有分区启动提交或中止消息的进程。
让我们浏览一下完成事务的步骤。
4.3 标记事务为 COMMITTED 或 ABORTED
事务协调器将最终事务状态写入事务日志以完成事务。
步骤 | 说明 |
4.3.1 提交Txn | 在此事务中涉及的所有分区的所有生成的消息和确认已成功提交或中止后,事务协调器将最终提交或中止的事务状态消息写入其事务日志,指示事务已完成。 可以安全地删除事务日志中与事务关联的所有消息。 |
4.3.2 发送结果 | 事务日志将提交的事务的结果发送给事务协调器。 |
4.3.3 发送结果 | 事务协调器将提交的事务的结果发送给Pulsar客户端。 |