1.我看你项目中使用了RabbitMQ,说一说它的核心组件和工作原理?
- broker 相当于mysql服务器,virtual host相当于数据库(可以有多个数据库)
- queue相当于表,消息相当于记录。
- 消息队列有三个核心要素: 消息生产者、消息队列、消息消费者;生产者(Producer):发送消息的应用;(java程序,也可能是别的语言写的程序)消费者(Consumer):接收消息的应用;(java程序,也可能是别的语言写的程序)代理(Broker):就是消息服务器,RabbitMQ Server就是Message Broker;连接(Connection):连接RabbitMQ服务器的TCP长连接;信道(Channel):连接中的一个虚拟通道,消息队列发送或者接收消息时,都是通过信道进行的;虚拟主机(Virtual host):一个虚拟分组,在代码中就是一个字符串,当多个不同的用户使用同一个RabbitMQ服务时,可以划分出多个Virtual host,每个用户在自己的Virtual host创建exchange/queue等;(分类比较清晰、相互隔离)交换机(Exchange):交换机负责从生产者接收消息,并根据交换机类型分发到对应的消息队列中,起到一个路由的作用;路由键(Routing Key):交换机根据路由键来决定消息分发到哪个队列,路由键是消息的目的地址;绑定(Binding):绑定是队列和交换机的一个关联连接(关联关系);队列(Queue):存储消息的缓存;消息(Message):由生产者通过RabbitMQ发送给消费者的信息;(消息可以任何数据,字符串、user对象,json串等等)
扇形交换机:
Fanout 扇形的,散开的; 扇形交换机
投递到所有绑定的队列,不需要路由键,不需要进行路由键的匹配,相当于广播、群发;
直连交换机:
根据路由键精确匹配(一模一样)进行路由消息队列;
主题交换机:
通配符匹配,相当于模糊匹配;
#匹配多个单词,用来表示任意数量(零个或多个)单词
*匹配一个单词(必须有一个,而且只有一个),用.隔开的为一个单词:
beijing.# == beijing.queue.abc, beijing.queue.xyz.xxx
beijing.* == beijing.queue, beijing.xyz
头交换机:(用的不多)
2.项目中是如何保证消息可靠投递不丢失的?
- 保证以上四个过程都执行成功,即可保证投递不丢失
①代表消息从生产者发送到Exchange;
方案:开启Confirm确认模式:
消息未投递成功,采取补偿措施,或是记录日志,或是发送通知让负责人知道;
- 实现ConfirmCallback接口,重写confirm方法
②代表消息从Exchange路由到Queue;
方案:开启Return返回模式;
消息未投递成功,采取补偿措施,或是记录日志,或是发送通知让负责人知道;
失败后:
- 实现ReturnsCallback接口,重写returnedMessage方法,当消息 从 交换机 ----->队列失败l了,这个方法才会被调用(当然你可以在方法里写入向负责人发送消息的代码)
③代表消息在Queue中存储:
方案:
1,交换机持久化
2,队列持久化
3,消息持久化
4,集群高可用部署(即便有一台服务器宕机,其它的还是可以使用)
- 持久化即可以在磁盘上保存,避免消息丢失
④代表消费者监听Queue并消费消息;
方案:手动确认消息
*#**开启手动ack消息消费确认
*spring.rabbitmq.listener.simple.acknowledge-mode=manual
消费者在订阅队列时,通过上面的配置,不自动确认,采用手动确认,RabbitMQ会等待消费者显式地回复确认信号后才从队列中删除消息;
如果消息消费失败,也可以调用basicReject()或者basicNack()来拒绝当前消息而不是确认。如果requeue参数设置为true,可以把这条消息重新存入队列,以便发给下一个消费者(当然,只有一个消费者的时候,这种方式可能会出现无限循环重复消费的情况,可以投递到新的队列中,死信队列中或者只打印异常日志);
3.RabbitMQ如何保证消息的幂等性?
4.什么是死信队列?死信队列是如何导致的?
5.RabbitMQ死信队列是什么导致的?
- requeue = false 表示不重新入队列
6.RabbitMQ如何实现延迟队列?
方式一:
7.RabbitMQ的高可用机制有了解过吗?
RabbitMQ有三种模式:
1.单击模式(学习使用)
2.普通集群模式
- 缺点有队列内容的台机器宕机了就都不能用了
3.镜像集群模式(高可用)
- 三个节点的内容是完全相同的,每一次改变其它的节点都要改变,性能降低了
总结,高可用的安全性和性能不可两者兼得
8.百万消息堆积在MQ中,如何解决?
9.如何解决RabbitMQ中因为消息堆积而导致的消息过期失效的问题?
版权归原作者 叁六玖 所有, 如有侵权,请联系我们删除。