RabbitMQ基础知识
  wMDCgnRK3Ovr 2023年11月15日 72 0

1.RabbitMQ是什么

RabbitMQ是一个广泛使用的消息服务器,采用Erlang语言编写,是一种开源的实现AMQP(高级消息队列协议)的消息中间件;RabbitMQ最初起源于金融系统,它的性能及稳定性都非常出色。

AMQP协议(http://www.amqp.org),即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

简单来说,消息中间件就是指保存数据的一个容器(服务器),可以用于两个系统之间的数据传递。

消息中间件一般有三个主要角色:生产者、消费者、消息代理(消息队列、消息服务器);

RabbitMQ基础知识_消息队列

生产者发送消息到消息服务器,然后消费者从消息代理(消息队列)中获取数据并进行处理。

2.还有哪些消息队列

  • RabbitMQ:稳定可靠,数据一致,支持多协议,有消息确认,基于erlang语言
  • Kafka:高吞吐,高性能,快速持久化,无消息确认,无消息遗漏,可能会有重复消息,依赖于zookeeper,成本高
  • ActiveMQ:不够灵活轻巧,对队列较多的情况支持不好
  • RocketMQ:性能好,高吞吐,高可用性,支持大规模分布式,语言支持单一

为什么使用RabbitMQ?

RabbitMQ稳定可靠,在系统并发量不大的情况下,可以使用RabbitMQ。

3.MQ的使用场景

3.1 解耦

场景说明:用户下单后,订单系统要通知库存系统

传统方式:订单系统直接调用库存系统提供的接口,如果库存系统出现故障会导致订单系统失败

RabbitMQ基础知识_日志处理_02

使用消息队列:

RabbitMQ基础知识_服务器_03

3.2 异步

场景说明:用户注册成功之后,需要发送注册邮件及注册短信提醒

传统方式:

RabbitMQ基础知识_服务器_04

使用消息队列:

RabbitMQ基础知识_服务器_05

3.3 消息通信

场景说明:应用系统之间的通信,例如聊天室

聊天室

RabbitMQ基础知识_服务器_06

3.4 流量削峰

场景说明:高负载请求/任务的缓冲处理,例如秒杀业务

RabbitMQ基础知识_消息队列_07

3.5 日志处理

场景说明:系统中大量的日志处理

RabbitMQ基础知识_日志处理_08

ELK日志处理解决方案(E:elastic search L:logstash K:kibana):

loger.error(...) --> logstash收集消息 --> 发送消息到kafka --> elastic search --> kibana elk日志处理平台

4.RabbitMQ工作模型

RabbitMQ基础知识_消息队列_09

broker相当于mysql服务器,virtural 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串等等)。

5.RabbitMQ工作方式

5.1简单模式

一个队列只有一个消费者

生产者将消息发送到队列,消费者从队列取出数据

RabbitMQ基础知识_服务器_10

5.2工作模式

多个消费者监听同一个队列

多个消费者监听同一个队列,但多个消费者中只有一个消费者会成功消费消息

RabbitMQ基础知识_消息队列_11

5.3 订阅模式

一个交换机绑定多个消息队列,每个消息队列有一个消费者监听

消费者发送的消息可以被每一个消费者接收

RabbitMQ基础知识_日志处理_12

5.4路由模式

一个交换机绑定多个消息队列,每个消息队列都有自己唯一的key,每个消息队列有一个消费者监听

路由模式

RabbitMQ基础知识_服务器_13

5.5通配符模式

一个交换机绑定多个消息队列,每个消息队列都有通配符方式的key。

通配符模式

RabbitMQ基础知识_日志处理_14

6.RabbitMQ交换机类型

6.1 Fanout Exchange

投递到所有绑定的队列,不需要路由键,不需要进行路由键的匹配,相当于广播、群发;

RabbitMQ基础知识_消息队列_15

6.2 Direct Exchange

根据路由键精确匹配,进行路由消息队列。

RabbitMQ基础知识_服务器_16

6.3 Topic Exchange

通配符匹配,相当于模糊匹配;

#匹配多个单词,用来表示任意数量(零个或多个)单词;

*匹配一个单词(必须有一个,而且只有一个),用.隔开的为一个单词;

beijing.# == beijing.queue.abc, beijing.queue.xyz.xxx

beijing.* == beijing.queue, beijing.xyz

RabbitMQ基础知识_日志处理_17

发送时指定的路由键:lazy.orange.rabbit,所有队列都收到了,但是Q2不会收到两条消息。

6.4 Headers Exchange

基于消息内容中的headers属性进行匹配。

RabbitMQ基础知识_日志处理_18


声明:以上内容参考了多个mq教程,会和其他资料有雷同之处。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
wMDCgnRK3Ovr