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)弱校验:redis里缓存一段时间
消息积压怎么处理
- 修复consumer
- 临时扩容queue
- 增加消费者
消息一致性
消息发送一致性是指产生消息的业务动作与消息发送的一致。如果业务操作成功了,那么对应的消息一定要发送出去,否则就丢失消息;如果业务操作没有发生或失败了,那么消息就不应该被发送出去。
使用分布式事务实现消息一致性。