快速入门分布式消息队列之 RabbitMQ(2)
目录
前文列表
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)的更多相关文章
- 快速入门分布式消息队列之 RabbitMQ(3)
目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...
- 快速入门分布式消息队列之 RabbitMQ(1)
目录 目录 前言 简介 安装 RabbitMQ 基本对象概念 Message 消息 Producer 生产者 Consumer 消费者 Queue 队列 Exchange 交换机 Binding 绑定 ...
- 【转】快速理解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 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块 ...
随机推荐
- 使用svn未响应卡死的几个原因,commit时checkout时
1.commit 时 很可能是:检索文件内容过多导致,解决:不要在最外层文件夹目录下commit 2.checkout时 很可能是:地址错误
- Android判断是debug还是release模式
1.当有些功能不希望在release模式实现时,但是debug模式又需要的时候,就可以对当前版本模式进行判断.如是debug模式则日志输出级别设置为Level.DEBUG,release模式设置为Le ...
- 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)
一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...
- MySQL安装+Navicat_Premium(安装+破解)+Navicat_Premium中MySQL的localhost不能正常连接+不能连接Docker启动容器中的MySQL
MySQL安装 安装MySQL 我这里安装的是 MySQL 8.0 Command Line Client 下载+安装 详情见 https://www.cnblogs.com/taopanfeng/p ...
- 恢复HDFS文件删除后的方法
HDFS 为我们提供了垃圾箱的功能,也就是当我们执行 hadoop fs -rmr xxx 命令之后,文件并不是马上被删除,而是会被移动到执行这个操作用户的 .Trash 目录下,等到一定的时间后才会 ...
- [Python模块]Windows环境安装PyV8并执行js语句
安装这个玩意儿真挺坑的,pip直接安装失败,windows的py库压根搜不到.. 搜索良多解决办法终于找到了,在这里贴出来,主要是把这个库下载下来再安装,但它的下载地址HERE位于外面的世界(你懂得) ...
- 描述GPT是什么?
介绍: 全球唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准.它是可扩展固件接口(UEFI)标准(被Inter用于代替个人计算机的BIOS ...
- 前端每日实战:157# 视频演示如何用纯 CSS 创作一个棋盘错觉动画(实际上每一行都是平行的)
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VEyoGj 可交互视频 此视频是可 ...
- python urljoin
使用urllib的urljoin()拼接两个地址 urlljoin的第一个参数是基础母站的url,第二个是需要拼接成绝对路径的url. from urllib import parse url1 = ...
- 转 弹性反向传播(RProp)和均方根反向传播(RMSProp)
from http://blog.csdn.net/tsq292978891/article/details/78619384 都是一种权值更新算法,类似于SGD算法,其中,RMSProp是RProp ...