在项目中有用到MQ,主要用到的了主题模式和死信队列,私信队列是当做延迟队列来使用。
1、什么是RabbitMQ?为什么使用RabbitMQ?
答:
RabbitMQ是一款开源的,基于AMQP协议的,消息中间件;
公司项目是用springcloud框架,用它来做解耦和异步、削峰
2、如何保证RabbitMQ不被重复消费?
答:
会出现重复消费,一般都是因为网络问题、服务器故障等。
解决方案:
a.部署多个服务。
b.在接收的时候,把参数做幂等,如果是已经消费过的就手动confirm。
c.处理完的时候也做手动confirm
b.队列的durable 设置成 true(持久化到磁盘里,及时mq挂了,队列也不会丢失)
3、如何保证RabbitMQ消息的顺序性?
答:
之前没遇到过要求顺序性的需求,现在我假设一个场景:数据的增、删、改要在队列完成
那么,我们执行的顺序是: 增-->改-->删
一条数据都有一个组件:每次都先把组件当做一个组id,每次数据下来,都把数据放在缓存(硬盘)里。
如果先执行的是删,那么我们先把删的信息放在数据库里。
接下来如果是增,那么我们可以先执行增加操作,也把数据的状态保存到数据库。
最后接收到改,我们先从数据库查询是否有新增的操作,如果有就执行修改,再判断数据组是否满足3条,如果是,再执行删除,删除成功,最后把数据组从库里删除。
-
工作中对mq的使用情景?
答:
需要用到短信、红点、日志等服务的时候,都是通过MQ去解耦。
死信队列则是,在做一个CRM系统中使用到,在分配一个商机的时候,如果这个商机的员工没有处理。8小时后商机则会回流到待分配状态。 -
死信队列的流程是怎么样的?
如下图,定义一个死信队列和一个普通队列,在普通队列消息过期的时候,去会去执行死信队列。我们就没有去接收普通队列,就做了一个死信队列的消费端,因此,等时机一到,就去会去执行死信队列。具体业务,按照订单的状态判断,是否商机是否被处理。