目录

前言

在《消息队列在分布式系统中的应用》一文中我们介绍了消息队列与分布式系统两者间的密切关系以及消息队列的应用场景。本篇以 RabbitMQ 为例,继续深入了解消息队列中间件的运行方式。

简介

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个基于应用层的异步消息服务协议,为面向消息的中间件设计提供了统一实现规范。AMQP 协议的目标是实现一种在全行业内广泛使用的标准消息中间件,解决众多消息队列供应商接口不统一的问题。RabbitMQ 就是使用 Erlang 编程语言开发的一个 AMQP 开源实现,是目前为止部署最广泛的开源消息代理和消息队列中间件。作为一个企业级消息系统,RabbitMQ 支持多种编程语言和客户端,并且自带了集群、管理、插件等功能,拥有着良好的高可用性、可扩展性和易用性。

安装 RabbitMQ

RabbitMQ 提供了详尽的安装文档步骤,我们可以根据不同的操作系统类型来进行选择。

以 Ubuntu 为例,可以执行安装指令:

sudo apt-get install -yq rabbitmq-server 

启动 rabbitmq-server:

sudo service rabbitmq-server start

查看 Queues 列表:

sudo rabbitmqctl list_queues

基本对象概念

在学习 RabbitMQ 的实际操作之前,首先需要掌握下列 RabbitMQ 的基本对象概念。

Message 消息

是 RabbitMQ 的操作单元,由 Payload 有效负载和 Label 标签两部分组成,前者作为消息的主体数据,后者则包含了消息路由转发相关的描述数据。

Producer 生产者

负责生产消息,通过设定 Label 的内容来决定将消息投递到指定队列。

Consumer 消费者

负责接收消息并执行相应的任务,消费者仅仅会关心消息的 Payload,而无需关心消息的 Label。消费者会从订阅的队列中获取消息,如果有多个消费者订阅了同一队列,那么队列默认会以平摊的方式将消息分派给消费者。

Queue 队列

是存放消息的地方,消息会在队列中以 FIFO 的方式等待取出。

Exchange 交换机

生产者和队列之间的中转站,充当路由器的功能,将消息路由到不同的队列中,最后再被订阅了该队列的消费者取出。

Binding 绑定

为队列和交换机建立绑定关系,只有在确立了绑定关系之后,交换机才会将消息路由到相应的队列中,每一个绑定关系都会包含有一个 Binding Key。

Binding Key 绑定键

在绑定交换机和队列时,会为此次绑定设置一个 Key 值,作为唯一标识。

Routing Key 路由键

消息的路由转发描述,用作消息和队列之间的匹配,会在队列绑定到交换机时设置。同时,生产者在生产消息时也为该消息指定一个路由键,以此来决定由将该消息存放到哪一个队列中。实际上 Routing Key 可能还需要结合 Exchange Type 以及 Binding Key 才能最终决定路由目标。

Exchange Type 交换机类型

RabbitMQ 支持 fanout、direct、topic、headers 四种交换机类型,每种类型都具有特定的消息路由策略。

  • fanout exchange 扇形交换机:该类型交换机会无视路由键,将同一份消息路由给绑定到扇形交换机自身的所有队列,所以扇形交换机采用的是广播路由策略。也就是说同一份消息会被分发给不同的消费者,进而执行不同的任务。这一特性,非常符合「单一操作,多重响应」的场景,例如:Blog 系统中的一个新建博文操作,实际上需要完成新建博文记录、更新文章计数、推送订阅邮件等多种响应。

  • direct exchange 直连交换机:当队列绑定到交换机之后,会为此次绑定设置一个路由键。生产者将消息发送到交换机之前,也会为消息设置一个路由键,直连交换机会通过匹配消息路由键与绑定路由键来确定消息路由目标。所以直连交换机采用的是单播路由策略。

  • topic 主题交换机:在交换机与队列建立绑定时,除了会设置路由键之外还会设置一个绑定键,而且绑定键支持通配符 *(单个字符) 和 #(任意个字符)两种形式。主题交换机会通过匹配消息路由键和绑定键来确定消息路由目标,也就是说同一个队列能够接收不同路由键的消息(绑定键具有通配符),所以主题交换机是一种多播路由策略。需要注意的是,应用主题交换机时,消息的路由键命名格式应该是以 ’.’ 分割的单词词组。例如:路由键分别为 task.add、task.sub、task.mult 的消息都会路由到绑定键为 ‘task.#’ 的队列中。

  • headers 头交换机:头交换机不会依赖路由键和绑定键作为路由策略因素,而是单纯的通过消息中所包含的 AMQP 协议头信息来决定,该类型交换机因为效率问题,一般很少被用到。

