RabbitMQ相关问题

241 阅读1分钟

RabbitMQ

介绍

RabbitMQ是erlang编写,实现了AMQP协议的开源消息中间件。

作用:异步、削峰、解耦。

需要解决的问题

如何防止消息丢失

(1)生产者:开启confirm模式/事务。

confirm是异步的,发送之后可以接着发送下一个消息,rabbitmq会回调告知是否成功。

开启事务会变为同步阻塞,生产者阻塞等待是否发送成功,降低吞吐量。

(2)mq:创建持久化queue(exchange)、发送消息时设置deliveryMode=2。

而且持久化可以和confirm机制配合,只有消息持久化到磁盘之后,才会向生产者确认。

(3)消费者:开启手动ack。

每次消费完消息,在代码里手动调用ack。

顺序消费

一个queue对应一个consumer,把需要保证顺序的message都发送到一个queue中。关闭自动ack,设置prefetchCount=1,每次只消费一条消息,处理后手动ack。

可以使用多个queue,相同用户的消息发送到同一个队列。

重复消费

  1. 幂等接口

  2. 分场景:

    (1)强校验:流水表

    (2)弱校验:redis里缓存一段时间

消息积压怎么处理

  1. 修复consumer
  2. 临时扩容queue
  3. 增加消费者

消息一致性

消息发送一致性是指产生消息的业务动作与消息发送的一致。如果业务操作成功了,那么对应的消息一定要发送出去,否则就丢失消息;如果业务操作没有发生或失败了,那么消息就不应该被发送出去。

使用分布式事务实现消息一致性。