docs(mq): update

how-to-ensure-that-messages-are-not-repeatedly-consumed.md

修改保证消息不被重复消费的语言描述,更直观!
This commit is contained in:
yanglbme 2018-12-05 17:08:48 +08:00
parent 89158977f1
commit 929342d26b
2 changed files with 8 additions and 1 deletions

View File

@ -15,6 +15,13 @@ Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一
![mq-10](/img/mq-10.png) ![mq-10](/img/mq-10.png)
举个栗子。
有这么个场景。数据 1/2/3 依次进入 kafkakafka 会给这三条数据每条分配一个 offset代表这条数据的序号分配的 offset 依次是 152/153/154。消费者从 kafka 去消费的时候,也是按照这个顺序去消费。假如当消费者消费了 `offset=153` 的这条数据,刚准备去提交 offset 到 zookeeper此时消费者进程被重启了。那么此时消费过的数据 1/2 的 offset 并没有提交kafka 也就不知道你已经消费了 `offset=153` 这条数据。那么重启之后,消费者会找 kafka 说,嘿,哥儿们,你给我接着把上次我消费到的那个地方后面的数据继续给我传递过来。数据 1/2 再次被消费。
如果消费者干的事儿是拿一条数据就往数据库里写一条,会导致说说,你可能就把数据 1/2 在数据库里插入了 2 次,那么数据就错啦。
其实重复消费不可怕,可怕的是你没考虑到重复消费之后,**怎么保证幂等性**。 其实重复消费不可怕,可怕的是你没考虑到重复消费之后,**怎么保证幂等性**。
举个例子吧。假设你有个系统,消费一条往数据库里插入一条,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下已经消费过了,直接扔了,不就保留了一条数据? 举个例子吧。假设你有个系统,消费一条往数据库里插入一条,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下已经消费过了,直接扔了,不就保留了一条数据?

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 19 KiB