【RabbitMQ】介绍及消息收发流程

介绍

RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ

主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。 AMQP,即 Advanced Message Queuing

Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP

的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ 是一个开源的 AMQP

实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持

AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

相关概念

通常我们谈到队列服务,会有三个概念:发消息者、队列、收消息者 ,RabbitMQ 在这个基本概念之上,多做了一层抽象,在发消息者和队列之间,加入了交换器 (Exchange)

这样发消息者和队列就没有直接联系,转而变成发消息者把消息给交换器,交换器根据调度策略再把消息给队列。

工作原理

  • 1.首先有个生产者产生一条消息。

  • 2.需要把消息发到mq上面去,就需要建立tcp连接,然后建立channel。

  • 3.然后通过channel将消息发布到mq中的一个交换机上面去(Exchange)。

  • 4.通过交换机(Exchange)将消息发送到相应的对列(queue)上面去。

  • 5.接下来就是消费者了,通过建立tcp连接,通过channel通道拿到相应对列上的消息。

消息发送与接收流程

消息流转模型

生产者发送消息

text 复制代码
1、生产者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)。

2、生产者声明一个交换器,并设置相关属性,比如交换机类型、是否持久化等。

3、生产者声明一个队列并设置相关属性,比如是否排他、是否持久化、是否自动删除等。

4、生产者通过路由键将交换器和队列绑定起来。

5、生产者发送消息至 RabbitMQ Broker,其中包含路由键、交换器等信息。

6、相应的交换器根据接收到的路由键查找相匹配的队列。

7、如果找到,则将从生产者发送过来的消息存入相应的队列中。

8、如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者。

9、关闭信道。

10、关闭连接。

消费者消费消息

text 复制代码
(1)消费者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)。

(2)消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,

以及做一些准备工作。

(3)等待 RabbitMQ Broker 回应并投递相应队列中的消息,消费者接收消息。

(4)消费者确认(ack)接收到的消息。

(5)RabbitMQ 从队列中删除相应已经被确认的消息。

(6)关闭信道。

(7)关闭连接。
相关推荐
哼了个哈5 分钟前
daos源码编译
分布式
Lostgreen7 分钟前
分布式查询处理优化之数据分片
大数据·笔记·分布式
孙克旭_2 小时前
第五章 RabbitMQ高级
分布式·rabbitmq
雪碧聊技术4 小时前
RabbitMQ7:消息转换器
rabbitmq·消息转换器·messageconvert
Mr.Demo.4 小时前
[RabbitMQ] 保证消息可靠性的三大机制------消息确认,持久化,发送方确认
分布式·rabbitmq
小扳4 小时前
微服务篇-深入了解使用 RestTemplate 远程调用、Nacos 注册中心基本原理与使用、OpenFeign 的基本使用
java·运维·分布式·后端·spring·微服务·架构
LightOfNight4 小时前
Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)
服务器·数据库·redis·分布式·后端·缓存·中间件
cnsxjean14 小时前
SpringBoot集成Minio实现上传凭证、分片上传、秒传和断点续传
java·前端·spring boot·分布式·后端·中间件·架构
桃园码工20 小时前
3-测试go-redis+redsync实现分布式锁 --开源项目obtain_data测试
redis·分布式·golang
sx_170620 小时前
Spark面试题
大数据·分布式·spark