RabbitMq基础(一)
RabbitMQ简介
RabbitMq是一个开源的消息代理(Message Broker)软件,实现了高级消息队列协议(AMQP),用于在分布式系统中异步传递消息。由Erlang语言编写,具有高并发,高可靠性和可扩展性,广泛应用于微服务架构,任务队列,事件驱动系统等场景。
在java后端开发中,具有广泛的应用场景,比如:
(1) 异步处理任务
- 场景:一些比较耗时的业务逻辑和任务,通过异步执行的方法来避免主业务逻辑阻塞,提高主业务逻辑的执行速度。
- 示例:比如有一个Hr人力资源管理系统,里面维护了大量人员基础数据,当人员数据发生变动的时候,需要同步到多个其他系统(假设是A,B,C三个系统)。如果采取Hr系统来调用这个多个系统的同步接口的话,耗时就是A系统执行时间+B系统执行时间+C系统执行。采用MQ的话,就可以将发生变化的人员数据丢到MQ中,A,B,C三个系统再从MQ中获取数据,执行各自的更新业务逻辑。
(2) 实现多个系统之间解耦
- 还是上面的例子,采用Hr系统直接调用其他系统的更新接口时,如果第三方系统出现故障,可以会导致Hr系统出现报错。采用消息队列就不会,同时RabbitMQ还系统了消息重试的机制,避免了因网络波动等原因导致的失败问题。
(3) 流量削峰
- 场景:某些突发的场景下,导致系统访问量突增,通过MQ来逐一处理任务,降低系统短时间内的负载量,避免服务器过载。
- 示例:双十一电商平台秒杀活动,大量请求涌入,首先将这些请求保存到MQ中,然后系统按照自己能承受的负载量来执行这些请求。
(4)延迟队列
- 场景:需要延迟处理的任务,可以通过RabbitMQ的延迟队列来处理。
- 示例:订单超期未支付,自动取消订单。
RabbitMQ核心概念
虚拟主机
一台RabbitMQ服务器,可以有多个虚拟主机,可以通过虚拟主机将交换机、队列隔离在不同的环境中,不同虚拟主机中的交换机,队列互不干扰。可以简单理解为一种“分类”。
消息
“消息”一词是一种抽象的概念,可以理解为由生产者发出来的一段数据,一般是字符串形式,比如JSON字符串,包含了消费者所需要的数据。
生产者
消息的生产者,负责将消息发送到交换机中。
消费者
消息的消费者,负责从队列中取出消息并消费。
路由键(Routing Key)
队列可以绑定一个路由键,消息也可以绑定路由键,可以理解为关键字/标识,只有当生产者投递的消息的路由键和队列的路由键匹配值,该队列才会接收到该条消息(Fanout交换机除外)。
交换机
交换机负责将生产者投递过来的“消息”,按照消息的“路由键”不同,将“消息”路由到不同的队列中去。
交换机类型
RabbitMq包含了多种交换机类型,适用的场景也各不相同,下面介绍常用的几种
- Direct:直连交换机
直连交换机通过精确匹配绑定路由键,将消息路由到一个或多个绑定的队列、流或交换机。
例如,绑定键 abc 只会匹配路由键 abc。 - Fanout:扇形交换机
扇出交换机会将每条发布到它的消息的副本路由到所有绑定的队列、流或交换机。消息的路由键(Routing Key)会被完全忽略。 - Topic:主题交换机
主题交换机使用消息的路由键与绑定时的路由键模式进行匹配。
为了实现路由,键会被 . 分隔成多个段。某些段由特定值填充,而其他段由通配符填充:-
'*'匹配一个段
-
'#'匹配0个或多个段
示例:
绑定模式 regions.na.cities.* 会匹配消息路由键 regions.na.cities.toronto 和 regions.na.cities.newyork,但不会匹配 regions.na.cities,因为 * 必须匹配一个完整的段。 -
绑定模式 audit.events.# 会匹配 audit.events.users.signup 和 audit.events.orders.placed,但不会匹配 audit.users,因为第二个段不匹配。
-
绑定模式 # 会匹配任何路由键,使主题交换机的行为类似于扇出交换机。
-
队列
在 RabbitMQ 中,队列是一个有序的消息集合。消息按照先进先出(FIFO)的方式入队和出队(传递给消费者)。从通用定义来看,队列是一种具有两个主要操作的顺序数据结构:可以在尾部入队(添加)消息,并从头部出队(消费)消息。
队列具有多个属性:
- 名称:队列的名称
- 持久性:队列在服务器重启后是否还存在
- 独占性:仅由一个连接使用,并在该连接关闭时删除队列
- 自动删除:
- 参数:可选;由插件和代理特定功能使用,如消息 TTL、队列长度限制等
本文来自博客园,作者:路口偶然遇见你,转载请注明原文链接:https://www.cnblogs.com/wzy/p/18932986

浙公网安备 33010602011771号