RabbitMQ学习笔记(二):基础概念
前言
上一篇已经通过springboot对rabbitmq的简单封装实现了消息的发送和消费,虽然功能简单,但已经大概了解了它的使用方法。接下来陆续介绍RabbitMQ中的几个核心概念:Queue,Exchange,Channel,vhosts。
本文以Springboot封装的对象Queue来介绍Rabbitmq中的Queue概念。
Queue
Queue(队列)是RabbitMQ的内部对象,用于消息的消费,用下图表示。

图1
RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费。

图2
多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

图3
参数:
- name:队列名称
- durable:是否持久化,默认为真。此时即使Rabbitmq服务重启后该队列依然存在。
- exclusive: 默认为否。为真时意味着只被一个连接使用,如果这个连接关闭了,那么队列将被丢弃。
- autoDelete:没有消费者时是否删除该队列,默认为否。
- arguments: Map<String,Object>类型,暂时不是很懂这个,但试了下官网上面的限制队列长度的示例居然启动报错了。
交换机(Exchange)
交换机的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启用ack模式后,交换机找不到队列会返回错误。交换机有四种类型:Direct, topic, Headers and Fanout
- Direct:direct 类型的行为是"先匹配, 再投送". 即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去.
- Topic:按规则转发消息(最灵活)
- Headers:设置header attribute参数类型的交换机
- Fanout:转发消息到所有绑定队列
Direct
Direct Exchange是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列。

