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 消息重复发送

解决方法很简单:增加消息状态表。

通俗来说就是一个账本,用来记录消息的处理状态,每次处理消息之前,都去状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复发送。

文章作者: 已删除用户
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yida
Mark Interview
喜欢就支持一下吧