首页 >后端开发 >php教程 >比较Beanstalkd,IronMQ和Amazon SQS

比较Beanstalkd,IronMQ和Amazon SQS

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-02-22 09:48:11308浏览

Comparing Beanstalkd, IronMQ and Amazon SQS

关键要点

  • 服务设置: Beanstalkd 是自托管的,需要在 Linux 或 Mac OS X 上手动设置,而 IronMQ 和 Amazon SQS 是云托管服务,只需最少的本地设置。
  • 服务等级协议 (SLA): IronMQ 提供 99.95% 的正常运行时间 SLA,Beanstalkd 和 Amazon SQS 没有提供此类协议,后者提供可选的支持服务,需额外付费。
  • 客户端库和管理界面: Beanstalkd 支持开源客户端库,并且缺乏内置的管理界面,而 IronMQ 和 Amazon SQS 提供官方客户端库,并带有用户友好的管理面板或控制台。
  • 冗余和安全性: IronMQ 和 Amazon SQS 通过基于云的基础设施和增强的安全功能(如令牌和密钥-密钥认证)提供高冗余性,这与 Beanstalkd 的客户端冗余和缺乏内置安全措施形成对比。
  • 性能和功能: Beanstalkd 在同一网络内提供快速处理,但缺乏 IronMQ 中提供的消息优先级等高级功能。Amazon SQS 支持长轮询以减少延迟,但不保证消息检索的顺序,这与 Beanstalkd 和 IronMQ 的 FIFO 系统不同。

引言

本文介绍消息队列的概念,并讨论三种特定消息队列服务的优缺点:Beanstalkd、IronMQ 和 Amazon SQS。

本文中描述的任何信息在撰写时都是正确的,如有更改,恕不另行通知。

什么是消息队列?

队列允许您存储元数据,以便稍后处理作业。它们可以通过提供将任务推迟到单独进程的灵活性来帮助开发 SOA(面向服务的体系结构)。如果应用正确,队列可以通过减少加载时间来显著提高网站的用户体验。

消息队列的优点:

  • 异步: 立即排队,稍后运行。
  • 解耦: 分离应用程序逻辑。
  • 弹性: 如果一部分应用程序出现故障,不会使整个应用程序崩溃。
  • 冗余: 如果作业失败,可以重试。
  • 保证: 确保作业将被处理。
  • 可扩展: 许多工作程序可以处理队列中的单个作业。
  • 分析: 可以帮助识别性能问题。

消息队列的缺点:

  • 异步: 您必须等到作业完成。
  • 负载: 队列中的每个作业都必须轮流等待才能处理。如果一个作业超时,则会影响每个后续作业。
  • 架构: 应用程序需要在设计时考虑队列。

消息队列的用例:

任何耗时的过程都可以放入队列中:

  • 从第三方 API 发送/接收数据
  • 发送电子邮件
  • 生成报告
  • 运行劳动密集型流程

您还可以以创造性的方式使用队列——锁定作业,以便一次只有一个用户可以访问信息。

服务

您可以使用许多服务来实现消息队列,本文概述了 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn