分布式系统开发工具包 —— Kafka 的消息投递语义

有三种消息投递语义:至多一次、至少一次、正好一次。“之多一次”消息可能会丢失,但肯定不会被重复投递;“至少一次”消息肯定不会丢失但可能会重复。“正好一次”是投递一次且仅一次。“正好一次”是最期待的但也是昂贵的,它需要生产者和消费者簿记很多信息。

Kafka 消费者和消息投递语义

回忆一下,所有的 replicas 拥有相同的 log partitions,它们带有相同的 offsets。消费者组在每个 topic partition 的日志上维护它们的 position。

要实现“至多一次”,消费者读取一个消息,然后保存它的 offset(通过给 broker 发送 offset),最后处理这个消息。“至多一次”的问题是,一个消费者在保存它的 position 后、在处理完消息之前,可能会宕了。然后,重启后的这个 consumer 或者它的替代者将会离开最后的 position,出了问题的消息将不会再被处理了。

要实现“至少一次”,消费者读取一个消息,处理消息,最后保存 offset 到 broker。“至少一次”的问题是,消费者可能在处理完消息、保存 position 前崩溃了。然后,重启后的这个 consumer 或者它的替代者将会收到已经处理过了的消息。“至少一次”是消息机制里最通用的设置,你需要负责消息是幂等的,即收到两条相同的消息不会招致错误。

要实现消费者一方的“正好一次”,消费者可以需要两阶段提交——存储消费者 potition 和存储消费者的消息处理输出。

Kafka 提供前两种。你可以从消费者视角实现第三种。

摘自:http://cloudurable.com/blog/kafka-architecture-low-level/index.html