最后

本篇最为《快速入门分布式消息队列之 RabbitMQ》的上篇主要介绍了 RabbitMQ 架构的对象概念,通过了解这些对象的概念,相信能够对 RabbitMQ 的运行机理有一个初步的认识。

快速入门分布式消息队列之 RabbitMQ(1)的更多相关文章

  1. 快速入门分布式消息队列之 RabbitMQ(3)

    目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...

  2. 快速入门分布式消息队列之 RabbitMQ(2)

    目录 目录 前文列表 RabbitMQ 的特性 Message Acknowledgment 消息应答 Prefetch Count 预取数 RPC 远程过程调用 vhost 虚拟主机 插件系统 最后 ...

  3. 【转】快速理解Kafka分布式消息队列框架

     from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...

  4. 分布式消息队列XXL-MQ

    <分布式消息队列XXL-MQ>     一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...

  5. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  6. Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇

    目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...

  7. EQueue - 一个C#写的开源分布式消息队列的总体介绍

    前言 本文想介绍一下前段时间在写enode时,顺便实现的一个分布式消息队列equeue.这个消息队列的思想不是我想出来的,而是通过学习阿里的rocketmq后,自己用c#实现了一个轻量级的简单版本.一 ...

  8. 分享一个c#写的开源分布式消息队列equeue

    分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...

  9. 消息队列之 RabbitMQ

    https://www.jianshu.com/p/79ca08116d57 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块 ...

随机推荐

  1. 小a的轰炸游戏(差分,前缀和)

    题目传送门 题意: 给出一个n*m的矩形,然后有两个操作. 1操作,对一个给出的菱形,对菱形范围内的东西进行+1. 2操作,对一个上半菱形的区域,进行+1操作. 最后求矩形内各个数的异或和. 思路: ...

  2. 利用AXI VDMA实现OV5640摄像头采集

    利用AXI VDMA实现OV5640摄像头采集 导读:摄像头采样图像数据后经过VDMA进入DDR,通过PS部分控制,经过三级缓存,将DDR中保持的图形数据通过VDMA发送出去.在FPGA的接收端口产生 ...

  3. C#多播委托详解

    包含多个方法的委托成为多播委托,调用多播委托,可以按照顺序连续调用多个方法,因此,委托的签名就必须返回void;否则,就只能得到委托调用的最好一个方法的结果 1.多播委托可以用运算符"+&q ...

  4. Luogu P2756 [网络流24题]飞行员配对方案问题_二分图匹配题解

    二分图模板题 我用的是匈牙利 其实最大流也可以做 #include<iostream> #include<cstdio> #include<cstdlib> #in ...

  5. ambari 2.5.0源码编译安装

    参考:https://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari/index.html Ambari 是什么 Ambar ...

  6. Linux下配置JDK环境

    安装前需要查询Linux中是否已经存在jdk 如果存在,将存在的jdk删除 在/etc/profile中添加以下 JAVA_HOME为jdk的安装目录 PATH为jdk可执行文件的目录 使用sourc ...

  7. python Rabbitmq编程(一)

    python Rabbitmq编程(一) 实现最简单的队列通信 send端 #!/usr/bin/env python import pika credentials = pika.PlainCred ...

  8. visual studio 2013 生成依赖项关系图出错

    开始是说无法连接到sql服务器,我安装卸载localdb http://www.microsoft.com/zh-cn/download/details.aspx?id=29062 下载 CHS\x6 ...

  9. vs2013 找不到帮助 help查看器

    我手贱把help查看器卸载了,打开帮助提示找不到帮助. 不想把vs重装,打开ios镜像,加载,cmd进入 到packages\Help 执行msiexec /i help3_vs_net.msi vs ...

  10. Oracle锁表信息处理步骤

    查看是否有锁表的sql select 'blocker(' || lb.sid || ':' || sb.username || ')-sql:' || qb.sql_text blockers, ' ...