目录

前文列表

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

RabbitMQ 的特性

紧接上文,继续来看 RabbitMQ 都有哪些值得我们关注的特性。

Message Acknowledgment 消息应答

假设一个场景,消费者接收到了消息,但却在处理消息的过程中发生了意外退出的情况,那么此次消息的传递就应该被视为「无效传递」。显然「无效传递」的情况是不允许在对结果敏感的场景中出现的。为了解决这个问题,RabbitMQ 规定了队列在把消息传递给消费者之后并不会立即将消息从队列中丢弃,而是要求队列在接收到消费者的 ACK 响应之后,才将其丢弃。如果队列在一段时间后仍未能接收到消费者的 ACK,那么消息会被传递给别的消费者直到队列接收到 ACK 为止,以此来保证了每一个消息都能被有效的传递,这就是 RabbitMQ 的消息应答机制。消息应答机制默认是开启的,当然了,如果在对结果响应无所谓的场景中,我们完全可以关闭掉它(autoAsk=true),因为开启消息应答机制实际上会拉低消息传递的效率。

Prefetch Count 预取数

RabbitMQ 允许消费者每次从队列中获取任意数量的消息,这就是所谓的预取。如果消费者所执行的任务是相对细小的,那么就应该每次预取更多的消息数量。这是因为不同消费者执行的任务长度不尽相同,如果使用均分的方式来分配消息的话,那么任务粒度小、执行时间短的消费者就会闲置下来。这种情况在开启消息应答机制的前提下会尤为明显,所以建议为任务粒度较小的消费者设定更大的预取数值。

RPC 远程过程调用

RabbitMQ 除了支持异步通讯之外,同时也会支持同步通讯来满足用户多方面的需求。其提供的 RPC(Remote Procedure Call)远程调用就是一种同步通讯方式,其实现的原理如下:

  • 生产者在生产请求消息时,会在请求消息的属性中设置两个 replyTo 值:一个为 Queue Name,用于告知消费者将应答消息返回到该队列;另一个为 correlationId,是请求消息的唯一标示,随着请求消息一同发送给消费者,也会随着响应消息返回给生产者,生产者就能够通过 correlationId 来判定该响应消息所对应的请求消息,最终实现请求和响应的一一配对。

  • 并且生产者只有在接收到响应消息之后才会继续发生下一次请求消息,以此实现同步的效果。

由此可见,可能有些初学者会直观的认为 RabbitMQ 只能支持异步的通讯方式,其实不然,只是应用异步的场景更多而已。

vhost 虚拟主机

RabbitMQ 支持通过 vhost 虚拟主机功能来实现多租户的效果,每一个 vhost 就相当于一个 Mini RabbitMQ,均拥有着属于自己的队列、交换机和绑定。而且不同 vhost 之间的命名空间彼此独立、互相隔离,有效的解决了命名冲突的问题。所以一个 RabbitMQ 服务器实际上能够同时服务于多个不同的应用程序。

RabbitMQ 服务器默认的虚拟主机为 “/”,缺省账户为 guest:

# rabbitmqctl list_vhosts
Listing vhosts ...
/
…done. # rabbitmqctl list_users
Listing users ...
guest [administrator]
...done.

如果我们希望为应用程序 web_app 分配一个独立的虚拟主机,需要执行以下步骤。

Step 1:新建一个用户,并为其设定一个角色。RabbitMQ 具有下列 5 种角色类型:

  • none 最小权限角色,不能登录管理页面。
  • management 管理员角色,能够访问虚拟主机的队列、绑定、交换机、通道个连接等。
  • policymaker 决策者角色,包含但不限于 management 的权限,还具有查看、创建和删除策略和参数的权限。
  • monitoring 监控角色,包含但不限于 management 的权限,还具有查看其它类型账户的通道、连接属性,也能够获取虚拟主机清单。
  • administrator 超级管理员角色,最高权限。
# rabbitmqctl add_user mickey passw0rd
Creating user "mickey" ...
...done. # rabbitmqctl set_user_tags mickey administrator
Setting tags for user "mickey" to [administrator] ...
...done. # rabbitmqctl list_users
Listing users ...
guest [administrator]
mickey [administrator]
...done.

Step 2:新建一个虚拟主机

# rabbitmqctl add_vhost web_app
Creating vhost "web_app" ...
...done. # rabbitmqctl list_vhosts
Listing vhosts ...
/
web_app
…done.

Step 3:绑定用户在虚拟主机中的权限

# rabbitmqctl list_user_permissions mickey
Listing permissions for user "mickey" ...
...done. # rabbitmqctl set_permissions -p web_app mickey '.*' '.*' '.*'
Setting permissions for user "mickey" in vhost "web_app" ...
...done. # rabbitmqctl list_user_permissions mickey
Listing permissions for user "mickey" ...
web_app .* .* .*
…done.

