mirror of
https://github.com/doocs/advanced-java.git
synced 2024-12-28 04:10:08 +08:00
docs(mq): update
how-to-ensure-that-messages-are-not-repeatedly-consumed.md 修改保证消息不被重复消费的语言描述,更直观!
This commit is contained in:
parent
89158977f1
commit
929342d26b
@ -15,6 +15,13 @@ Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一
|
||||
|
||||
![mq-10](/img/mq-10.png)
|
||||
|
||||
举个栗子。
|
||||
|
||||
有这么个场景。数据 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-11](/img/mq-11.png)
|
||||
|
||||
当然,如何保证 MQ 的消费是幂等性的,需要结合具体的业务来看。
|
||||
当然,如何保证 MQ 的消费是幂等性的,需要结合具体的业务来看。
|
BIN
img/mq-10.png
BIN
img/mq-10.png
Binary file not shown.
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 19 KiB |
Loading…
Reference in New Issue
Block a user