RabbitMq基本概念理解
RabbitMQ的基本概念
RabbitMQ github项目地址
RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的 消息中间件 之一。由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。并且RabbitMQ是一个是一个开源的消息代理和队列服务器。
AMQP : Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
环境
RabbitMQ 可以运行在 Erlang语言所支持的平台之上,包括:
Solaris:原先是太阳微系统公司研制的类Unix操作系统,在Sun公司被Oracle并购后被称作Oracle Solaris。BSD: Berkeley Software Distribution,缩写为BSD,也被称为伯克利Unix(Berkeley Unix),是一个操作系统的名称。衍生自Unix(类Unix),1970年代由伯克利加州大学的学生比尔·乔伊(Bill Joy)开创Linux: 是一种自由和开放源代码的类UNIX操作系统。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布MacOSX: 是苹果公司推出的图形用户界面操作系统,为麦金塔计算机专用,自2002年起在所有的Mac 计算机预装。Windows:Microsoft Windows(中文译作微软视窗[4][5])是微软公司推出的一系列操作系统
使用 RabbitMQ 需要:
ErLang 语言包
下载地址:[http://www.erlang.org/downloads],双击.exe文件进行安装就好。
RabbitMQ 安装包
RabbitMQ Server官网下载地址
本文则主要集中在以下几点:
- 几个基本概念(Message, Publisher, Exchange, Binding, Queue, Channel, Consuer, Virtual host)
- 消息分发的几种策略
- ACK是什么鬼
基本概念
消息队列 (Message QUEUE)
首先来一张消息队列的经典图,可以划分为三个角色: Producer, Queue, Consumer

- Queue:为承载消息的容器,为什么是队列而不是栈呢?主要是因为绝大部分的场景,我们都是希望消息是先进先出,有顺序的
- Producer:生产者,就是产生消息,并不断往队列塞的角色
- Consumer:消费者,也就是不断从队列中获取消息的角色
看到这个模型,如果对JDK的容器有一定的了解,很容易可以想到借助 ArrayBlockingQueue 或者 ListBlockingQueue 就可以实现简易的消息队列(也就是我们常说的生产者-消费者模型)
实例理解消息队列
其实在生活中,这种模型用得非常多,就比如我们都会接触的网购快递,可以说是一个典型的消息队列的case了:
商家不断的把商品扔给快递公司(注意不是直接将商品给买家),而快递公司则将商品根据地质分发对应的买家
对上面这个过程进行拆解,可以映射扮演的角色
- 商品:Message,传递的消息,由商家投递给快递公司时,需要进行打包(一般Producer生产消息也会将实体数据进行封装)
- 商家:Produer 生产者
- 快递公司: Queue,消息的载体
- 买家:Consumer 消费者
那么快递公司时怎么知道要把商品给对应的买家呢?根据包裹上的地址+电话
- 同样消息队列也需要一个映射规则,实现Message和Consumer之间的路由
RabbitMQ基本概念
通过上面的实例对比,发现基本的消息队列定义的元素太少,这里则正好可以看一下RabbitMQ是怎么具体来实现消息队列的

- Message:消息,包含消息头(即附属的配置信息)和消息体(即消息的实体内容)
- Publisher:生产者,向交换机发布消息的主体
- Exchange:交换机,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
- Binding:绑定,用于给Exchange和Queue建立关系,就是我们熟知的配对的红娘
- Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
- Connection:连接
- Channel:通道,MQ与外部打交道都是通过Channel来的,发布消息、订阅队列还是接收消息,这些动作都是通过Channel完成;简单来说就是消息通过Channel塞进队列或者流出队列
- Consumer:消费者,从消息队列中获取消息的主体
- Virtual Host: 虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
- Broker:消息队列服务器实体
上面是一些专业的概念,那么可以怎么映射到前面的快递上呢?
Exchange类型
生产者,将消息投递给Exchange,然后由Exchange将消息路由到对应的Queue上,供消费者消费,那么这个路由有哪些方式呢?
1. Direct策略
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中
简单来讲,就是路由键与队列名完全匹配
- 如果一个队列绑定到交换机要求路由键为“dog”
- 只转发 routing key 标记为“dog”的消息,
- 不会转发“dog.puppy”,也不会转发“dog.guard”等等
- 它是完全匹配、单播的模式
举例说明
Exchange和两个队列绑定在一起:
- Q1的bindingkey是orange
- Q2的binding key是black和green.
- 当Producer publish key是orange时, exchange会把它放到Q1上, 如果是black或green就会到Q2上, 其余的Message被丢弃
2 .Fanout策略
从上图也可以看出,这种策略,将忽略所谓的routing key,将消息分发到所有绑定的Queue上,更加类似我们理解的广播模式
3. Topic策略

topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上
可以理解为直接策略的进阶版,直接策略是完全精确匹配,而topic则支持正则匹配,满足某类指定规则的(如以xxx开头的路由键),可以键消息分发过去
#匹配0个或多个单词*匹配不多不少一个单词
一个更直观的实例如下
Producer发送消息时需要设置routing_key,
- Q1 的binding key 是”.orange.“
- Q2 是 “…rabbit” 和 “lazy.#”:
- 产生一个 test.orange.mm 消息,则会路由到Q1;而如果是 test.orange则无法路由到Q1,因为Q1的规则是三个单词,中间一个为orange,不满足这个规则的都无效
- 产生一个 test.qq.rabbit 或者 lazy.qq 都可以分发到Q2;即路由key为三个单词,最后一个为rabbit或者不限制单词个数,主要第一个是lazy的消息,都可以分发过来
- 如果产生的是一个 test.orange.rabbit消息,则Q1和Q2都可以满足
4. Headers策略
这个实际上用得不多,它是根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,如果Header信息和message消息的头信息相匹配
5. 小结
主要使用的消息分发策略有三个,直接,路由和扇形,简单的小结下应用场景和区别
a. Direct Exchange
直接完全匹配模式,适用于精准的消息分发
b. Topic Exchange
Routing Key的匹配模式,支持Routing Key的模糊匹配方式,更适用于多类消息的聚合
c. Fanout Exchange
忽略Routing Key, 将消息分配给所有的Queue,广播模式,适用于消息的复用场景
ACK
消息队列的一个重要指标,当有消费者获取了消息之后,对这个消息我应该怎么办?是直接删除还是等某个合适的机会再删除?又或者是干脆不删除,就留着了?
在实际的应用场景中,消息正常消费之后,我们希望的是这个消息就不要了,但是消费的过程中如果出现了bug,则希望不要删除消息,等我修复这个bug后,可以把这个消息重新的投递给我
- ack机制
Consumer接收到了消息之后,必须返回一个ack的标志,表示消息是否成功消费,如果返回true,则表示消费成功了,然后这个消息就会从RabbitMQ的队列中删掉;如果返回false,且设置为重新入队,则这个消息可以被重新投递进来
通常实际编码中,默认是自动ACK的,如果消息的重要性程度较高,我们应该设置为主动ACK,在接收到消息之后,自主的返回对应的ACK信息
这一块更多地内容可以查看实际使用篇
RabbitMq基本概念理解的更多相关文章
- rabbitMQ基本概念
一.网页登录方法 http://127.0.0.1:15672/ 用户名和密码默认为guest/guest 用java代码去连接rabbitmq用的端口是5672 二.rabbitMQ基本概念 Rab ...
- rabbitMQ 基本概念
RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消 息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上, RabbitM ...
- RabbitMQ基本概念和使用
RabbitMQ是一个消息代理,核心原理:发送消息,接收消息. RabbitMQ主要用于组件之间的解耦,消息发送者无需知道消息使用者的存在,反之亦然. 单向解耦 ...
- 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制
今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...
- RabbitMQ如何工作和RabbitMQ核心概念
RabbitMQ是一个开源的消息代理软件.它接受来自生产者的消息并将其传递给消费者.它就像一个中间人,可以用来减少Web应用程序服务器的负载和交付时间. RabbitMQ如何工作 让我们简要介绍一下R ...
- SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较
1.IOC概念理解 IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- RabbitMQ基本概念和原理
RabbitMQ基本概念和原理 1.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计. 2.Rabb ...
- Kubernetes重要概念理解
Kubernetes重要概念理解 kubernetes是目前最主流的容器编排工具,是下一代分布式架构的王者.2018年的kubernetes第一个版本1.10已经发布.下面整理一下,kubernete ...
- SNF快速开发平台2019-角色、权限、账户的概念理解-非常全的理论讲解权限控制
组织模型 资源模型 操作模型 谁能够执行哪些操作 执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源 ...
随机推荐
- 简单几步就能把素材变成大片?老司机推荐Vegas
"素材编辑"一般分为两种,一种是对时间线素材长度和位置的编辑,另一种就是遮罩法操作. 第一种,裁剪素材(将素材在我们选定的位置一分为二),对时间线上的素材进行裁剪,有两种方法: 一 ...
- Golang 实现 Redis(7): Redis 集群与一致性 Hash
本文是使用 golang 实现 redis 系列的第七篇, 将介绍如何将单点的缓存服务器扩展为分布式缓存.godis 集群的源码在Github:Godis/cluster 单台服务器的CPU和内存等资 ...
- linux(centos7.x)安装jdk
一.下载与安装 下载地址:链接:https://pan.baidu.com/s/1g7MF1xqlOxWnLGf2shl3NA 提取码:epae 下载完成后将安装包上传到linxu环境中,并将其 ...
- fist-第五天冲刺随笔
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...
- 【NOIP2011模拟11.1】钓鱼
钓鱼 题目 Description 我们把钓鱼的过程放在坐标系里来考虑.图中蓝色的点为船,初始时它的坐标记为(Ax,y).河深为y,河宽为x.某个时刻会从左边界或右边界游出来一条鱼(左边的往右边游,右 ...
- day6(短信验证接口)
1.注册容联云账号 1.1注册账号 https://www.yuntongxun.com/user/login 1.2登录即可看到开发者账号信息 1.3 添加测试账号 2.使用容联云发送代码测试 ' ...
- 《MySQL慢查询优化》之SQL语句及索引优化
1.慢查询优化方式 服务器硬件升级优化 Mysql服务器软件优化 数据库表结构优化 SQL语句及索引优化 本文重点关注于SQL语句及索引优化,关于其他优化方式以及索引原理等,请关注本人<MySQ ...
- PyQt+moviepy音视频剪辑实战1:多视频合成顺序播放或同屏播放的视频文件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 在<moviepy音视频剪辑:音视 ...
- Python使用import导入模块时执行了模块的文件但报ModuleNotFoundError错误的愚蠢问题
老猿在学习import导入自定义模块时,搜索路径中sys.path中已经添加对应路径,发现会报ModuleNotFoundError,但对应的模块代码被执行了,代码myfib.py如下: def fi ...
- Docker 本地镜像推送到阿里云(五)
最近在学习Docker,从安装Docker开始,到自定义制作镜像mycentos,但是怎么把它推送到阿里云,一直是困扰我的问题.后面有时间了解了一下,根据本地镜像推动到阿里云其实并没有我们想象中那么难 ...