快速入门分布式消息队列之 RabbitMQ(1)
目录
前言
在《消息队列在分布式系统中的应用》一文中我们介绍了消息队列与分布式系统两者间的密切关系以及消息队列的应用场景。本篇以 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)的更多相关文章
- 快速入门分布式消息队列之 RabbitMQ(3)
目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...
- 快速入门分布式消息队列之 RabbitMQ(2)
目录 目录 前文列表 RabbitMQ 的特性 Message Acknowledgment 消息应答 Prefetch Count 预取数 RPC 远程过程调用 vhost 虚拟主机 插件系统 最后 ...
- 【转】快速理解Kafka分布式消息队列框架
from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...
- 分布式消息队列XXL-MQ
<分布式消息队列XXL-MQ> 一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...
- RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙
消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
- EQueue - 一个C#写的开源分布式消息队列的总体介绍
前言 本文想介绍一下前段时间在写enode时,顺便实现的一个分布式消息队列equeue.这个消息队列的思想不是我想出来的,而是通过学习阿里的rocketmq后,自己用c#实现了一个轻量级的简单版本.一 ...
- 分享一个c#写的开源分布式消息队列equeue
分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...
- 消息队列之 RabbitMQ
https://www.jianshu.com/p/79ca08116d57 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块 ...
随机推荐
- 制作的第一个java小游戏
package java1; import java.awt.*; public class java1 extends Frame { //球桌和桌球图片 Image ball = Toolkit. ...
- 剑指offer-二维数组中的查找-数组-python
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 基于Nginx+nginx-rtmp-module+ffmpeg搭建rtmp、hls流媒体服务器
上篇文章是基于Red5与ffmpeg实现rtmp处理NVR或摄像头的监控视频处理方案,有兴趣的朋友可以查看. Nginx及nginx-rtmp-module安装 新建目录 mkdir /usr/loc ...
- fpga ip
原文地址:altera FIR ip核 license破解作者:王永刚Aether 在证书文件中添加一段: FEATURE 6AF7_0012 alterad 2035.12 permanent un ...
- 07java进阶——集合框架(set)
1.list接口中常用的特有方法 package cn.jxufe.java.chapter7; import java.util.ArrayList; import java.util.List; ...
- Codeforces 946 课程表背包DP 数位DFS构造
A B 给你A,B 两个数 1.a=0 OR b=0 break 2.a>=2b a=a-2b 3.b>=2a b=b-2a 如果只是单纯模拟肯定会超时 ...
- Python 面向对象编程之进阶使用
我们在https://www.cnblogs.com/yinsedeyinse/p/9976280.html中学习了面向对象的编程方法.现在学习他的进阶用法. 1. 静态方法 2. 类方法 3. 属性 ...
- GUI学习之二十三——QComboBox学习总结
我们在前面分别介绍了两种输入控件:纯键盘文本输入和步长调节器,下面我们来学习下组合框(下拉选择输入). 一.简介 1.下拉框是一个组合控件(包含一个文本显示控件和一个按钮).它默认显示最小的控件给用户 ...
- 八、ARM 汇编程序格式和程序控制
8.1 汇编程序格式 源程序中的语句可以分为两种类型:指令性语句.指示性语句 指示性语句就是一些伪操作,在 MDK 编译环境下的伪操作有下面几种: 符号定义伪操作 数据定义伪操作 汇编控制伪操作 其他 ...
- Django【第13篇】:Django之Form组件
django 之知识点总结以及Form组件 一.model常用操作 1.13个API查询:all,filter,get ,values,values_list,distinct,order_by ,r ...