Message Broker(消息代理)

维基百科对 Message Broker 的定义是:Message broker 是一种中介程序模块,它把消息从发送方的正式消息传递协议转化为接收方的正式消息传递协议

这个定义略繁琐,下面看看 RabbitMQ 官网对 Message broker 的定义:

Message broker 接收来自发布者的消息并将其路由到消费者

上面两个定义说的都是同一件事情,但是 RabbitMQ 官网的定义里缺少了“转换”这部分。

RabbitMQ 实现了一个加  AMQP(Advanced Message Queuing Protocol)的协议,AMQP 就如果互联网的 HTTP 协议,它更注重于如何传输数据,并不关心发送的数据是什么。这也就意味着需要消息的发送者和接收者来协调消息的格式。

为什么需要 Message broker

看下图。有这样一个应用,客户端需要与服务器进行通信,传递数据。最简单的情况就是客户端通过 HTTP 类协议直接与服务器连接,并发送数据。

目前一切都很简单明了。

但是,如果服务器因为维护或其它原因发生了停机,或者你想对其横向扩展,添加更多的服务器来进行响应。那么问题就来了,客户端目前是与这台服务器紧密的耦合在一起了,而随着系统的增长和进化,这种紧耦合就开始让人头疼。

如果,我们在客户端与服务器之间放置一个 Message broker,那么情况就不一样了:

客户端首先将数据发送给 Message broker。Message broker 会对数据进行检验,并将其发送给服务器。

但是在这种简单的情景下,感觉没带来什么好处。

但是,Message broker 可以通过简单的设置来允许多种场景,从而让后端服务器的横向扩展或停机维护等工作变得轻松,并且客户端并不会感知到任何的变化。

这种解耦的架构在分布式应用中非常的常见,这意味着所有一切所唯一依赖可用的东西就是 Message broker。因为 Message broker 唯一的工作就是传输数据,所以没有必要经常对其进行改动,所以它是一个相对安全可靠的组件。

对于像 RabbitMQ 这样可以设置集群来支持高可用的 Message broker,更是这样。

Exchange 和 Queue(消息交换和队列)

上文提到过 RabbitMQ 实现了 AMQP 这个协议(RabbitMQ 所支持的 AMQP 的版本是 0.9.1),这个协议的内容很多,但为了构建入门级的分布式应用,我们只需要了解以下几点即可。

在最简单的场景下,RabbitMQ 的架构示意图大致如下:

·         首先某个消息从发布者那里发往 RabbitMQ

·         这个消息需要声明一个 Exchange(也可以翻译成交换机),并被发往这个 Exchange

o    Exchange 有点类似“暂存区”,消息都会发往 Exchange。用个类比来说:Exchange 就像邮箱一样,我们写的信件首先都要放到邮箱里才能进行发送。

·         然后,Exchange 将使用消息内的一些信息以及它自己的配置来决定一条或多条发送消息的路由。

·         这些路由都通向一个 Queue(队列),消息会存储在这个 Queue 里,等待消息的接收者来进行使用。

·         一个消息的接收者可以使用 Queue 中的信息。一旦确认这个消息被传递成功,那么它将从 Queue 中被删除。

o    RabbitMQ 所提供的松耦合的特性,主要是因为 Exchange 和 Queue 的分离。

o    继续使用邮箱的类比,Queue 就相当于是接收信件的邮箱。而根据邮件地址,邮件系统会选择不同的邮箱来接收邮件。

而由于 RabbitMQ 处理的是消息,而不是信件,所以它的选项会更多:RabbitMQ 一共有 4 种 Exchange:

·         Direct Exchange。它是默认的 Exchange 。它会把消息发送到一个接收者。如果注册了多个接收者来监听同样的路由 Key,那么 RabbitMQ 将会向每个 Queue 轮流发送一条消息,相当于提供了一个简单的负载均衡

·         Fanout Exchange。 它把消息的副本发送到每个绑定到该 Exchange 的 Queue 上面。而这里的 Queue 没有办法对消息进行过滤,如果需要过滤,则需要在消息接收者那里实现。

·         Topic Exchange。它和 Direct Exchange 类似,但不同的是:每个消息接收者监听特定的路由 Key,它们会收到消息的副本。

o    例如聊天室就可以使用 Topic Exchange。每个聊天室的 ID 可以作为路由 Key,这样就可以保证消息只会发送给同一个聊天室的其他参与者。

·         Headers Exchange。这类 Exchange 会忽略路由 Key,取而代之的是,它们会查看消息的 Header,并由此来决定消息应该发往哪个 Queue。Queue 可以有一个或多个 Header 用来进行匹配。这也就开启了复杂的路由场景,例如某个 Queue 有时可以接收到某类消息而有时则不行。

 

下面仅针对 Fanout Exchange 进行进一步说明:

Fanout Exchange

