diff --git a/docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md b/docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md index 85b0557..54195bf 100644 --- a/docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md +++ b/docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md @@ -15,6 +15,13 @@ Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一  +举个栗子。 + +有这么个场景。数据 1/2/3 依次进入 kafka,kafka 会给这三条数据每条分配一个 offset,代表这条数据的序号,分配的 offset 依次是 152/153/154。消费者从 kafka 去消费的时候,也是按照这个顺序去消费。假如当消费者消费了 `offset=153` 的这条数据,刚准备去提交 offset 到 zookeeper,此时消费者进程被重启了。那么此时消费过的数据 1/2 的 offset 并没有提交,kafka 也就不知道你已经消费了 `offset=153` 这条数据。那么重启之后,消费者会找 kafka 说,嘿,哥儿们,你给我接着把上次我消费到的那个地方后面的数据继续给我传递过来。数据 1/2 再次被消费。 + +如果消费者干的事儿是拿一条数据就往数据库里写一条,会导致说说,你可能就把数据 1/2 在数据库里插入了 2 次,那么数据就错啦。 + + 其实重复消费不可怕,可怕的是你没考虑到重复消费之后,**怎么保证幂等性**。 举个例子吧。假设你有个系统,消费一条往数据库里插入一条,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下已经消费过了,直接扔了,不就保留了一条数据? @@ -34,4 +41,4 @@ Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一  -当然,如何保证 MQ 的消费是幂等性的,需要结合具体的业务来看。 +当然,如何保证 MQ 的消费是幂等性的,需要结合具体的业务来看。 \ No newline at end of file diff --git a/img/mq-10.png b/img/mq-10.png index 7346877..25aabf0 100644 Binary files a/img/mq-10.png and b/img/mq-10.png differ