RabbitMQ 实现原理

AMQP(高级消息队列协议 Advanced Message Queue Protocol)

AMQP当中有四个概念非常重要: 虚拟主机(virtual host),交换机(exchange),队列(queue)和绑定(binding)。一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单,RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创 建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。

Producer 要产生消息必须要创建一个 Exchange ,Exchange 用于转发消息,但是它不会做存储,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息,当然如果消息总是发送过去就被直接丢弃那就没有什么意思了,一个 Consumer 想要接受消息的话,就要创建一个 Queue ,并把这个 Queue bind 到指定的 Exchange 上,然后 Exchange 会把消息转发到 Queue 那里,Queue 会负责存储消息,Consumer 可以通过主动 Pop 或者是 Subscribe 之后被动回调的方式来从 Queue 中取得消息。

Exchange,Queue,RoutingKey

蓝色-- Client(相对于Rabbitmq Server来说)

绿色--Exchange

红色—Queue

- 交换器(Exchange),它是发送消息的实体。

- 队列(Queue),这是接收消息的实体。

- 绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息。

Exchange指向Queue的黑色线—RoutingKey,可以将它简单的理解为一条连接Exchange和Queue的路线

Exchange和Queue都需要通过channel来进行定义,而RoutingKey则只需要在binding时取个名字就行了。

这一块的理解是不正确的,

Exchange Queue RoutingKey关系说明:


Exchange Name


Queue Name


Routing Key


test.queue


test.queue


test.queue2


test.queue2


test.exchange


test.queue


test.routingkey


test.exchange


test.queue2


test.routingkey


test.exchange


test.queue


test.routingkey2


test.exchange1


test.queue


test.routingkey

由结果可以看出,由Exchange,Queue,RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。

左边的Client向右边的Client发送消息,流程:

1,  获取Conection

2,  获取Channel

3,  定义Exchange,Queue

4,  使用一个RoutingKey将Queue Binding到一个Exchange上

5,  通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,

6,  接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK了

一个Client发送消息,哪些Client可以收到消息,其核心就在于Exchange,RoutingKey,Queue的关系上。


Exchange


RoutingKey


Queue


1


E1


R1


Q1


2


R2


Q2


3


E2


R3


Q1


4


R4


Q2


5


E1


R5


Q1


6


E2


R6


Q1

我们可以这样理解,RoutingKey就像是个中间表,将两个表的数据进行多对多关联,只不过对于相同的Exchange和Queue,可以使用不同的RoutingKey重复关联多次。

时间: 2024-10-26 14:53:52

RabbitMQ 实现原理的相关文章

rabbitmq(二)原理

一.基本概念1.1 可以看到提供方提供一个Broker(消息队列实体)当中的虚拟主机->>包含了Exchange(交换器)通过binding绑定一个队列Queue 客户端再通过连接不同渠道(Channel)给客户端提供消息而一个消息队列又分几种模式 1.2VirtualHost虚拟主机.表示一批交换器,消息队列和相关对象.虚拟主机是共享相同的身份认证和加密环境的独立服务器域.每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列.交换器.绑定和权限机制.vh

rabbitmq 原理&部署&使用

1. 简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现.如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难.不过它也只有几个关键概念,这里简单介绍一下 Broker:简单来说就是消息队列服务器实体. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息队列载体,每个消息都会被投入到一个或多个队列. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑

rabbitMQ+php

RabbitMQ与PHP(一) 项目中使用RabbitMQ作为队列处理用户消息通知,消息由前端PHP代码产生,处理消息使用Python,这就导致代码一致性问题,调整消息定义时需要PHP和Python都进行修改.这两天抽时间研究了下,如何将消息的产生与处理(消费)全部用PHP来做.查资料时发现,关于PHP处理消息队列的资料很少,有必要把一些初学者容易混淆的地方再讲一下. 拟分成两部分: 一,RabbitMQ的原理与操作示例:二,具体服务安装及如何用PHP作为守护模式处理消息. RabbitMQ是流

Rabbitmq中rabbitmqctl的常用命令

学习rabbitmq,原理之后第一个要掌握的就是rabbitmqctl这个命令的用法了,rabbitmq的管理功能最全的就是rabbitmqctl命令了,当然还有HTTP API和UI两种管理手段. rabbitmqctl的使用方法: rabbitmqctl [-n <node>] [-q] <command> [<command options>] -n node 默认node名称是"[email protected]",如果你的主机明是'serv

RabbitMQ介绍及安装部署

本节内容: RabbitMQ介绍 RabbitMQ运行原理 RabbitMQ重要术语 三种ExchangeType RabbitMQ集群种类 集群基本概念 镜像模式部署集群 一.RabbitMQ介绍 消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶.或许你正在考虑进行数据投递,非阻塞操作或推送通知.或许你想要实现发布/订阅,异步处理,或者工作队列.所有这些都属于消息系统的模式.RabbitMQ是一个消息代理,一个消息系统的媒介.它可以为你的应用提供一个通用的消息发送和接收平台,并且保

python学习-rabbitMQ篇

一.简介 RabbitMQ,它是干嘛用的呐?它是用来发消息的,消息队列,那它跟我们之前的学习的python的线程queue和进程的queue有什么区别呢?其实他们干的事情都是一样的.先来说说我们之前学习的python的queue吧. 线程queue:只是用于多个线程之间,进行数据同步交互的. 进程queue:只是用户父进程与子进程进行交互,或者属于同一父进程下的多个子进程进行交互. 如果是两个独立的程序,即便是python 程序,两个完全独立的python程序也依然是不用这个python的这个线

Python开发【项目】:RPC异步执行命令(RabbitMQ双向通信)

RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 本节涉及最多的还是rabbitmq通信原理知识,要求安装rabbitmq服务 程序用广播topic模式做更好 程序目录结构: 程序简介: # 异步rpc程序 ## 1.需求 - [ ] 利用RibbitMQ进行数据交互 - [ ] 可以对多台服务器进行操作 - [ ] 执行命令后不等待命令的执行结果,而是直接让输入下一

RabbitMQ事务和Confirm发送方消息确认——深入解读

引言 根据前面的知识(深入了解RabbitMQ工作原理及简单使用.Rabbit的几种工作模式介绍与实践)我们知道,如果要保证消息的可靠性,需要对消息进行持久化处理,然而消息持久化除了需要代码的设置之外,还有一个重要步骤是至关重要的,那就是保证你的消息顺利进入Broker(代理服务器),如图所示: 正常情况下,如果消息经过交换器进入队列就可以完成消息的持久化,但如果消息在没有到达broker之前出现意外,那就造成消息丢失,有没有办法可以解决这个问题? RabbitMQ有两种方式来解决这个问题: 通

你不知道的RabbitMQ集群架构全解

RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍与实践 RabbitMQ事务和Confirm发送方消息确认--深入解读 使用Docker部署RabbitMQ集群 你不知道的RabbitMQ集群架构全解 前言 本文将系统的介绍一下RabbitMQ集群架构的特点.异常处理.搭建和使用中要注意的一些细节. 知识点 一.为什么使用集群? 二.集群的特点 三.集群异常处理 四.集群节点类型 五.集群