简介
将事情推迟一段时间而不是立即去做,可能被认为是懒惰的。事实上,大多数情况下可能确实如此。然而,有时候这样做绝对是正确的。偶尔,需要将耗时的工作推迟一段时间;它需要被排队以便将来执行,以便处理更重要的事情。为了实现这一点,你需要一个代理:一个接受来自各种发送方(例如 Web 应用程序)的消息(例如作业、任务),将它们排队,并将它们分发给相关方(即工作者)以异步和按需地利用它们。
在这篇 DigitalOcean 文章中,我们旨在向您介绍**RabbitMQ**项目:一个开源的消息代理应用程序堆栈,它实现了高级消息队列协议(AMQP),以处理我们上面解释的整个场景。
消息传递、消息代理和队列
消息传递是一种在进程、应用程序和服务器(虚拟和物理)之间交换特定数据的方式。这些交换的消息,有助于满足某些工程需求,可以包括从纯文本消息到二进制数据块的任何内容,以满足不同的需求。为了使其工作,需要由第三方程序(中间件)管理的接口… 欢迎消息代理。
消息代理通常是应用程序堆栈,具有专门的部分来覆盖每个交换设置阶段。从接受消息到将其排队并将其传递给请求方,代理处理本来可能会使用非专用解决方案或简单的黑客(例如使用数据库、定时作业等)更加繁琐的任务。它们通过处理队列来工作,这些队列在技术上构成无限缓冲区,用于放置消息并稍后弹出和传递给自动处理或轮询。
为什么使用它们?
这些消息代理解决方案就像各种服务(例如您的 Web 应用程序)的中间人。它们可以通过将通常需要相当长时间来处理的任务委派给专门执行它们的第三方(例如工作者),从而大大减少 Web 应用程序服务器的负载和交付时间。当需要更多“有保证”的持久性来传递信息时,它们也非常方便。
何时使用它们?
总而言之,上面解释的核心功能扩展到涵盖多个领域,包括但不限于:
- 允许 Web 服务器快速响应请求,而不是被迫在现场执行资源密集型程序
- 将消息分发给多个接收者以供消费(例如处理)
- 让离线方(即断开连接的用户)在以后的某个时间获取数据,而不是永久丢失
- 为后端系统引入完全异步功能
- 对任务进行排序和设置优先级
- 在工作者之间平衡负载
- 大大提高应用程序的可靠性和正常运行时间
- 等等
RabbitMQ
RabbitMQ 是市场上较受欢迎的消息代理解决方案之一,以开源许可证(Mozilla Public License v1.1)提供,作为高级消息队列协议的实现。它使用 Erlang 语言开发,实际上相对容易使用和入门。它首次发布于 2007 年初,自那以后一直在积极开发,其最新版本为3.2.2(2013 年 12 月)。
它是如何工作的?
RabbitMQ 通过提供一个接口,将消息发送方(发布者)与接收方(消费者)通过交换(代理)连接起来,将数据分发到相关列表(消息队列)。
应用程序 交换 任务列表 工作者 [数据] -------> [数据] ---> [D]+[D][D][D] ---> [数据] 发布者 交换 队列 消费者
它与其他解决方案有何不同?
RabbitMQ,与其他一些解决方案不同,是一个完整的应用程序堆栈(即消息代理)。它为您提供了处理所需的所有工具,而不是像框架一样让您自己实现。由于其极其受欢迎,使用 RabbitMQ 并在线找到问题的答案非常容易。
高级消息队列协议(AMQP)简介
AMQP 是一个被广泛接受的开源标准,用于从源到目的地分发和传输消息。作为协议和标准,它为各种应用程序和消息代理中间件之间的互操作设置了一个共同的基础,而不会遇到由单独设置的设计决策引起的问题。
安装 RabbitMQ
RabbitMQ 软件包分发在 CentOS / RHEL 和 Ubuntu / Debian 系统上。然而,就像大多数应用程序一样,它们已经过时。因此,获取 RabbitMQ 的推荐方式是在线下载软件包并手动安装。
**注意:**由于各种原因,我们将在全新创建的 VPS 上执行我们的安装并执行此处列出的操作。如果您正在为客户提供服务并且可能已经修改了系统,为了不破坏任何正在运行的东西并避免遇到问题,强烈建议您在新系统上尝试以下说明。
在 CentOS 6 / RHEL 系统上安装
在安装 RabbitMQ 之前,我们需要先安装它的主要依赖项,比如 Erlang。然而,首先我们应该更新系统及其默认应用程序。
运行以下命令来更新我们的 droplet:
yum -y update
然后使用以下命令在我们的系统上安装 Erlang:
# 添加并启用相关的应用程序仓库: # 注意:我们还启用了第三方 remi 软件包仓库。 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm # 最后,下载并安装 Erlang: yum install -y erlang
安装完 Erlang 后,我们可以继续安装 RabbitMQ:
# 使用 wget 下载最新的 RabbitMQ 软件包: wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.2.2/rabbitmq-server-3.2.2-1.noarch.rpm # 添加用于验证的必要密钥: rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc # 使用 YUM 安装 .RPM 软件包: yum install rabbitmq-server-3.2.2-1.noarch.rpm
在 Ubuntu 13 / Debian 7 系统上安装
由于我们希望使用更近期的版本,因此在 Ubuntu 和 Debian 上下载和安装 RabbitMQ 的过程与 CentOS 类似。
让我们从更新系统的默认应用程序工具集开始:
apt-get update apt-get -y upgrade
启用 RabbitMQ 应用程序仓库:
echo "deb http://www.rabbitmq.com/debian/ testing main" >> /etc/apt/sources.list
为软件包添加验证密钥:
curl http://www.rabbitmq.com/rabbitmq-signing-key-public.asc | sudo apt-key add -
使用上述新添加的内容更新源:
apt-get update
最后,下载并安装 RabbitMQ:
sudo apt-get install rabbitmq-server
为了在启动时管理最大连接数,使用 nano
打开并编辑以下配置文件:
sudo nano /etc/default/rabbitmq-server
在保存并按下 CTRL+X 然后输入 Y 退出之前,取消注释 limit
行(即删除 #
)。
管理 RabbitMQ
正如我们之前提到的,RabbitMQ 非常容易上手。使用以下针对您的系统的说明,您可以快速管理其进程,并使其在系统启动时运行。
启用管理控制台
RabbitMQ 管理控制台 是可用的插件之一,它允许您通过基于 Web 的图形用户界面(GUI)监视 [RabbitMQ] 服务器进程。
使用此控制台,您可以:
- 管理交换、队列、绑定、用户
- 监视队列、消息速率、连接
- 发送和接收消息
- 监视 Erlang 进程、内存使用情况
- 等等
要启用 RabbitMQ 管理控制台,请运行以下命令:
sudo rabbitmq-plugins enable rabbitmq_management
启用控制台后,可以使用您喜欢的 Web 浏览器访问 http://[您的 droplet 的 IP]:15672/
。
默认用户名和密码都设置为“guest”以进行登录。
注意:如果在运行服务后启用此控制台,您需要重新启动服务以使更改生效。请参阅下面适用于您操作系统的相关管理部分。
在 CentOS / RHEL 系统上管理
安装应用程序后,默认情况下 RabbitMQ 不会在系统启动时启动。
要使 RabbitMQ 默认作为守护程序启动,请运行以下命令:
chkconfig rabbitmq-server on
要启动、停止、重新启动和检查应用程序状态,请使用以下命令:
# 启动服务: /sbin/service rabbitmq-server start # 停止服务: /sbin/service rabbitmq-server stop # 重新启动服务: /sbin/service rabbitmq-server restart # 检查状态: /sbin/service rabbitmq-server status
在 Ubuntu / Debian 系统上管理
要在 Ubuntu 和 Debian 上启动、停止、重新启动和检查应用程序状态,请使用以下命令:
# 启动服务: service rabbitmq-server start # 停止服务: service rabbitmq-server stop # 重新启动服务: service rabbitmq-server restart # 检查状态: service rabbitmq-server status
就是这样!现在您在您的虚拟服务器上拥有自己的消息队列。
配置 RabbitMQ
RabbitMQ 默认情况下以其标准配置运行。一般情况下,只要一切正常运行,它就不需要太多的调整。
要了解如何根据自定义需求进行配置,请查看其配置文档。