目录

前文列表

快速入门分布式消息队列之 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. maven 下载源码eclipse的配置

    1.在eclipse使用maven 下载源码包需要更改 D:\apache-maven-3.2.1-bin\apache-maven-3.2.1\conf 目录下 的 settings.xml 文件, ...

  2. java gRPC四种服务类型简单示例

    一.gRPC 简介 gRPC 是Go实现的:一个高性能,开源,将移动和HTTP/2放在首位通用的RPC框架.使用gRPC可以在客户端调用不同机器上的服务端的方法,而客户端和服务端的开发语言和 运行环境 ...

  3. 81. Search in Rotated Sorted Array II (JAVA)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  4. Win7安装Visual Studio 2019闪退问题

    最近在Win7 系统上安装最新版的VS2019发现 每次在这个画面之后就闪退了,即便换了台电脑也是一样的情况,于是我意识到,这应该是系统本身的问题 经过调查发现是只需要安装两个更新就可以了 这两个更新 ...

  5. 当有多个相同的DIV时,我怎么判断我点击的是哪个

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. poj 1543 Perfect Cubes (暴搜)

    Perfect Cubes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15302   Accepted: 7936 De ...

  7. mysql5.7.26做主从复制配置

    一.首先两台服务器安装好mysql数据库环境 参照linux rpm方式安装mysql5.1 https://www.cnblogs.com/sky-cheng/p/10564604.html 二.主 ...

  8. DeepFaceLab更新至2019.12.19

    简而言之就是:人脸转换更加稳定和精确,切脸上下边界对齐,增加侧脸和嘴巴的识别面积,所以在这个版本之前的模型需要额外的训练.好消息是,如果你目前素材的嘴巴和侧脸识别有问题,可以重新提取脸部. 之前和之后 ...

  9. Vue优化首页加载速度 CDN引入

    https://blog.csdn.net/blueberry_liang/article/details/80134563

  10. Linux下lazarus交叉编译 win32[win64]

    环境 vmvare + deepin Linux64 + lazarus2.0.6 参考:https://wiki.freepascal.org/Cross_compiling_for_Win32_u ...