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主题。

What are transactions? - 图1

Pulsar事务支持端到端的恰好一次流处理,这意味着消息不会从源算子(source operator)丢失,并且消息不会重复发给接收算子(sink operator)。

使用场景

在Pulsar 2.8.0之前,没有简单的方法可以使用Pulsar构建流处理应用程序来实现恰好一次性处理保证。 随着Pulsar 2.8.0中引入的事务,以下服务支持恰好一次语义:

  • Pulsar Flink连接器

    在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和其他连接器的支持。