目录

前言

在《消息队列在分布式系统中的应用》一文中我们介绍了消息队列与分布式系统两者间的密切关系以及消息队列的应用场景。本篇以 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. UVA 11354 Bond 最小生成树 + lca

    题意 给出一张图,q个询问,每次询问给出uv,找出一条路径,使这条路径上的最大边权是两点所有路径中最小,输出这个值 思路 很显然要先求出最小生成树,任意两点在最小生成树上有唯一路径,并且这条路径上的最 ...

  2. mongodb启动报错,child process failed, exited with error number 1

    error: child process failed, exited with error number 1 第一次安装mongodb,随后启动一般不会出现上面的错误,出现这种错误的原因一般是mon ...

  3. router4.0

    https://blog.csdn.net/sinat_17775997/article/details/69218382 React Router 4.0 实现路由守卫   https://www. ...

  4. ioncube扩展的安装详细图文教程,适合所有新手

    有些程序在php环境下运行需要安装ionCube Loader的扩展支持,这里跳过介绍这些东西直接说一下怎么让你的主机环境支持这种扩展,顺利的让你的程序运行起来!这个教程适合用云服务器或者独立服务器的 ...

  5. ids

    https://www.cnblogs.com/wyt007/p/8309377.html

  6. 【转】交换分区SWAP

    SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用. 它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对 ...

  7. Codeforces 918 括号匹配 SGdp[i][j][k]

    A B C #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) ...

  8. Comet OJ - 模拟赛 #2 Day1 比赛总结

    比赛情况 40 + 60 + 0 = 100pts 哎,T1做错了,没有对拍.如果发现错误 \(=>\) 改正 \(=>\) 40->100pts,160pts \(=>\) ...

  9. Spring Boot整合Mybatis出现错误java.lang.IllegalStateException: Cannot load driver class:com.mysql.cj.jdbc.Driver

    错误描述: Caused by: java.lang.IllegalStateException: Cannot load driver class: com.mysql.cj.jdbc.Driver ...

  10. 最简单的注册美区Apple ID方法

    最简单方法注册苹果美区Apple ID 1.打开苹果官网链接 苹果官网 2. 点击右下角的 United States 3. 点击图片中的选项 4.点击右上角的选项创建新的Apple ID 注意是新的 ...