讲讲 kafka 维护消费状态跟踪的方法?

大部分消息系统在 broker 端的维护消息被消费的记录一个消息被分发到 

consumer  broker 就马上进行标记或者等待 customer 的通知后进行标记 

样也可以在消息在消费后立马就删除以减少空间占用

但是这样会不会有什么问题呢如果一条消息发送出去之后就立即被标记为消费 

过的一旦 consumer 处理消息时失败了比如程序崩溃消息就丢失了为了 

解决这个问题很多消息系统提供了另外一个个功能当消息被发送出去之后仅 

仅被标记为已发送状态当接到 consumer 已经消费成功的通知后才标记为已被 

消费的状态这虽然解决了消息丢失的问题但产生了新问题首先如果 consumer

处理消息成功了但是向 broker 发送响应时失败了这条消息将被消费两次第二 

个问题时,broker 必须维护每条消息的状态并且每次都要先锁住消息然后更改 

状态然后释放锁这样麻烦又来了且不说要维护大量的状态数据比如如果消 

息发送出去但没有收到消费成功的通知这条消息将一直处于被锁定的状态

Kafka 采用了不同的策略。Topic 被分成了若干分区每个分区在同一时间只被一 

 consumer 消费这意味着每个分区被消费的消息在日志中的位置仅仅是一个 

简单的整数:offset。这样就很容易标记每个分区消费状态就很容易了仅仅需要 

一个整数而已这样消费状态的跟踪就很简单了

这带来了另外一个好处:consumer 可以把 offset 调成一个较老的值去重新消 

费老的消息这对传统的消息系统来说看起来有些不可思议但确实是非常有用 

谁规定了一条消息只能被消费一次呢

posted @ 2020-11-28 16:26  咔啡  阅读(628)  评论(0编辑  收藏  举报