目录

前文列表

快速入门分布式消息队列之 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. js实现简单进度条

    主要用到的 offsetWidth 属性,定时器. <!DOCTYPE html> <html> 3 <head> <meta http-equiv=&quo ...

  2. ALV打印不显示打印界面的问题

    用OO的方式screen0 不画屏幕会产生这个问题,解决办法就是不用screen0 要自己画一个区域

  3. open函数的打开标志所在文件

    /usr/include/x86_64-linux-gnu/bits/fcntl-linux.h

  4. Python核心技术与实战——十二|Python的比较与拷贝

    我们在前面已经接触到了很多Python对象比较的例子,例如这样的 a = b = a == b 或者是将一个对象进行拷贝 l1 = [,,,,] l2 = l1 l3 = list(l1) 那么现在试 ...

  5. 微信小程序左右联动菜单(即可左联动,也可右联动)

    <!-- 搜索 --> <view class="search"> <input class="search-box" place ...

  6. webpack命令:Module build failed(from ./node_modules/babel-loader/lib/index.js)/405/错误解决

    在项目中运行的时候出现报错,错误为Module build failed (from ./node_modules/babel-loader/lib/index.js) 解决方案: 控制台输入  np ...

  7. AngularJS的目录结构

    templates/ _login.html _feed.html app/ app.js controllers/ LoginController.js FeedController.js dire ...

  8. anaconda 安装caffe,cntk,theano-未整理

    一,anancona 安装 https://repo.anaconda.com/archive/ conda create -n caffe_gpu -c defaults python=3.6 ca ...

  9. 搜狗微信采集 —— python爬虫系列一

    前言:一觉睡醒,发现原有的搜狗微信爬虫失效了,网上查找一翻发现10月29日搜狗微信改版了,无法通过搜索公众号名字获取对应文章了,不过通过搜索主题获取对应文章还是可以的,问题不大,开搞! 目的:获取搜狗 ...

  10. 限制 button 在 3 秒内不可重复点击

    在下载或者上传文件过程中避免重复点击带来的多次同样的请求造成资源浪费,限制 button 的点击次数是很有必要的. 1. 增强用户体验,2. 减轻服务器压力. HTML 代码 <button i ...