选项 set_permissions 后面的三个 ‘.*’ 参数分别表示为用户在虚拟机上的 配置(创建/删除队列和交换机)、读(获取消息)、写(发布消息) 权限。

插件系统

RabbitMQ 支持强大的插件系统,当我们需要一个 RabbitMQ 没有提供的功能时,第一反应应该是到网上查找有没有相应的插件模块。通过访问 http://www.rabbitmq.com/plugins.html 来查看 RabbitMQ 官方提供的插件列表,其中 「Supported Plugins」列表由官方团队维护,可以放心在生产环节中使用,至于其他实验性质的插件列表则建议慎重考虑。

「Supported Plugins」中最常用的插件模块之一就是 rabbitmq_management,它可以让我们通过 Web 或 RESTful API 来管理 RabbitMQ。

安装 rabbitmq_management 插件:

# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect. # service rabbitmq-server restart
* Restarting message broker rabbitmq-server [ OK ]

通过访问 http://localhost:15672 来登录 RabbitMQ Web 管理平台。

RabbitMQ Web 管理平台主要有「全局统计预览」、「连接管理」、「通道管理」、「交换机管理」、「队列管理」、「全局设置管理」等几个板块组成,支持下面常用的管理操作:

  • RabbitMQ 服务器的动态数据统计预览。
  • 查看服务器连接列表,关闭指定连接。
  • 查看连接的通道列表
  • 查看交换机列表,新建/删除交换机,新建/修改交互机与队列的绑定,发布消息。
  • 查看队列列表,新建/删除队列,新建/修改队列与交互机的绑定,发布消息,获取消息。
  • 查看用户列表,添加用户。
  • 查看虚拟主机列表,添加虚拟主机。
  • 查看策略列表,添加/更改策略。

最后

本篇主要介绍了 RabbitMQ 的消息应答、预取数、RPC、虚拟主机和插件系统等特性,我们在应用 RabbitMQ 之前,应该对这些特性有充分的了解,才能够针对不同的项目场景作出合适的配置和选择。

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

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

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

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

    目录 目录 前言 简介 安装 RabbitMQ 基本对象概念 Message 消息 Producer 生产者 Consumer 消费者 Queue 队列 Exchange 交换机 Binding 绑定 ...

  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. jfinal layui 多选传值问题整理

    使用layui在显示数据表格进行多选的时候遇到的几个问题: 1.增加监听,让你的数据表格可以进行复选. layui.use('table', function(){ var $ = layui.jqu ...

  2. Delphi 7的特点

  3. 独家!三代Ryzen国行价格来了:12核3999

    5月27日,AMD在2019台北电脑展COMPUTEX展前新闻发布会上举行主题演讲,AMD CEO苏姿丰登台,正式发布了第三代Ryzen锐龙处理器,新品共有3款,分别是Ryzen 7 3700X.Ry ...

  4. SpringBootMybatis02 mybatis-generator-gui|pageHelper|前后端分离|Filter权限实现

    一.Mybatis-generator-gui 下载地址:https://github.com/LittlePageProgram/mybatis-generator-gui.git 使用方法:填写相 ...

  5. Github删除仓库文件夹问题集合

    记得上次使用GitHub,看时间提示,最近的一次,是三年前,而且都是长传文件,这次是删除文件,才发现删除库可以,但是删除库里的某个目录,就不行了,除非是下载下来,在GitHub把仓库删了重新添加.使用 ...

  6. Linux查看某进程的线程

    首先得知道你要查的进程的PID: 比如我要查看看我unimrcpserver的线程 第二种方法:top top命令可以实时显示各线程情况.就相当于windows的资源管理器.

  7. [易学易懂系列|golang语言|零基础|快速入门|(四)]

    今天开始,我们来写代码. 学习一门语言,最快的方式就是写代码,做项目. 别的学习教程,都是hello world. 我们就来点不一样的吧.我们不一样!不一样!不一样! 首先,打开VSCODE.( 关于 ...

  8. Spring MVC文件上传下载(转载)

    原文地址: http://www.cnblogs.com/WJ-163/p/6269409.html 上传参考 http://www.cnblogs.com/lonecloud/p/5990060.h ...

  9. cve-2019-1609,Harbor任意管理员注册漏洞复现

    一.Harbor介绍 以Docker为代表的容器技术的出现,改变了传统的交付方式.通过把业务及其依赖的环境打包进Docker镜像,解决了开发环境和生产环境的差异问题,提升了业务交付的效率.如何高效地管 ...

  10. hdu 3376 : Matrix Again【MCMF】

    题目链接 题意:给定一个n*n的矩阵,找一条路,从左上角到右下角再到左上角,每个点最多经过一次,求路径上的点的权值的最大和. 将矩阵中每个点拆点,点容量为1,费用为点权值的相反数.每个点向自己右侧和下 ...