图4
第一个 X - Q1 就有一个 binding key,名字为 orange; X - Q2 就有 2 个 binding key,名字为 black 和 green。当消息中的 路由键 和 这个 binding key 对应上的时候,那么就知道了该消息去到哪一个队列中。
Ps:为什么 X 到 Q2 要有 black,green,2个 binding key呢,一个不就行了吗? - 这个主要是因为可能又有 Q3,而Q3只接受 black 的信息,而Q2不仅接受black 的信息,还接受 green 的信息。
X-orange-Q1组成一个Channel。
topic
Topic Exchange 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。
在这种交换机模式下:
- 路由键必须是一串字符,用句号(.) 隔开,比如说 agreements.us,或者 agreements.eu.stockholm 等。
- 路由模式必须包含一个 星号(),主要用于匹配路由键指定位置的一个单词,比如说,一个路由模式是这样子:agreements..b.,那么就只能匹配路由键是这样子的:第一个单词是 agreements,第四个单词是 b。 井号(#)就表示相当于一个或者多个单词,例如一个匹配模式是agreements.eu.berlin.#,那么,以agreements.eu.berlin开头的路由键都是可以的。
具体代码发送的时候还是一样,第一个参数表示交换机,第二个参数表示routing key,第三个参数即消息。如下:
rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", " this is RabbitMQ!");
小结:topicExchange是支持通配符的directExchange, 可以使用两个通配符:
*表示一个词.#表示零个或多个词.
|-|key.a|key.a.b|key.b|
|-|-|-|
|key.*|T|F|T|
|key.#|T|T|T|
Headers
headers 也是根据规则匹配, 相较于 direct 和 topic 固定地使用 routing_key , headers 则是一个自定义匹配规则的类型.
在队列与交换器绑定时, 会设定一组键值对规则, 消息中也包括一组键值对( headers 属性), 当这些键值对有一对, 或全部匹配时, 消息被投送到对应队列.
Fanout
Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了routing_key会被忽略。
小结
|
Exchange |
Bindings |
测试结果及说明 |
|
|
Queues |
Routing key |
||
|
test_direct |
queue00 |
Publish message 时需指定 Routing key。不指定则发送到第一个不用 Routing key 绑定的 queue00;指定 Routing key |
|
|
queue01 |
rk |
||
|
queue02 |
kk01 |
||
|
test_fanout |
queue00 |
message 发送到所有绑定的队列中,即使设置 Routing key 也无效,所依没必要设置多余的 Routing key。 |
|
|
queue03 |
|||
|
queue04 |
|||
|
test_topic |
queue00 |
message 发送时发送到通配符符合的队列中。不指定则发送到第一个不用 Routing key 绑定的 queue00;Publish message 指定 Routing key |
|
|
queue05 |
aa.# |
||
|
queue06 |
bb.# |
||
总结
- Queue用于消息的消费,Exchange则定义了消息的投递规则。
- TopicExchange是最常用的Exchange,重点掌握。
RabbitMQ学习笔记(二):基础概念的更多相关文章
- https学习笔记二----基础密码学知识和python pycrypto库的介绍使用
在更详细的学习HTTPS之前,我也觉得很有必要学习下HTTPS经常用到的加密编码技术的背景知识.密码学是对报文进行编解码的机制和技巧.可以用来加密数据,比如数据加密常用的AES/ECB/PKCS5Pa ...
- OpenFlow Switch学习笔记(一)——基础概念
OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open F ...
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
- Elasticserach学习笔记-01基础概念
本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. 原文出处:https://www.elastic.co/guide/en/e ...
- 【miscellaneous】 GStreamer应用开发手册学习笔记之基础概念介绍
第3章. 基础概念介绍 本章将介绍GStreamer的基本概念. 理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念. 3.1. 元件(Elements) 元件 ...
- rabbitmq学习笔记2 基本概念
官网:http://www.rabbitmq.com 参考:http://blog.csdn.net/column/details/rabbitmq.html 1 基本概念 rabbitmq se ...
- .NET之RabbitMQ学习笔记(二)-安装
安装 1.安装erlang语言环境 因为rabbitmq是基于erlang进行开发,所以需要安装相应的依赖环境,学习中用到的erlang包下载地址:http://www.erlang.org/down ...
- Centos7安装gitlab11 学习笔记之基础概念、部署安装、权限管理、issue管理
一.基础介绍 1.简介 一个基于GIT的源码托管解决方案 基于rubyonrails开发 集成了nginx postgreSQL redis sidekiq等组件 2.安装要求 2g内存以上,有点占内 ...
- RabbitMQ学习总结(1)-基础概念
1. 概念 1.1 AMQP协议 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消 ...
- JAVA学习笔记之基础概念(一)
一.Java 简介: Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称. 由 James Gosling和同 ...
随机推荐
- django —— Celery实现异步和定时任务
1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...
- c字符输出
#include<stdio.h> int main() { char c1,c2; c1 = ; c2 = ; printf("c1 = %c,c2 = %c\n", ...
- PHP error_reporting() 函数
实例 规定不同的错误级别报告: <?php // 关闭错误报告 error_reporting(0); // 报告 runtime 错误 error_reporting(E_ERROR | E_ ...
- Grunt经常使用插件及演示样例说明
下述给出了经常使用Grunt插件,并列举了部分插件演示样例: 插件名称 说明 Github地址 grunt-contrib-clean 清空文件和目录 https://github.com/grunt ...
- BMP位图文件格式详解及编程建议
BMP文件渊源流长,虽然对JPG.PNG等格式图像文件来说,确实有点土,但是毕竟BMP文件格式相对简单,容易理解,至于BMP众多的位图格式也不能责怪微软,主要是早期谁也没料到图片技术会发展的这么快,而 ...
- RPC框架与分布式服务框架的区别
第一:RPC框架是点对点的通信方式,即服务消费者与服务提供者是点对点通信 第二:分布式服务框架,不近具有RPC框架的特性,同时,还包括以下特性: 1.提供多台服务器提供服务,具有负载均衡策略 2.服务 ...
- net-snmp 的配置
http://www.cnblogs.com/oloroso/p/4595123.html
- Android——ContentProvider
xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...
- 使用 Easy Sysprep v4(ES4) 封装 Windows 7教程
总:1.装系统ctrl+shift+f3(administrator)2.备份系统,快速备份(pe下)3.安装补丁,软件(系统下),不装安全类软件,需激活的软件重装后还要激活4.系统备份(pe下叠 ...
- orderBy 传入属性的字符串
IEnumerable下面的的OrderBy可以用于集合的排序. public static IOrderedEnumerable<TSource> OrderBy<TSource, ...