目录

前文列表

快速入门分布式消息队列之 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. 启动VMware出现报错:The VMware Authorization Service is not running

    出现The VMware Authorization Service is not running.报错的根本原因是开机没有启动"VMware Authorization Service&q ...

  2. 一、core 启动设置文件中的错误(启动文件不存在)

    一.启动文件不存在 查看 别人的 原因是

  3. 三、使用Fiddler劫持网络资源(手机端)

    一.使用说明https://www.cnblogs.com/woaixuexi9999/p/9247705.html

  4. 脚本_通过进程与端口判断myslq服务

    #!bin/bashif [[ $port -eq 1 || $porcess -eq 2 ]];then  #通过条件判断端口和进程执行的返回值.     echo "mysql is s ...

  5. 三台mysql5.7服务器互作主从配置案例

    一.架构 三台msyql服务器221,222,223,每台服务器开两个实例,3306作为主库,3307作为另外一台服务器的从库 二.每台服务器安装双实例 参照:https://www.cnblogs. ...

  6. Luogu P2595 [ZJOI2009]多米诺骨牌 容斥,枚举,插头dp,轮廓线dp

    真的是个好(毒)题(瘤).其中枚举的思想尤其值得借鉴. \(40pts\):插头\(dp\),记录插头的同时记录每一列的连接状况,复杂度\(O(N*M*2^{n + m} )\). \(100pts\ ...

  7. DevExpress Winforms Controls:安装使用系统要求文档

    [DevExpress WinForms v19.1下载] 本文档包含了有关安装和使用DevExpress WinForms控件的系统要求信息. .NET Framework 下图展示了支持的.NET ...

  8. 浅析为什么用高阶组件代替 Mixins

    转载来源 感谢分享 Mixins 引入了无形的依赖 应尽量构建无状态组件,Mixin 则反其道而行之 Mixin 可能会相互依赖,相互耦合,不利于代码维护 不同的 Mixin 中的方法可能会相互冲突 ...

  9. Hystrix——让你的服务更稳一点

    摘要: 1.为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流 ...

  10. HBase(1.0.2) API数据模型

    几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...