热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

消息队列:比较Beanstalkd,IronMQ和AmazonSQS

本文介绍了消息队列的概念,并讨论了三个具体的消息队列服务的优势和劣势:Beanstalkd,IronMQ和AmazonSQS。

介绍

本文介绍了消息队列的概念,并讨论了三个具体的消息队列服务的优势和劣势:Beanstalkd,IronMQ和Amazon SQS。

本文所述的任何信息是正确的在撰写本报告时,可予更改。

什么是消息队列?

队列允许你存储元数据在稍后的日期处理作业。 他们可以在SOA(面向服务架构)的发展,通过提供灵活的任务交由独立的进程帮助。 如果应用得当,队列可以通过减少加载时间大大提高网站的用户体验。

消息队列的优点:

  • 异步:现在排队吧,以后再运行它。
  • 去耦:将应用程序的逻辑。
  • 韧性:如果它的一部分失败不会记下你的整个应用程序。
  • 冗余:如果他们失败可以重试作业。
  • 担保:可确保作业将被处理。
  • 可扩展性:许多工人可以在队列中处理个别工作。
  • 剖析:可帮助确定性能问题。

消息队列的缺点:

  • 异步:你必须等待,直到作业完成。
  • 负载:每个队列中的作业必须等待轮到它,然后才能进行处理。 如果一个作业超支,它影响每个后续的工作。
  • 架构:应用程序需要进行设计时考虑到队列中。

使用消息队列的情况:

任何耗时的过程可以被放置在队列中:

  • 发送/来自第三方的API接收数据
  • 发送电子邮件
  • 生成报告
  • 运行劳工密集的工序

您还可以使用以创造性的方式队列 - 锁紧作业,以便只有一个用户可以在同一时间访问信息

服务

还有,你可以用它来实现消息队列的许多服务,本文概述了Beanstalkd,IronMQ和Amazon SQS之间的差异。

Beanstalkd

Beanstalkd是“...一个简单,快速的工作队列”。 它被释放为在MIT许可下开源。 这是有据可查的,单元测试,可以免费下载到自己的服务器上运行。 该架构是从借来的memcached ,它是专为一个消息队列。

通过笔者对SitePoint的文章戴维·肯尼迪被称为巨人杀戮与Beanstalkd包含有关如何开始使用Beanstalkd使用Ruby的 信息。

IronMQ

IronMQ是一个托管的REST风格的Web服务。 有一个自由层的开发人员和许多其他认购层为商业应用。

SQS

亚马逊SQS是一种廉价的用于实现消息队列的托管解决方案。 它配备的亚马逊网络服务(AWS)的一部分。 亚马逊提供免费二级评估其Web服务,其中包括SQS。

服务器设置

Beanstalkd IronMQ 亚马逊SQS
自托管 远程托管 远程托管

Beanstalkd

在Linux和Mac OS X上运行的阅读从Beanstalkd网站安装说明 ,了解有关如何得到它在您的系统上的细节。 该Beanstalkd服务器不工作在Windows。

IronMQ和SQS

IronMQ和Amazon SQS是基于云的Web服务。 没有应用程序需要安装在服务器上,你只需要注册一个帐户,并设置一个队列。

服务级别协议(SLA)

Beanstalkd IronMQ 亚马逊SQS
每月99.95%

Beanstalkd

由于Beanstalkd是你的主机服务器,你有责任确保其可用性。

IronMQ

Iron.IO有一个服务水平协议至少为99.95%,在任何包月计费周期的正常运行时间的百分比。 其临铂金包($ 2450/month)定制合同条款,其中包括服务水平协议。 他们提供的服务积分返还。

SQS

亚马逊没有为SQS特定的服务级别协议。 他们确实有支持服务 ,可以支付额外费用包括SQS提供。

建筑

Beanstalkd IronMQ 亚马逊SQS
PUSH(插座) HTTP Web服务 HTTP Web服务

Beanstalkd

通过PUSH插槽,分别提供供应商和工人之间的即时通讯沟通。

当供应商加入队列的作业,一个工人可以立即保留它,如果它是连接并准备就绪。 乔布斯被保留,直到工人发送响应(删除,掩埋等)

IronMQ

SQS是一个托管的REST风格的Web服务。

这里是IronMQ推样的支持。 一个用户可以被称为每当提供商加入队列的作业队列。 一般来说,你将要使用的,而不是推方法标准的RESTful服务,入队和出队的工作。

SQS

SQS是一个托管的Web服务。

