分布式系统开发工具包 —— 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

上一篇: nginx特性列表
下一篇: 分布式系统开发工具包 —— 基于Kryo的Java对象序列化
目录