幂等性
当消费者消费完消息之后,通常会发送一个ack应答确认信息给生产者,但是这中间有可能因为网络中断等原因,导致生产者未能收到确认消息,由此这条消息将会被 重复发送给其他消费者进行消费,实际上这条消息已经被消费过了,这就是重复消费的问题。
消息幂等性,其实就是保证同一个消息不被消费者重复消费两次。
如何避免消息重复消费?
消费者端实现幂等性,意味着消息永远不会消费多次,即使收到了多条一样的消息。通常有两种方式来避免消费重复消费:
方式1: 消息全局 ID 或者写个唯一标识(如时间戳、UUID 等) :每次消费消息之前根据消息 id 去判断该消息是否已消费过,如果已经消费过,则不处理这条消息,否则正常消费消息,并且进行入库操作。(消息全局 ID 作为数据库表的主键,防止重复)
方式2: 利用 Redis 的 setnx 命令:给消息分配一个全局 ID,消费该消息时,先去 Redis 中查询有没消费记录,没有则以键值对形式写入 Redis ,有则不消费该消息。[Redis Setnx(SETifNot eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。]
保证消息的消费顺序
解决方案一
拆分成多个,每个一个,就是多一些而已,确实是麻烦点;这样也会造成吞吐量下降,可以在消费者内部采用多线程的方式取消费。
解决方案二
或者就一个但是对应一个,然后这个内部用内存队列做排队,然后分发给底层不同的来处理
领取专属 10元无门槛券
私享最新 技术干货