为什么要使用RabbitMQ:
为了提高一个功能的响应速度,将高并发情况下产生的大规模耗时操作消息,发送到消息队列中,交由分布式系统中的其他服务器去完成,实现异步通信、流量削峰、弹性伸缩等功能。
生产者调用
convertAndSend(String exchange//交换机
, String routingKey//路由键,不同队列可以有相同路由键
, final Object object//消息体
, CorrelationData correlationData//消息体在mq中的唯一标识
)
发送消息。
消费者使用注解@RabbitListener和@RabbitHandler来监听队列处理消息
消息可靠性投递思路:
通过持久化消息体,broker的confirm机制,延时重发 完成消息的可靠性投递
可靠性投递可参考:https://blog.csdn.net/qq_18483301/article/details/90268453
消息消费幂等性问题:
什么是幂等性问题:
对于某一个操作来讲,用户的一次请求效果与多次请求效果一致。
解决方案:
对消息使用全局唯一的MessageId,并在数据库中判断是否消费过,来确保消息不会被二次消费
mq解决幂等问题方案:https://blog.csdn.net/weixin_44048532/article/details/86628234
简单代码用例可参考:
生产者(使用线程池和synchronized发送不同的消息体到MQ):https://gitee.com/SnailPu/springBootDemo/commits/master