当消息被发往 RabbitMQ 的时候,需要指明它需要发送到哪个 Exchange。而这个 Exchange 就可以被设置成为所谓的 Fanout Exchange。

使用 Fanout Exchange,消息会被克隆,并被发送到所有与这个 Exchange 绑定的 Queue 上,如下图:

这里每一个 Queue 都会得到属于自己的消息的副本,这些消息副本就可以被消息的接收者所使用。

在很多大规模多人游戏的场景中,经常使用这种方式来同步玩家的数据:每个玩家都订阅到一个 Fanout Exchange,你游戏的实例只需要将数据发送到一个地方即可,游戏中其他的玩家就会获得更新,而你的游戏实例就不需要知道如何数据发往每一个玩家了。

安装 RabbitMQ 和常用工具

RabbitMQ 是使用 Erlang 语言编写的,这也是 RabbitMQ 能够提供如此高的可靠性的原因之一。

安装 RabbitMQ

所以,如果想使用 RabbitMQ,就必须安装 Erlang。

以 Windows 操作系统为例,我们可以去 Erlang 官方网站下载 Erlang 的安装包进行安装,而我更喜欢 chocolatey ( https://chocolatey.org/ ) 这个 Windows 操作系统的包管理工具。

1.    安装 Chocolatey

a.    使用管理员打开 Powershell

b.    运行 Get-ExecutionPolicy,如果返回是 Restricted,那么运行 Set-ExecutionPolicy AllSigned 或者 Set-ExecutionPolicy Bypass -Scope Process

c.     然后执行命令:Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

回车,等一会就安装完了。

d.    最后输入 choco -? 命令试一下,如果出现类似以下结果,就说明安装成功了:

2.    使用 Chocolatey 安装 RabbitMQ:可以在 https://chocolatey.org/packages 搜索 RabbitMQ。找到 RabbitMQ 之后,按页面提示,使用 choco install rabbitmq 命令进行安装即可。(安装的过程中应该会自动安装依赖的 Erlang,如果不行,那么就搜索 Erlang,先安装 Erlang 即可)。

在其他操作系统安装 RabbitMQ 的过程请查看官方文档:https://www.rabbitmq.com/download.html

使用命令行与 RabbitMQ 交互

在 Windows 10 上,按 Windows + S 进行搜索,输入 RabbitMQ,或得到以下结果:

最上面的 RabbitMQ Command Prompt 就是安装包提供的一个快捷命令行链接,它指向 RabbitMQ 的 sbin 目录。而 RabbitMQ 所提供的命令行工具都在这个目录下。

正常情况下,在 Windows 10 系统中安装完 RabbitMQ 之后,它会以 Windows 服务的形式运行:

但如果 RabbitMQ 没有做为 Windows 服务存在,那么可以手动按如下步骤让其启动运行:

1.    打开 RabbitMQ 命令行

2.    输入 rabbitmq-server 命令

由于我的 RabbitMQ 是以 Windows 服务的形式已经在运行,所以这里提示 25672 端口被占用等信息。

部分常用命令简介

这里主要简单介绍几个 rabbitmqctl 工具的命令。

1.    获取 RabbitMQ Server 状态

命令为 rabbitmqctl status,该命令执行后会提供大量关于 RabbitMQ 运行的环境信息,:

2.    获取所有 Queue 队列

运行命令 rabbitmqctl list_queues,该命令会返回 RabbitMQ 所建立的 Queue(队列)及其信息。

3.    当前集群内的 server 信息

运行命令 rabbitmqctl cluster_status,运行该命令可以知道集群内哪些 server 在一起协调工作。当对 RabbitMQ 进行横向扩展或实现高可用消息通信基础架构时,就可以使用该命令查找相关信息。

更多关于 RabbitMQ 工具和 rabbitmqctl 工具的命令可以查看官方文档:

https://www.rabbitmq.com/cli.html

https://www.rabbitmq.com/rabbitmqctl.8.html

RabbitMQ 的插件

RabbitMQ 也提供了一套插件模型,使用插件可以为 RabbitMQ 提供一些特殊定制化的功能。

RabbitMQ 插件的命令时 rabbitmq-plugins,如果不加任何参数,将会得到类似以下的结果,也就是该命令的一些帮助:

1.       列出所有插件

使用 rabbitmq-plugins list 命令可以列出所有的插件:

其中 *E 表示该插件被启用了,*e 表示该插件是为了支撑其它插件而被隐式启用了。

2.       停用插件

使用命令:rabbitmq-plugins disable 插件名称。停用之后,其它支撑它的插件,如果没有其它需要的话,也会被停用。

命令执行后,会立即反应到当前正在运行的 RabbitMQ 运行时中。

3.       启用插件

使用命令:rabbitmq-plugins enable 插件名称

关于插件,更多的功能信息请查看官方文档:https://www.rabbitmq.com/rabbitmq-plugins.8.html

RabbitMQ 管理控制台

RabbitMQ 的管理控制台是 RabbitMQ 的一个插件,可以通过 rabbitmq-plugins list 命令来查看管理控制台是否已经启用(上图表示已在运行),默认应该是启动的。

启动管理控制台插件后,用浏览器打开网址 http://localhost:15672/

首先需要登陆,用户名密码为 guest。登陆成功后进入 Overview 画面,这里会展示一些总体情况:

而 Exchange 页面会展示目前 Server 可用的 Exchange 有哪些:

这里除了 SensorDiscovery,其它都是默认提供的 Exchange。

管理控制台的其它功能,随着后续程序的编写再顺便介绍。

 

RabbitMQ 入门 (Go) - 1. 简介和安装的更多相关文章

  1. Java Gradle入门指南之简介、安装与任务管理

        这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍.    ...

  2. Python入门1(简介、安装)

    第一次写博客,希望自己能养成每天一篇的好习惯(表示有很大的挑战,就不立Flag了) 先从Python开始吧.下面是本人所学习的主要教材电子版: 链接:http://pan.baidu.com/s/1e ...

  3. 01Redis入门指南笔记(简介、安装、配置)

    一:简介 Redis是一个开源的高性能key-value数据库.Redis是Remote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议 ...

  4. docker入门1---docker的简介和安装

    Tomxin7 Simple, Interesting | 简单,有趣 什么是Docker? 简介: Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发 ...

  5. RabbitMQ入门_01_简介与安装

    A. 资源与参考文档 官网:https://www.rabbitmq.com/ B. 学习目的 部门目前使用其他部门维护的 WebLogic 的 JMS 消息服务,缺乏足够的技术支持与运维支持.随着基 ...

  6. [转]RabbitMQ入门教程(概念,应用场景,安装,使用)

    原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...

  7. RabbitMQ 入门指南——安装

    RabbitMQ好文 Rabbitmq Java Client Api详解 tohxyblog-博客园-rabbitMQ教程系列 robertohuang-CSDN-rabbitMQ教程系列 Rabb ...

  8. RabbitMQ详解(一)------简介与安装(Docker)

    RABBITMQ详解(一)------简介与安装(DOCKER) 刚刚进入实习,在学习过程中没有接触过MQ,RabbitMQ 这个消息中间件,正好公司最近的项目中有用到,学习了解一下. 首先什么是MQ ...

  9. RabbitMQ入门教程(二):简介和基本概念

    原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

随机推荐

  1. 如何取消一个 Ajax 请求

    如何取消一个 Ajax 请求 jQuery XMLHttpRequest.abort() https://stackoverflow.com/questions/446594/abort-ajax-r ...

  2. how to measure function performance in javascript

    how to measure function performance in javascript Performance API Performance Timeline API Navigatio ...

  3. Python学习笔记_有关tuple的几点强调

    创建只有一个元素的tuple,需要用逗号结尾消除歧义 a_tuple = (2,) tuple中的list mixed_tuple = (1, 2, ['a', 'b']) print("m ...

  4. C#如何防止程序多次运行的技巧(精典)

    一.引言最近发现很多人在论坛中问到如何防止程序被多次运行的问题的,所以这里就记录下来,希望给遇到同样问题的朋友有所参考的,同时也是对自己的一个积累.在介绍具体实现代码之前,我们必须明确解决这个问题的思 ...

  5. three.js cannon.js物理引擎之ConvexPolyhedron多边形

    年后第一天上班,郭先生来说一说cannon.js的ConvexPolyhedron(多边形),cannon.js是一个物理引擎,内部通过连续的计算得到各个时间点的数据的状态,three.js的模型可以 ...

  6. SpringBoot文件上传与POI的使用

    1.使用springboot上传文件 本文所要源码在一个项目中,源码:https://github.com/zhongyushi-git/springboot-upload-download.git. ...

  7. DRF 三大认证之身份认证

    目录 路由组件补充 三大认证 一.身份认证 1.如何进行身份认证 2.jwt认证规则原理 3.jwt的组成 4.jwt的使用方法 4.1 签发算法 4.2 校验算法 4.3 刷新算法 二.权限认证 三 ...

  8. (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  9. 由endl对printf和cout的思考

    [前言]二者的区别就不介绍了.二者使用方法: printf("%s",a); cout<<a<<endl; endl的作用是什么? 一.endl作用 众所周 ...

  10. HDFS 03 - 你能说说 HDFS 的写入和读取过程吗?

    目录 1 - HDFS 文件的写入 1.1 写入过程 1.2 写入异常时的处理 1.3 写入的一致性 2 - HDFS 文件的读取 2.1 读取过程 2.2 读取异常时的处理 版权声明 1 - HDF ...