kafka如何保证不重复消费

kafka如何保证不重复消费

问:kafka消费的三种模式是什么?
  1. 答:at most onece模式
    基本思想是保证每一条消息commit成功之后,再进行消费处理。
    设置自动提交为false,接收到消息之后,首先commit,然后再进行消费。
    at least onece模式
    基本思想是保证每一条消息处理成功之后,再进行commit。
    设置自动提交为false;消息处理成功之后,手动进行commit。
    采用这种模式时,最好保证消费操作的“幂等性”,防止重复消费。
    exactly onece模式
    核心思想是将offset作为唯一id与消息同时处理,并且保证处理的原子性。
    设置自动提交为false;消息处理成功之后再提交。
    比如对于关系型数据库来说,可以将id设置为消息处理结果的唯一索引,再次处理时,如果发现该索引已经存在,那么就不处理。
问:kafka重复消费的原因
  1. 答:如果自动提交的偏移量小于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理,
    假设我们采用了自动提交,且提交时间间隔为5s,在最近一次提交之后的3s发生了再均衡,再均衡之后,消费者从最后一次提交的偏移量位置开始读取消息。这个时候偏移量已经落后了3s,所以在这3s内到达的消息会被重复处理。可以通过修改提交时间间隔来更频繁地提交偏移量,减小可能出现重复悄息的时间窗,不过这种情况是无也完全避免的。
问:一条消息怎么被两个消费者消费
  1. 答:在保证MQ消息不重复的情况下,消费者消费消息成功后,在给MQ发送消息确认的时候出现了网络异常(或者是服务中断),MQ没有接收到确认,此时MQ不会将发送的消息删除,为了保证消息被消费,当消费者网络稳定后,MQ就会继续给消费者投递之前的消息。这时候消费者就接收到了两条一样的消息
  2. 答:如何保证消息不被重复消费,或者说如何保证消息幂等性。
    rbbitmq,rocketmq,kafka,都有可能出现消息重复消费的情况,以kafka来说
    kafka实际上有个offset的概念,就是每个消息写进去,都有一个offset,代表的消息的序号,然后consumer消费了数据之后,每隔一段时间(定期定时),会把自己消费过的offset提交一下,表示“我已经消费过了,下次重启之后,还是从上次消费到的offset来继续消费。
    如果遇到意外情况,还没来得及提交offset,进程就被杀掉了,重启之后,可能有些消息要重复消费一次。
kafka如何保证不重复消费
下载Doc文档

猜你喜欢