What are transactions?
事务增强了Apache Pulsar的消息传递语义和 Pulsar Function的处理保证 。 Pulsar事务API支持跨多个主题的原子写入和确认。
事务功能支持:
一个生产者将一批消息发送到多个主题,其中一批中的所有消息最终对任何消费者都可见,或者消费者永远不可见。
端到端恰好一次语义(只执行一次
consume-process-produce
操作)。
事务语义
Pulsar事务具有以下语义:
事务中的所有操作都作为一个单元提交。
要么提交所有消息,要么都不提交。
每条消息只写入或处理一次,不会丢失数据或重复(即使发生故障)。
If a transaction is aborted, all the writes and acknowledgments in this transaction rollback.
事务中的批量消息可以被以多分区接收、生产和确认。
消费者只能读取已提交(确认)的消息。 换句话说,代理不传递属于打开事务的事务消息或属于中止事务的消息。
跨多个分区的消息写入是原子性的。
跨多个订阅的消息确认是原子性的。 订阅下的消费者在确认带有事务ID的消息时,只会成功确认一次消息。
事务和流处理
Pulsar 上的流处理是对 Pulsar 主题的 consume-process-produce
操作:
Consume
:运行Pulsar消费者的源算子(a source operator),从一个或多个Pulsar主题读取消息。Process
:处理算子(a processing operator),用于转换消息。Produce
:运行Pulsar生产者的接收算子(a sink operator),将结果消息写入一个或多个Pulsar主题。
Pulsar事务支持端到端的恰好一次流处理,这意味着消息不会从源算子(source operator)丢失,并且消息不会重复发给接收算子(sink operator)。
使用场景
在Pulsar 2.8.0之前,没有简单的方法可以使用Pulsar构建流处理应用程序来实现恰好一次性处理保证。 随着Pulsar 2.8.0中引入的事务,以下服务支持恰好一次语义:
-
在Pulsar2.8.0之前,如果要使用Pulsar和Flink构建流应用,Pulsar Flink连接器仅支持恰好一次源连接器(source connector)和至少一次接收器连接器(sink connector),这意味着端到端的最高处理保证至少一次,来自流应用程序的结果消息可能会产生重复的消息到Pulsar topic
随着Pulsar 2.8.0中引入的事务,Pulsar Flink接收器连接器可以通过实现指定的
TwoPhaseCommitSinkFunction
并使用Pulsar事务 API 连接 Flink 接收器消息生命周期来支持恰好一次语义。 未来版本中将添加对Pulsar Functions和其他连接器的支持。