面试篇:MQ
Mq
什么是mq?
消息队列,即MQ,Message Queue
mq有什么用?
异步处理:响应速度更快。 解耦:多个微服务(系统)之间解耦。职责分明,各司其职。
案例使用RabbitMQ
使用RabbitMQ实现了数据同步功能。
1.当item-server修改mysql中的商品数据后,马上通过SpringAmap向RabbitMQ发送消息(spu id)
2.search-service收到消息spu id后,立即根据spu id查询到商品数据spuBo,将spubo转成goods后保存到ElasticSearch中。
3.goods-web收到消息spu id后,立即根据id查询到商品数据spuBO,然后创建静态页面。
rabbitMQ有哪几种消息模型
基本
工作竞争
订阅-Fanout(广播)
订阅-Direct(路由)
订阅-Topic(主题)
分布式事务
在分布式系统中,存在多个数据库时,你想让多个数据库操作在同一个事务中,那么这就是分布式事务,需要手动实现。
示例介绍
1.生产者发消息给mq
2.mq收到消息后,给生产者发送消息确认(只表示mq收到,并不表示消费者已消费)
3.mq发送消息给消费者,消费者处理自己的业务
4.消费者给mq响应确认消息,表示消费者已经消费了此消息,不用再重新发送了(以下可选)
5.消费者发消息给mq
6.mq收到消息后,给消费者发送消息确认
7.mq发送消息给生产者,生产者处理自己的业务
8.生产者给mq响应确认消息,表示生产者已经消费了此消息,不用再重新发送了
死信
什么是死信
(1)消息被拒绝(basic.reject或basic.nack)并且requeue=false.
(2)消息TTL超期 (rabbitmq Time-To-Live -> messageProperties.setExpiration())
(3)队列达到最大长度(队列满了,无法再添加数据到mq中)
什么是死信交换机(DLX--Dead-Letter-Exchange)
定义业务队列的时候,要考虑指定一个死信交换机,死信交换机可以和任何一个普通的队列进行绑定,然后在业务队列出现死信的时候就会将数据发送到死信队列。
什么是死信队列
死信队列实际上就是一个普通的队列,只是这个队列跟死信交换机进行了绑定,用来存放死信而已。
待补充 ... ...
如何防止 MQ 消息重复发送
解决方法很简单:增加消息状态表。
通俗来说就是一个账本,用来记录消息的处理状态,每次处理消息之前,都去状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复发送。