这里是SQS不推支持。 你必须轮询定期检查是否有队列中的作业。

SQS可以使用长轮询称为Message Receive Wait Time (默认值:0秒,最大20秒)保持连接打开,而工人等待工作。 这可能意味着更少的请求和更长的插座开放时间。

客户端库

Beanstalkd IronMQ 亚马逊SQS
开源 官方 官方

Beanstalkd

有很多开源的Beanstalkd客户端库的编程语言无数可用。 这些都是从Beanstalkd所有独立的项目。

IronMQ

该IronMQ客户机库被Iron.IO提供,并且可以从开发中心下载。

您还可以使用Beanstalkd客户端库与IronMQ不支持:(踢,埋葬如)但是,一些命令,如果你想的两个服务之间切换的灵活性。 您还可能需要手动执行OAuth的命令连接到该服务。

SQS

在AWS的客户端库 ,包括SQS客户端库。 这些都是由亚马逊提供的,并且可在许多编程语言。

管理接口

Beanstalkd IronMQ 亚马逊SQS
开源 仪表盘 控制台

Beanstalkd

没有图形管理界面在默认情况下分配。 有一些开源项目,以帮助调试和管理,可以在上找到Beanstalkd工具页面 。

IronMQ

该IronMQ仪表盘管理队列。 它包含一个有用的教程介绍如何安装到队列,并告诉您如何工作(IronMQ:消息)通过添加卷曲到一个队列。

该接口允许您管理您的队列在AJAX驱动的网站。 您可以创建,读取和删除作业,查看历史信息,并从仪表板视图管理队列配置。

SQS

在AWS管理控制台允许您管理SQS。 该接口是建立在一种无状态的协议之上的,所以你需要按刷新按钮起床最新信息。

您可以创建,读取和删除作业(SQS:消息)和管理队列配置。

冗余

Beanstalkd IronMQ 亚马逊SQS
客户端 基于云计算的 基于云计算的

Beanstalkd

冗余是在客户端处理,如果一台服务器出现故障,您将失去工作。

Beanstalkd还带有一个选项来储存工作在二进制日志中。 你必须启动Beanstalkd与-b选项,但是恢复队列是手动的任务,需要访问服务器的磁盘。

IronMQ

IronMQ是一个基于云的服务具有高持久性,可用性和冗余性。

SQS

乔布斯被存储在多个服务器上的托管区。 这种方法可以确保服务和就业机会的可用性应该永不丢失。

安全

Beanstalkd IronMQ 亚马逊SQS
象征 键和秘密

Beanstalkd

无需验证连接到Beanstalkd。 供应商可以入队的工作和工人都能够保留职位不经过安全模型。 出于这个原因,我们强烈建议创建一个防火墙阻止外部连接到Beanstalkd上运行的端口。

IronMQ

您可以通过项目设置邀请协作者使用你的消息队列。 验证应用程序是通过一个Iron.IO令牌和一个项目的ID完成的。

SQS

认证SQS是通过亚马逊的API密钥和秘密实现。 可以将权限授予及撤销其他AWS账户通过AWS管理控制台访问您的队列。

速度

Beanstalkd IronMQ 亚马逊SQS
网络延迟 网络延迟

Beanstalkd

Beanstalkd是非常快的,因为它应该是相同的网络作为其供应商和工人。 Beanstalkd有时可以如此之快,如果一个供应商将作业在队列中,并通过调用MySQL的紧随其后,一个工人可以拿起你的工作之前,MySQL已经执行完毕。

IronMQ

要求有增加的延迟,因为它们是通过HTTP发送到IronMQ REST风格的Web服务。

SQS

请求具有增加的延迟,因为它们是通过HTTP发送到SQS web服务。

乔布斯可能不会被拾起直线距离,因为他们需要分布在不同的服务器和数据中心。 这种延迟可以忽略不计,如果该应用程序,供应商或工人被托管在EC2实例。

当你排队一个工作SQS,它可能不是立即可用。 乔布斯必须传播到其他服务器。 通常有一秒钟的等待至多。

保真度

Beanstalkd IronMQ 亚马逊SQS
FIFO FIFO 无担保
Prioritisable 没有优先级 没有优先级

Beanstalkd

队列是FIFO(先入先出)。 乔布斯具有较高的重要性可以优先将影响其作业出列的顺序。

IronMQ

队列是FIFO(先入先出)。 乔布斯无法优先。

SQS

