消息队列(MQ)核心知识点(持续更新中)
RabbitMQ
RabbitMQ概念及架构
参考文章,RabbitMQ详解:https://blog.youkuaiyun.com/qq_36763419/article/details/122023216
RabbitMQ消息丢失的场景及解决方案
场景1:生产者(Producer)将消息投递到 Broker 时,因为网络波动导致消息不能正常投递到Broker?
解决方案:针对生产者可以开启(Confirm)消息发布确认机制
。
场景2:交换机(Exchange)将消息转发到队列(Queue)时,Broker服务出现宕机?
解决方案:对RabbitMQ进行消息持久化
(注意事项:消息持久化影响性能)。如下:
- Exchange持久化
- Queue持久化
- 消息持久化
场景3:消费者消费队列中的消息时,消费者拿到消息开始消费后,出现消费异常或者消费者宕机,默认情况下自动确认会导致消息丢失?
解决方案:开启手动ACK
,由消费者手动确认消费。
RabbitMQ重复消费场景及解决方案
场景1:生产者推送多个一样的消息。如,接口调用时重复提交,没有做好接口幂等性?
解决方案:设置接口幂等性,防止接口重复提交
。
场景2:消费者完成消费后,准备发送ACK确认消费时,RabbitMQ出现宕机,导致MQ没有及时将消息出队,服务重启后,会再次推送该消息,导致重复消费?
场景3:消费者完成消费后,来不及发送ACK确认消费,消费者出现宕机,服务重启后,会再次收到队列中的消息进行消费。
场景 2、3 解决方案:设置消息幂等性处理(如:Redis为例,基于Redis实现锁续命)
@Service
@Slf4j
@SuppressWarnings(value = {
"unchecked", "rawtypes"})
public class RabbitMQConsumerService {
@Autowired
private RedisTemplate redisTemplate;
/*消费端监听队列(普通队列)*/
@RabbitListener(queues = {
"test.queue"})
public void receiveMsg(JSONObject msgJson, Message message, Channel channel) throws IOException {
long deliveryTag = message.getMessageProperties().getDeliveryTag(