0


RabbitMQ笔记

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中因为消息堆积而导致的消息过期失效的问题?


本文转载自: https://blog.csdn.net/m0_61999905/article/details/139536216
版权归原作者 叁六玖 所有, 如有侵权,请联系我们删除。

“RabbitMQ笔记”的评论:

还没有评论