乔布斯将不出来的,因为它们进入队列的顺序相同。 因为SQS是一种分布式服务,就业机会将在每个服务器上在不同的时间。 这是值得深切体会设计的SQS时。

一次性皮卡

Beanstalkd IronMQ 亚马逊SQS
保证 保证 不能保证

一次性皮卡描述的限制,除非工人超时,两个或更多的工人将永远并行运行同样的工作。

Beanstalkd

Beanstalkd的插座式架构,确保一次性皮卡。

IronMQ

IronMQ保证一次性皮卡。

SQS

因为SQS是一个分布式的服务,也不能保证一次性皮卡(但不太可能)。

故障安全

Beanstalkd IronMQ 亚马逊SQS
僵尸插座 超时 超时

Beanstalkd

乔布斯会自动返回到队列,如果一个工人不来Beanstalkd内设定的时间值或如果套接字没有响应工作关闭没有响应。

这是当时准备立即回升的下一个要求工人(它不需要被踢)。

IronMQ&SQS

工人连接到队列和预定的作业。 从这一刻起,劳动者有时间来从队列中删除作业的一组量,它被释放前,可用工人再次预约。

创建新的队列

Beanstalkd IronMQ 亚马逊SQS
自动 自动和手动 手册

Beanstalkd

队列(Beanstalkd:管)是在作业排队自动创建。 他们不需要手动创建。

IronMQ

需要你在仪表板创建一个项目 。 一个项目包含许多队列。 队列可以是当作业被排队或手动从仪表板配置创建自动创建。

SQS

队列必须手动设置为从SQS AWS管理控制台。 每个队列将产生它作为队列名唯一的URL。

请注意该地区(如:我们西北 - 1,欧盟西北-1等),该队列属于,因为它是需要连接到SQS。

框架集成

Laravel

该Laravel框架具有优良的内置包装它封装了消息队列的Beanstalkd,IronMQ和Amazon SQS。 您可以通过配置改变服务器而无需更改任何应用程序。

PHP的代码示例

这些代码示例显示了如何连接到服务器,入队,储备并从队列中取出一份工作。 如果抛出一个异常,它会埋葬的工作(如果服务器支持的话)。

请尝试停止工作后,执行已排队和使用的管理工具来调试你的队列中。

Beanstalkd

composer.json

 { "require": { "pda/pheanstalk": "dev-master" } }

beanstalkd.php

 useTube($queue_name) ->put($job_data); /* 3. Worker */ // Loop through all jobs while ($job = $beanstalkd->watch($queue_name)->reserve(5)) { try { $job_data = $job->getData(); echo $job_data . PHP_EOL; // Dequeue a job $beanstalkd->delete($job); } catch (Exception $e) { // Bury a job $beanstalkd->bury($job); echo $e->getMessage(); } }

IronMQ

composer.json

 { "require": { "iron-io/iron_mq": "dev-master" } }

iron_mq.php

  '{token}', 'project_id' => '{project_id}' )); /* 2. Provider */ // Enqueue a job $iron_mq->postMessage($queue_name, $job_data); /* 3. Worker */ // Loop through all jobs while ($job = $iron_mq->getMessage($queue_name)) { try { $job_data = $job->body; echo $job_data . PHP_EOL; // Dequeue a job $iron_mq->deleteMessage($queue_name, $job->id); } catch (Exception $e) { // Bury a job // There is no bury in IronMQ echo $e->getMessage(); } }

SQS

composer.json

 { "require": { "aws/aws-sdk-php": "2.4.*@dev" } }

sqs.php

  '{key}', 'secret' => '{secret}', 'region' => '{region}' )); $sqs = $aws->get('sqs'); /* 2. Provider */ // Enqueue a job $sqs->sendMessage(array( 'QueueUrl' => $queue_name, 'MessageBody' => $job_data )); /* 3. Worker */ // Handle one job $result = $sqs->receiveMessage(array( 'QueueUrl' => $queue_name )); if (!$result) { // No jobs exit; } $messages = $result->getPath('Messages'); if (!$messages) { // No jobs exit; } foreach ($messages as $message) { try { $job_data = $message['Body']; echo $job_data . PHP_EOL; // Dequeue a job $sqs->deleteMessage(array( 'QueueUrl' => $queue_name, 'ReceiptHandle' => $message['ReceiptHandle'] )); } catch (Exception $e) { // Bury a job // There is no bury in SQS echo $e->getMessage(); } }

提示消息队列

无论您选择哪种服务,这里是保持你的队列健壮的一些提示:

