返回

Apache Pulsar系列(一):消息确认机制详解

开发工具

引言

在分布式消息系统中,消息确认(Acknowledgment)是至关重要的,它决定了消息发送者和接收者之间的交互以及消息处理的可靠性。在Apache Pulsar中,消息确认有几种不同的模式,每种模式都满足不同的可靠性、效率和可伸缩性需求。

在本文中,我们将深入探讨Pulsar的消息确认机制,重点关注正常消息确认在Broker侧的实现。我们将深入了解确认过程、故障处理机制以及如何保证消息的顺序传递。

消息确认模式

Pulsar支持多种消息确认模式,包括:

  • 非确认(None): 接收者不向发送者发送确认消息。这提供最低级别的可靠性,但具有最高的性能。
  • 正常确认(Individual): 接收者在成功处理每条消息后发送确认消息。这提供了中等级别的可靠性,并保持了较高的性能。
  • 批量确认(Cumulative): 接收者在成功处理一批消息后发送一条确认消息。这提供了较高的可靠性,但性能较低。
  • 签名的确认(Signed): 接收者在成功处理消息后发送已签名的确认消息。这提供了最高的可靠性,但性能最低。

正常消息确认

正常消息确认是最常用的模式,它提供了中等级别的可靠性,同时保持了较高的性能。当接收者成功处理一条消息时,它会向Broker发送一条确认消息。Broker收到确认消息后,会将其从存储中删除,并更新其内部状态以反映已处理的消息。

Broker侧的实现

在Broker侧,正常消息确认通过一个称为"确认处理器"的组件实现。确认处理器负责处理传入的确认消息,更新Broker的内部状态,并删除已处理的消息。

确认处理器是一个状态机,它维护每个分区已处理和未处理的消息的跟踪。当收到一条确认消息时,确认处理器会查找该消息对应的分区和消息ID。如果找到,它会将该消息标记为已处理,并更新分区中已处理消息的计数。

故障处理

在分布式系统中,故障是不可避免的。如果Broker在处理确认消息时发生故障,则可能会丢失已处理的消息。为了解决这个问题,Pulsar使用了WAL(Write-Ahead Log)机制。

WAL是一种持久化存储,它记录了所有传入的确认消息。当Broker重新启动时,它会从WAL中恢复已处理的消息,并更新其内部状态。这确保了即使在发生故障的情况下,已处理的消息也不会丢失。

顺序传递

在一些场景中,消息的顺序传递至关重要。例如,在处理事务性消息时,需要按顺序处理消息以确保事务的完整性。Pulsar通过使用"有序消费者"来实现消息的顺序传递。

有序消费者是一种特殊类型的消费者,它保证按消息的发布顺序接收和处理消息。当有序消费者连接到分区时,Broker会分配一个递增的事务ID给该消费者。消费者只能处理事务ID与自己分配的事务ID相同的确认消息。

结论

消息确认是Apache Pulsar中一个至关重要的机制,它决定了消息处理的可靠性、效率和可伸缩性。在本文中,我们深入探讨了Pulsar的正常消息确认模式,以及如何在Broker侧实现。我们还讨论了故障处理机制和顺序传递的支持。