当使用跨机器分布的消息传递系统时,可能会发生故障。在消费者从消息传递系统中的主题消费消息的情况下,消费消息的消费者和服务于主题分区的消息代理都可能失败。当发生这样的故障时,能够从消费者停止的地方恢复消费,这样既不会错过消息,也不必处理已经确认的消息。
1 Apache Kafka
恢复点通常称为偏移,更新恢复点的过程称为消息确认或提交偏移。在Apache Pulsar中,游标(cursors)用于跟踪每个订阅(subscription)的消息确认(message acknowledgment)。每当消费者在主题分区上确认消息时,游标都会更新,更新游标可确保消费者不会再次收到消息,但是游标并不像Apache Kafka那样简单。
2 Apache Pulsar有两种方法可以确认消息,个体确认ack或累积确认消息。
2.1 通过累积确认
消费者只需要确认它收到的最后一条消息,主题分区中的所有消息(包括)提供消息ID将被标记为已确认,并且不会再次传递给消费者,累积确认与Apache Kafka中的偏移更新实际上相同。
2.2 单独进行ack
也就是选择性acking。消费者可以单体确认消息。 Acked消息将不会被重新传递。
下图说明了ack个体和ack累积之间的差异(灰色框中的消息被确认并且不会被重新传递)。在图的上半部分,显示了ack累积的一个例子,M12之前的消息被标记为acked。在图的下半部分,显示了单独进行acking的示例。仅确认消息M7和M12 - 在消费者失败的情况下,除了M7和M12之外,将重新传送所有消息。
image.png
- 独占(exclusive)或故障转移(failover)订阅的消费者能够单个或累积地发送消息;
- 共享(share)订阅中的消费者只允许单独发送消息。
单独确认消息的能力为处理消费者故障提供了更好的体验。对于某些应用来说,处理那些已经确认过的消息可能是非常耗时的,防止重新传送已经确认的消息是非常必要。
网友评论