本文介绍了消息队列的概念,并讨论了三个具体的消息队列服务的优势和劣势:Beanstalkd,IronMQ和Amazon SQS。
本文所述的任何信息是正确的在撰写本报告时,可予更改。
队列允许你存储元数据在稍后的日期处理作业。 他们可以在SOA(面向服务架构)的发展,通过提供灵活的任务交由独立的进程帮助。 如果应用得当,队列可以通过减少加载时间大大提高网站的用户体验。
任何耗时的过程可以被放置在队列中:
您还可以使用以创造性的方式队列 - 锁紧作业,以便只有一个用户可以在同一时间访问信息
还有,你可以用它来实现消息队列的许多服务,本文概述了Beanstalkd,IronMQ和Amazon SQS之间的差异。
Beanstalkd是“...一个简单,快速的工作队列”。 它被释放为在MIT许可下开源。 这是有据可查的,单元测试,可以免费下载到自己的服务器上运行。 该架构是从借来的memcached ,它是专为一个消息队列。
通过笔者对SitePoint的文章戴维·肯尼迪被称为巨人杀戮与Beanstalkd包含有关如何开始使用Beanstalkd使用Ruby的 信息。
IronMQ是一个托管的REST风格的Web服务。 有一个自由层的开发人员和许多其他认购层为商业应用。
亚马逊SQS是一种廉价的用于实现消息队列的托管解决方案。 它配备的亚马逊网络服务(AWS)的一部分。 亚马逊提供免费二级评估其Web服务,其中包括SQS。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
自托管 | 远程托管 | 远程托管 |
在Linux和Mac OS X上运行的阅读从Beanstalkd网站安装说明 ,了解有关如何得到它在您的系统上的细节。 该Beanstalkd服务器不工作在Windows。
IronMQ和Amazon SQS是基于云的Web服务。 没有应用程序需要安装在服务器上,你只需要注册一个帐户,并设置一个队列。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
无 | 每月99.95% | 无 |
由于Beanstalkd是你的主机服务器,你有责任确保其可用性。
Iron.IO有一个服务水平协议至少为99.95%,在任何包月计费周期的正常运行时间的百分比。 其临铂金包($ 2450/month)定制合同条款,其中包括服务水平协议。 他们提供的服务积分返还。
亚马逊没有为SQS特定的服务级别协议。 他们确实有支持服务 ,可以支付额外费用包括SQS提供。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
PUSH(插座) | HTTP Web服务 | HTTP Web服务 |
通过PUSH插槽,分别提供供应商和工人之间的即时通讯沟通。
当供应商加入队列的作业,一个工人可以立即保留它,如果它是连接并准备就绪。 乔布斯被保留,直到工人发送响应(删除,掩埋等)
SQS是一个托管的REST风格的Web服务。
这里是IronMQ推样的支持。 一个用户可以被称为每当提供商加入队列的作业队列。 一般来说,你将要使用的,而不是推方法标准的RESTful服务,入队和出队的工作。
SQS是一个托管的Web服务。
这里是SQS不推支持。 你必须轮询定期检查是否有队列中的作业。
SQS可以使用长轮询称为Message Receive Wait Time (默认值:0秒,最大20秒)保持连接打开,而工人等待工作。 这可能意味着更少的请求和更长的插座开放时间。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
开源 | 官方 | 官方 |
有很多开源的Beanstalkd客户端库的编程语言无数可用。 这些都是从Beanstalkd所有独立的项目。
该IronMQ客户机库被Iron.IO提供,并且可以从开发中心下载。
您还可以使用Beanstalkd客户端库与IronMQ不支持:(踢,埋葬如)但是,一些命令,如果你想的两个服务之间切换的灵活性。 您还可能需要手动执行OAuth的命令连接到该服务。
在AWS的客户端库 ,包括SQS客户端库。 这些都是由亚马逊提供的,并且可在许多编程语言。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
开源 | 仪表盘 | 控制台 |
没有图形管理界面在默认情况下分配。 有一些开源项目,以帮助调试和管理,可以在上找到Beanstalkd工具页面 。
该IronMQ仪表盘管理队列。 它包含一个有用的教程介绍如何安装到队列,并告诉您如何工作(IronMQ:消息)通过添加卷曲到一个队列。
该接口允许您管理您的队列在AJAX驱动的网站。 您可以创建,读取和删除作业,查看历史信息,并从仪表板视图管理队列配置。
在AWS管理控制台允许您管理SQS。 该接口是建立在一种无状态的协议之上的,所以你需要按刷新按钮起床最新信息。
您可以创建,读取和删除作业(SQS:消息)和管理队列配置。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
客户端 | 基于云计算的 | 基于云计算的 |
冗余是在客户端处理,如果一台服务器出现故障,您将失去工作。
Beanstalkd还带有一个选项来储存工作在二进制日志中。 你必须启动Beanstalkd与-b选项,但是恢复队列是手动的任务,需要访问服务器的磁盘。
IronMQ是一个基于云的服务具有高持久性,可用性和冗余性。
乔布斯被存储在多个服务器上的托管区。 这种方法可以确保服务和就业机会的可用性应该永不丢失。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
无 | 象征 | 键和秘密 |
无需验证连接到Beanstalkd。 供应商可以入队的工作和工人都能够保留职位不经过安全模型。 出于这个原因,我们强烈建议创建一个防火墙阻止外部连接到Beanstalkd上运行的端口。
您可以通过项目设置邀请协作者使用你的消息队列。 验证应用程序是通过一个Iron.IO令牌和一个项目的ID完成的。
认证SQS是通过亚马逊的API密钥和秘密实现。 可以将权限授予及撤销其他AWS账户通过AWS管理控制台访问您的队列。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
快 | 网络延迟 | 网络延迟 |
Beanstalkd是非常快的,因为它应该是相同的网络作为其供应商和工人。 Beanstalkd有时可以如此之快,如果一个供应商将作业在队列中,并通过调用MySQL的紧随其后,一个工人可以拿起你的工作之前,MySQL已经执行完毕。
要求有增加的延迟,因为它们是通过HTTP发送到IronMQ REST风格的Web服务。
请求具有增加的延迟,因为它们是通过HTTP发送到SQS web服务。
乔布斯可能不会被拾起直线距离,因为他们需要分布在不同的服务器和数据中心。 这种延迟可以忽略不计,如果该应用程序,供应商或工人被托管在EC2实例。
当你排队一个工作SQS,它可能不是立即可用。 乔布斯必须传播到其他服务器。 通常有一秒钟的等待至多。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
FIFO | FIFO | 无担保 |
Prioritisable | 没有优先级 | 没有优先级 |
队列是FIFO(先入先出)。 乔布斯具有较高的重要性可以优先将影响其作业出列的顺序。
队列是FIFO(先入先出)。 乔布斯无法优先。
乔布斯将不出来的,因为它们进入队列的顺序相同。 因为SQS是一种分布式服务,就业机会将在每个服务器上在不同的时间。 这是值得深切体会设计的SQS时。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
保证 | 保证 | 不能保证 |
一次性皮卡描述的限制,除非工人超时,两个或更多的工人将永远并行运行同样的工作。
Beanstalkd的插座式架构,确保一次性皮卡。
IronMQ保证一次性皮卡。
因为SQS是一个分布式的服务,也不能保证一次性皮卡(但不太可能)。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
僵尸插座 | 超时 | 超时 |
乔布斯会自动返回到队列,如果一个工人不来Beanstalkd内设定的时间值或如果套接字没有响应工作关闭没有响应。
这是当时准备立即回升的下一个要求工人(它不需要被踢)。
工人连接到队列和预定的作业。 从这一刻起,劳动者有时间来从队列中删除作业的一组量,它被释放前,可用工人再次预约。
Beanstalkd | IronMQ | 亚马逊SQS |
---|---|---|
自动 | 自动和手动 | 手册 |
队列(Beanstalkd:管)是在作业排队自动创建。 他们不需要手动创建。
需要你在仪表板创建一个项目 。 一个项目包含许多队列。 队列可以是当作业被排队或手动从仪表板配置创建自动创建。
队列必须手动设置为从SQS AWS管理控制台。 每个队列将产生它作为队列名唯一的URL。
请注意该地区(如:我们西北 - 1,欧盟西北-1等),该队列属于,因为它是需要连接到SQS。
该Laravel框架具有优良的内置包装它封装了消息队列的Beanstalkd,IronMQ和Amazon SQS。 您可以通过配置改变服务器而无需更改任何应用程序。
这些代码示例显示了如何连接到服务器,入队,储备并从队列中取出一份工作。 如果抛出一个异常,它会埋葬的工作(如果服务器支持的话)。
请尝试停止工作后,执行已排队和使用的管理工具来调试你的队列中。
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(); } }
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(); } }
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都有自己的长处和短处,可用于你的优势。 这篇文章应该为您提供足够的信息,以帮助您做出明智的决定为哪个服务是最适合你的技能水平和项目需求。
这消息队列服务,将您使用? 如果您当前使用的队列,你会考虑换? 你已经使用消息队列中一种非常规的方式,可以帮助别人呢? 发表评论,让大家都知道。