元数据序列化

你的工作可以包含任何数据,你喜欢,只要它是服务器的作业数据大小的限制之内。 使用JSON在你的工作机构,使元数据轻松传输。

 // Encode for enqueuing: $raw_data = (object) array('id' => 100); $job_data = json_encode($raw_data); // Decode from dequeuing: $raw_data = '{"id":100}'; $job_data = json_decode($raw_data);

限制你的工作数据的大小

尽量不要到人群的工作太多的元数据。 如果你能可以在数据库中存储的一些信息,仅排队一个ID为以后处理,你的队列会更稳健,更易于调试。

 // Good: $raw_data = (object) array('id' => 100); // Not as good ... // But sometimes necessary when there is // no database access on a worker: $raw_data = (object) array( 'id' => 100, 'color' => 'black', 'background' => 'white' );

跟踪工作状态

如果由于某种原因它已经被处理的项目重新进入队列,你可能不希望它被重新处理。 不幸的是,就业数据是不是强迫是唯一的,你在数据库中跟踪作业的状态是很重要的。

这可以很简单,如对您的工作表中的列的处理,以标记一个项目。 您可以删除该作业从队列中,如果它已经被处理。

术语

有些词的使用是不同Beanstalkd和Amazon SQS之间。 有翻译的快速列表:

Beanstalkd 亚马逊SQS IronMQ
队列 队列
工作 信息 信息
招聘数据 邮件正文 邮件正文
发送消息 POST
储备 收到消息 GET
删除 删除信息 DELETE
TTR(时间 - 运行) 可见性超时 超时
延迟 交货延迟 延迟
- 保留期 在到期

词汇表

当队列的工作,你可能会遇到这些术语:

Bury (a job) -将作业处于故障状态。 作业无法进行再加工,直到它被手动踢回到队列中。 由IronMQ和SQS不支持。

Consumer -见工。

Delay -被发送到一个工人的时间预定量延迟的作业。

Delete (a job) -见出列。

Dequeue -为已完成标志着一个作业,并从队列中删除。

Enqueue -增加了一个作业队列准备好工人。

FIFO -描述作业在队列中处理为先入先出的方式。 这是消息队列中的最常见类型。

FILO -描述作业在队列中处理为先入后出的方式。

Job -在一个队列中包含的元数据的延迟任务,以确定哪些任务正在等待处理。 类似于数据库中的行。

Kick (a job) -返回以前埋作业队列准备好工人拿起。 由IronMQ和SQS不支持。

Provider -它连接到邮件服务器以创造就业机会的客户端。

Queue -一种分组相似任务到一个队列。 类似于数据库表。

Reserve (a job) -提供了一个工作给工人,被输送到另一名工人将其锁定。

Worker -它连接到邮件服务器保留,删除和埋葬工作的客户端。 这些执行的处理的劳动密集的部分。

结论

没有银弹消息队列服务。 Beanstalkd,IronMQ和Amazon SQS都有自己的长处和短处,可用于你的优势。 这篇文章应该为您提供足够的信息,以帮助您做出明智的决定为哪个服务是最适合你的技能水平和项目需求。

这消息队列服务,将您使用? 如果您当前使用的队列,你会考虑换? 你已经使用消息队列中一种非常规的方式,可以帮助别人呢? 发表评论,让大家都知道。


推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • Linux环境下Redmine快速搭建指南
    本文将详细介绍如何在Linux操作系统中使用Bitnami Redmine安装包快速搭建Redmine项目管理平台,帮助读者轻松完成环境配置。 ... [详细]
  • PHP服务器搭建的重要性及方法
    本文深入探讨了为什么在开发PHP应用之前需要搭建服务器环境,以及如何选择和搭建适合的PHP服务器。 ... [详细]
  • 本文探讨了Go语言(Golang)的学习价值及其在Web开发领域的应用潜力,包括其独特的语言特性和为什么它是现代软件开发的理想选择。 ... [详细]
  • 本文探讨了缓存系统中的两个关键问题——缓存穿透与缓存失效时的雪崩效应,以及这些问题的解决方案。此外,文章还介绍了数据处理、数据库拆分策略、缓存优化、拆分策略、应用架构演进及通信协议的选择等内容。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 我正在从数据库中提取一系列事件,并尝试加载与这些事件相关的所有用户及其个人资料。虽然用户信息能够成功加载,但用户的个人资料信息却未能一同加载。 ... [详细]
author-avatar
神秘布拉阁俱乐部
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有