Skip to content

Commit 929342d

Browse files
committed
docs(mq): update
how-to-ensure-that-messages-are-not-repeatedly-consumed.md 修改保证消息不被重复消费的语言描述,更直观!
1 parent 8915897 commit 929342d

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一
1515

1616
![mq-10](/img/mq-10.png)
1717

18+
举个栗子。
19+
20+
有这么个场景。数据 1/2/3 依次进入 kafka,kafka 会给这三条数据每条分配一个 offset,代表这条数据的序号,分配的 offset 依次是 152/153/154。消费者从 kafka 去消费的时候,也是按照这个顺序去消费。假如当消费者消费了 `offset=153` 的这条数据,刚准备去提交 offset 到 zookeeper,此时消费者进程被重启了。那么此时消费过的数据 1/2 的 offset 并没有提交,kafka 也就不知道你已经消费了 `offset=153` 这条数据。那么重启之后,消费者会找 kafka 说,嘿,哥儿们,你给我接着把上次我消费到的那个地方后面的数据继续给我传递过来。数据 1/2 再次被消费。
21+
22+
如果消费者干的事儿是拿一条数据就往数据库里写一条,会导致说说,你可能就把数据 1/2 在数据库里插入了 2 次,那么数据就错啦。
23+
24+
1825
其实重复消费不可怕,可怕的是你没考虑到重复消费之后,**怎么保证幂等性**
1926

2027
举个例子吧。假设你有个系统,消费一条往数据库里插入一条,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下已经消费过了,直接扔了,不就保留了一条数据?
@@ -34,4 +41,4 @@ Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一
3441

3542
![mq-11](/img/mq-11.png)
3643

37-
当然,如何保证 MQ 的消费是幂等性的,需要结合具体的业务来看。
44+
当然,如何保证 MQ 的消费是幂等性的,需要结合具体的业务来看。

img/mq-10.png

-143 KB
Loading

0 commit comments

Comments
 (0)