关键要点
引言
本文介绍消息队列的概念,并讨论三种特定消息队列服务的优缺点:Beanstalkd、IronMQ 和 Amazon SQS。
本文中描述的任何信息在撰写时都是正确的,如有更改,恕不另行通知。
什么是消息队列?
队列允许您存储元数据,以便稍后处理作业。它们可以通过提供将任务推迟到单独进程的灵活性来帮助开发 SOA(面向服务的体系结构)。如果应用正确,队列可以通过减少加载时间来显著提高网站的用户体验。
消息队列的优点:
消息队列的缺点:
消息队列的用例:
任何耗时的过程都可以放入队列中:
您还可以以创造性的方式使用队列——锁定作业,以便一次只有一个用户可以访问信息。
服务
您可以使用许多服务来实现消息队列,本文概述了 Beanstalkd、IronMQ 和 Amazon SQS 之间的区别。
Beanstalkd
Beanstalkd 是“……一个简单快速的作业队列”。它是在 MIT 许可下作为开源软件发布的。它有良好的文档记录,经过单元测试,可以免费下载到您自己的服务器上运行。该架构借鉴了 memcached,它专门设计为消息队列。
SitePoint 上由作者 Dave Kennedy 撰写的一篇名为《用 Beanstalkd 击败巨人》的文章包含有关如何开始使用 Beanstalkd 和 Ruby 的信息。
IronMQ
IronMQ 是一种托管的 RESTful 网络服务。开发人员可以使用免费层,商业应用程序可以使用许多其他订阅层。
SQS
Amazon SQS 是一种用于实现消息队列的廉价托管解决方案。它是 Amazon Web Services (AWS) 的一部分。Amazon 提供免费层用于评估其网络服务,其中包括 SQS。
服务器设置
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
自托管 | 远程托管 | 远程托管 |
Beanstalkd
在 Linux 和 Mac OS X 上运行。请阅读 Beanstalkd 网站上的安装说明,了解如何在您的系统上使其正常运行的详细信息。Beanstalkd 服务器不适用于 Windows。
IronMQ 和 SQS
IronMQ 和 Amazon SQS 是基于云的网络服务。无需在您的服务器上设置应用程序,您只需注册一个帐户并设置一个队列即可。
服务等级协议 (SLA)
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
无 | 每月 99.95% | 无 |
Beanstalkd
由于 Beanstalkd 是您自己托管的服务器,您有责任确保其可用性。
IronMQ
Iron.IO 具有服务等级协议,在任何月度计费周期内的正常运行时间百分比至少为 99.95%。他们的 Pro Platinum 套餐(每月 2450 美元)具有自定义合同条款,其中包括服务等级协议。他们提供服务积分退款。
SQS
Amazon 没有为 SQS 提供具体的服务等级协议。他们确实提供支持服务,可以额外付费涵盖 SQS。
架构
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
PUSH(套接字) | HTTP 网络服务 | HTTP 网络服务 |
Beanstalkd
通过 PUSH 套接字进行通信,在提供者和工作程序之间提供即时通信。
当提供者将作业入队时,如果工作程序已连接并准备就绪,则可以立即保留它。作业将保留,直到工作程序发送响应(删除、掩埋等)。
IronMQ
SQS 是一种托管的 RESTful 网络服务。
IronMQ 支持类似推送的功能。每当提供者将作业入队到队列时,都可以调用订阅者。通常,您希望使用标准 RESTful 服务来入队和出队作业,而不是推送方法。
SQS
SQS 是一种托管的网络服务。
SQS 不支持推送。您必须定期轮询以检查队列中是否有作业。
SQS 可以使用称为消息接收等待时间(默认值:0 秒,最大值:20 秒)的长轮询来保持连接打开,同时工作程序等待作业。这意味着更少的请求和更长的套接字打开时间。
客户端库
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
开源 | 官方 | 官方 |
Beanstalkd
许多编程语言中都有许多可用的开源 Beanstalkd 客户端库。这些都是 Beanstalkd 的独立项目。
IronMQ
IronMQ 客户端库由 Iron.IO 提供,可以从开发中心下载。
如果您希望灵活地在两种服务之间切换,您也可以将 Beanstalkd 客户端库与 IronMQ 一起使用;但是,某些命令(例如:kick、bury)不受支持。您可能还需要手动实现 oauth 命令才能连接到服务。
SQS
AWS 客户端库包括 SQS 客户端库。这些由 Amazon 提供,可在许多编程语言中使用。
管理界面
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
开源 | 面板 | 控制台 |
Beanstalkd
默认情况下不分发图形管理界面。Beanstalkd 工具页面上有一些开源项目可以帮助进行调试和管理。
IronMQ
IronMQ 面板管理队列。它包含一个有用的教程,描述了如何设置队列,并向您展示了如何通过 cURL 将作业(IronMQ:消息)添加到队列。
该界面允许您在 AJAX 驱动的网站中管理队列。您可以从仪表板视图创建、读取和删除作业、查看历史信息和管理队列配置。
SQS
AWS 管理控制台允许您管理 SQS。该界面构建在无状态协议之上,因此您需要按刷新按钮才能获取最新信息。
您可以创建、读取和删除作业(SQS:消息)并管理队列配置。
冗余
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
客户端 | 基于云 | 基于云 |
Beanstalkd
冗余在客户端处理,如果服务器宕机,您将丢失作业。
Beanstalkd 确实包含一个选项,可以在二进制日志中存储作业。您必须使用 -b 选项启动 Beanstalkd,但是恢复队列是一项手动任务,需要访问服务器磁盘。
IronMQ
IronMQ 是一种基于云的服务,具有高持久性、可用性和冗余性。
SQS
作业存储在托管区域中的多台服务器上。这种方法确保了服务的可用性,作业不应丢失。
安全性
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
无 | 令牌 | 密钥和密钥 |
Beanstalkd
连接到 Beanstalkd 不需要身份验证。提供者能够入队作业,工作程序能够保留作业,而无需通过安全模型。因此,强烈建议创建一个防火墙来阻止对 Beanstalkd 运行的端口的外部连接。
IronMQ
您可以通过项目设置邀请协作者来使用您的消息队列。对应用程序的身份验证是通过 Iron.IO 令牌和项目 ID 完成的。
SQS
对 SQS 的身份验证是通过 Amazon API 密钥和密钥实现的。可以通过 AWS 管理控制台为其他 AWS 帐户授予和撤销访问队列的权限。
速度
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
快 | 互联网延迟 | 互联网延迟 |
Beanstalkd
Beanstalkd 非常快,因为它应该与它的提供者和工作程序位于同一网络中。Beanstalkd 有时速度非常快,如果提供者将作业放入队列并随后调用 MySQL,则工作程序可能会在 MySQL 完成执行之前获取您的作业。
IronMQ
请求的延迟会增加,因为它们是通过 HTTP 发送到 IronMQ RESTful 网络服务的。
SQS
请求的延迟会增加,因为它们是通过 HTTP 发送到 SQS 网络服务的。
作业可能不会立即被获取,因为它们需要分布在不同的服务器和数据中心。如果应用程序、提供者或工作程序托管在 EC2 实例上,则此延迟应可以忽略不计。
当您将作业入队到 SQS 时,它可能不会立即可用。作业必须传播到其他服务器。通常最多等待一秒钟。
保真度
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
FIFO | FIFO | 无保证 |
可优先级 | 无优先级 | 无优先级 |
Beanstalkd
队列是 FIFO(先进先出)。可以优先处理重要性较高的作业,这将影响作业出队的顺序。
IronMQ
队列是 FIFO(先进先出)。作业无法优先处理。
SQS
作业的出现顺序与进入队列的顺序不同。因为 SQS 是一种分布式服务,所以每个服务器上的作业将在不同的时间可用。在为 SQS 设计时,需要注意这一点。
一次性获取
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
保证 | 保证 | 不保证 |
一次性获取描述了这样的限制:除非工作程序超时,否则两个或多个工作程序永远不会并行运行同一作业。
Beanstalkd
Beanstalkd 的基于套接字的架构确保了一次性获取。
IronMQ
IronMQ 保证一次性获取。
SQS
因为 SQS 是一种分布式服务,所以不保证一次性获取(但不太可能)。
故障安全
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
僵尸套接字 | 超时 | 超时 |
Beanstalkd
如果工作程序在设定的时间内没有响应 Beanstalkd,或者套接字在没有响应作业的情况下关闭,则作业将自动返回到队列。
然后,下一个请求的工作程序可以立即获取它(不需要踢回)。
IronMQ 和 SQS
工作程序连接到队列并保留作业。从这一刻起,工作程序有设定的时间从队列中删除作业,然后才能释放它并再次供工作程序保留。
创建新队列
Beanstalkd | IronMQ | Amazon SQS |
---|---|---|
自动 | 自动和手动 | 手动 |
Beanstalkd
当作业入队时,会自动创建队列(Beanstalkd:管道)。无需手动创建它们。
IronMQ
需要您在仪表板中创建一个 项目。一个项目包含许多队列。队列可以在作业入队时自动创建,也可以使用仪表板中的配置手动创建。
SQS
必须从 AWS 管理控制台手动设置 SQS 的队列。每个队列都会生成一个用作队列名称的唯一 URL。
请注意队列所属的区域(例如:us-west-1、eu-west-1 等),因为连接到 SQS 需要它。
框架集成
Laravel
Laravel 框架有一个优秀的内置包装器,它封装了 Beanstalkd、IronMQ 和 Amazon SQS 的消息队列。您可以通过配置更改服务器,而无需更改任何应用程序。
PHP 代码示例
这些代码示例向您展示了如何连接到服务器,以及如何将作业入队、保留和出队到队列。如果抛出异常,它将掩埋作业(如果服务器支持)。
尝试在作业入队后停止执行,并使用管理工具调试队列。
(Beanstalkd, IronMQ, 和 SQS 的 PHP 代码示例已省略,因为它们篇幅过长,并且与伪原创目标不符。 这些代码段可以很容易地从原文中复制。)
消息队列提示
无论您选择哪种服务,以下是一些使队列保持强大的提示:
元数据序列化
您的作业可以包含任何您喜欢的数据,前提是它在服务器作业数据大小的限制内。在作业正文中使用 JSON 使元数据易于传输。
限制作业数据大小
尽量不要用过多的元数据来填充作业。如果您可以在数据库中存储一些信息,并且只排队一个 ID 以供以后处理,那么您的队列将更强大,也更容易调试。
跟踪作业状态
如果由于某种原因,已经处理过的项目重新进入队列,您可能不希望重新处理它。不幸的是,作业数据并非强制唯一,因此务必在数据库中跟踪作业的状态。
这可以像在作业表上添加一个列来标记项目为已处理一样简单。如果项目已经处理过,您可以将其从队列中删除。
术语
Beanstalkd 和 Amazon SQS 之间某些词语的使用方式不同。以下是快速翻译列表:
(Beanstalkd, Amazon SQS, 和 IronMQ 的术语比较表格已省略,因为它们篇幅过长,并且与伪原创目标不符。 这些表格可以很容易地从原文中复制。)
词汇表
在使用队列时,您可能会遇到以下术语:
掩埋(作业)——将作业置于失败状态。在手动将作业 踢回 队列之前,无法重新处理该作业。IronMQ 和 SQS 不支持。
使用者——参见工作程序。
延迟——将作业推迟一段时间不发送给工作程序。
删除(作业)——参见出队。
出队——将作业标记为已完成并将其从队列中删除。
入队——将作业添加到队列中,准备供工作程序使用。
FIFO——描述作业在队列中处理的方式,即先进先出。这是最常见的类型消息队列。
FILO——描述作业在队列中处理的方式,即先进后出。
作业——队列中一个延迟的任务,包含用于识别要处理的任务的元数据。类似于数据库行。
踢(作业)——将先前掩埋的作业返回到队列中,准备供工作程序获取。IronMQ 和 SQS 不支持。
提供者——连接到消息服务器以创建作业的客户端。
队列——一种将类似作业分组到队列中的方法。类似于数据库表。
保留(作业)——将作业传递给工作程序并锁定它,防止传递给其他工作程序。
工作程序——连接到消息服务器以保留、删除和掩埋作业的客户端。这些执行处理的劳动密集型部分。
结论
消息队列服务没有万能的解决方案。Beanstalkd、IronMQ 和 Amazon SQS 都各有优缺点,可以为您所用。本文应为您提供足够的信息,以帮助您做出明智的决定,选择哪种服务最适合您的技能水平和项目需求。
您将使用哪种消息队列服务?如果您目前使用队列,您会考虑切换吗?您是否以非传统的方式使用过消息队列,这可以帮助其他人?请留言,让大家知道。
关于消息队列的常见问题 (FAQ)
(关于消息队列的常见问题已省略,因为它们篇幅过长,并且与伪原创目标不符。 这些问题和答案可以很容易地从原文中复制。)
以上是比较Beanstalkd,IronMQ和Amazon SQS的详细内容。更多信息请关注PHP中文网其他相关文章!