MQ 的常见问题有:
- 消息的顺序问题
- 消息的重复问题
1. 消息的顺序问题
消息有序指的是可以按照消息的发送顺序来消费。 假如生产者产生了 2 条消息:M1、M2,假定 M1 发送到 S1,M2 发送到 S2,如果要保证 M1 先 于 M2 被消费,怎么做?
- 解决方案:
- 保证生产者 - MQServer - 消费者是一对一对一的关系
缺陷:
- 并行度就会成为消息系统的瓶颈(吞吐量不够)
- 更多的异常处理,比如:只要消费端出现问题,就会导致整个处理流程阻塞,我们不得不花 费更多的精力来解决阻塞的问题。 (2)通过合理的设计或者将问题分解来规避。
- 不关注乱序的应用实际大量存在
- 队列无序并不意味着消息无序 所以从业务层面来保证消息的顺序而不仅仅是依赖于消息系 统,是一种更合理的方式。
2.消息的重复问题
1.生产时消息重复。
由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收到了消息
2.消费时消息重复。
解决方案
要保证消息的幂等性,这个要结合业务的类型来进行处理。下面提供几个思路供参考:
(1)可在内存中维护一个set,只要从消息队列里面获取到一个消息,先查询这个消息在不在set里面,如果在表示已消费过,直接丢弃;如果不在,则在消费后将其加入set当中。
(2)、如何要写数据库,可以拿唯一键先去数据库查询一下,如果不存在在写,如果存在直接更新或者丢弃消息。
(3)、如果是写redis那没有问题,每次都是set,天然的幂等性。
(4)、让生产者发送消息时,每条消息加一个全局的唯一id,然后消费时,将该id保存到redis里面。消费时先去redis里面查一下有么有,没有再消费。
(5)、数据库操作可以设置唯一键,防止重复数据的插入,这样插入只会报错而不会插入重复数据。