Beanstalk is a simple, fast work queue.
Its interface is generic, but was originally designed for reducing the latency of page views in high-volume web applications by running time-consuming tasks asynchronously.
Beanstalk,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook Causes应用。
Beanstalk 是一个简单、快速的消息队列。开发语言:C/C++ , Beanstalkd之于RabbitMQ,就好比Nginx之于Apache,Varnish之于Squid。后面在项目中使用Beanstalkd的过程中,更发现其简单、轻量级、高性能、易使用等特点,以及优先级、多队列、持久化、分布式容错、超时控制等特性。
The beanstalk protocol runs over TCP using ASCII encoding. Clients connect,send commands and data, wait for responses, and close the connection. For each
connection, the server processes commands serially in the order in which they were received and sends responses in the same order. All integers in the protocol are formatted in decimal and (unless otherwise indicated)nonnegative.
设计思想
高性能离不开异步,异步离不开队列,而其内部都是Producer-Comsumer模式的原理。
Beanstalkd核心概念
Beanstalkd设计里面的核心概念:
◆ job
一个需要异步处理的任务,是Beanstalkd中的基本单元,需要放在一个tube中。
◆ tube
一个有名的任务队列,用来存储统一类型的job,是producer和consumer操作的对象。
◆ producer
Job的生产者,通过put命令来将一个job放到一个tube中。
◆ consumer
Job的消费者,通过reserve/release/bury/delete命令来获取job或改变job的状态。
Beanstalkd特性
Beanstalkd基于的源码安装和使用很简单,在此略过。这里重点介绍一下其几个很nice的特性。
◆ 优先级
支持0到2**32的优先级,值越小,优先级越高,默认优先级为1024。
◆ 持久化
可以通过binlog将job及其状态记录到文件里面,在Beanstalkd下次启动时可以通过读取binlog来恢复之前的job及状态。
◆ 分布式容错
分布式设计和Memcached类似,beanstalkd各个server之间并不知道彼此的存在,都是通过client来实现分布式以及根据tube名称去特定server获取job。
◆ 超时控制
为了防止某个consumer长时间占用任务但不能处理的情况,Beanstalkd为reserve操作设置了timeout时间,如果该consumer不能在指定时间内完成job,job将被迁移回READY状态,供其他consumer执行
简单来说流程就一句话:
由 producer 产生一个任务 job ,并将 job 推进到一个 tube 中,
然后由 consumer 从 tube 中取出 job 执行(当然了,这一切的操作的前提是beanstalk服务正在运行中)。
一个job有READY(时刻准备着被消费者取出), RESERVED(任务正在被一个消费者处理中), DELAYED(延迟任务,设定的延迟时间后进入ready状态), BURIED(休眠中,需要转移状态后才能操作)四种状态。当producer直接put一个job时,job就处于READY状态,等待consumer来处理,如果选择延迟put,job就先到DELAYED状态,等待时间过后才迁移到READY状态。consumer获取了当前READY的job后,该job的状态就迁移到RESERVED,这样其他的consumer就不能再操作该job。当consumer完成该job后,可以选择delete, release或者bury操作;delete之后,job从系统消亡,之后不能再获取;release操作可以重新把该job状态迁移回READY(也可以延迟该状态迁移操作),使其他的consumer可以继续获取和执行该job;有意思的是bury操作,可以把该job休眠,等到需要的时候,再将休眠的job kick回READY状态,也可以delete BURIED状态的job。正是有这些有趣的操作和状态,才可以基于此做出很多意思的应用,比如要实现一个循环队列,就可以将RESERVED状态的job休眠掉,等没有READY状态的job时再将BURIED状态的job一次性kick回READY状态。
Beanstalkd不足
在使用中发现一个Beanstalkd尚无提供删除一个tube的操作,只能将tube的job依次删除,并让Beanstalkd来自动删除空tube。还有就是Beanstalkd不支持客户端认证机制(开发者将应用场景定位在局域网)。
使用消息队列的10个理由:
1. 解耦
在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
2. 冗余
有时在处理数据的时候处理过程会失败。除非数据被持久化,否则将永远丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在被许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理过程明确的指出该消息已经被处理完毕,确保你的数据被安全的保存直到你使用完毕。
3. 扩展性
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的;只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。
4. 灵活性 & 峰值处理能力
当你的应用上了Hacker News的首页,你将发现访问流量攀升到一个不同寻常的水平。在访问量剧增的情况下,你的应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住增长的访问压力,而不是因为超出负荷的请求而完全崩溃。请查看我们关于峰值处理能力的博客文章了解更多此方面的信息。
5. 可恢复性
当体系的一部分组件失效,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。而这种允许重试或者延后处理请求的能力通常是造就一个略感不便的用户和一个沮丧透顶的用户之间的区别。
6. 送达保证
消息队列提供的冗余机制保证了消息能被实际的处理,只要一个进程读取了该队列即可。在此基础上,IronMQ提供了一个"只送达一次"保证。无论有多少进程在从队列中领取数据,每一个消息只能被处理一次。这之所以成为可能,是因为获取一个消息只是"预定"了这个消息,暂时把它移出了队列。除非客户端明确的表示已经处理完了这个消息,否则这个消息会被放回队列中去,在一段可配置的时间之后可再次被处理。
7.排序保证
在许多情况下,数据处理的顺序都很重要。消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。IronMO保证消息浆糊通过FIFO(先进先出)的顺序来处理,因此消息在队列中的位置就是从队列中检索他们的位置。
8.缓冲
在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行--写入队列的处理会尽可能的快速,而不受从队列读的预备处理的约束。该缓冲有助于控制和优化数据流经过系统的速度。
9. 理解数据流
在一个分布式系统里,要得到一个关于用户操作会用多长时间及其原因的总体印象,是个巨大的挑战。消息系列通过消息被处理的频率,来方便的辅助确定那些表现不佳的处理过程或领域,这些地方的数据流都不够优化。
10. 异步通信
很多时候,你不想也不需要立即处理消息。消息队列提供了异步处理机制,允许你把一个消息放入队列,但并不立即处理它。你想向队列中放入多少消息就放多少,然后在你乐意的时候再去处理它们。
11. 多语言通信,比如用php生产一个job,用python或者其他语言作为消费者来处理
相关推荐
beanstalk_console, Beanstalk队列服务器的管理控制台 控制台 管理控制台,用于 Beanstalk 队列服务器,用PHP编写。 功能所有用户配置中的服务器通用列表 可选的基本认证全局服务器列表可以通过BEANSTALK_SERVERS...
Beanstalk控制台 队列服务器的管理控制台,用PHP编写 特征配置中所有用户的服务器的通用列表+可选的基本身份验证可以通过BEANSTALK_SERVERS环境变量设置全局服务器列表每个用户都可以添加自己的个人Beanstalkd服务器...
go-beanstalk 是beanstalkd 的GO语言的一个客户端。beanstalkd是一个快速的、有各种用途的延迟队列 和定时任务的不同点: 定时任务以一定的周期或者在某个特定的时间运行。
跨平台基于Web的Beanstalk队列服务器控制台
自己手动封装的单列beanstalk类,如有问题可以联系我。注意:去使用 composer下载pheanstalk的基类。 composer require pda/pheanstalk
aurora 是一个 Golang 编写的基于 Web 的 Beanstalk 消息队列服务器管理工具,单文件无需依赖其他组件,支持管理本地和远程多个队列服务器。 特点- 跨平台支持 macOS/Linux/Windows 32/64-bit- 单文件简单易部署- ...
弹性豆茎工人模拟器AWS Elastic Beanstalk 提供了一个,可以从 AWS SQS 队列中读取并将内容发送到您正在运行的服务。 该项目模拟 AWS 在部署 Elastic Beanstalk 环境时自动为您添加的工作进程。 这样您就可以在本地...
它支持基于DB , Redis , RabbitMQ , AMQP , Beanstalk , ActiveMQ和Gearman的队列。 文档位于 。安装安装此扩展的首选方法是通过 : php composer.phar require --prefer-dist yiisoft/yii2-queue基本用法发送...
豆豆简单快速的通用工作队列。 有关网络协议的详细信息,请参阅 protocol.txt。 请注意,该项目是与贡献者行为准则一起发布的。 通过参与该项目,您同意遵守其条款。 有关详细信息,请参见CodeOfConduct.txt。快速...
beanstalk-admin是一个在 Beanstalkd 队列系统之上创建 API 的小项目。 主要目标是能够通过 REST 接口与其交互。 它是用 Golang 写的。 文档来了... 安装 创建一个配置文件(默认在/etc/beanstalk-admin/bean...
aio-豆茎aio-beanstalk 是 beanstalk 的异步客户端状态:低级协议已完全实现但未经过充分测试。 高层接口处于原型阶段。低级接口基本上它看起来像: import asynciofrom aiobeanstalk . proto import Client@ ...
它支持基于DB,Redis,RabbitMQ,Beanstalk和Gearman的队列。 文档位于docs / guide / README.md。 安装p Yii2 Queue Extension是用于通过队列异步运行任务的扩展。 它支持基于DB,Redis,RabbitMQ,AMQP,Beanstalk...
您可能想要涵盖的内容: Ruby版系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列、缓存服务器、搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用不同的标记语言。
它还支持扩展的AMQP功能,例如队列声明和消息延迟。 该软件包允许您使用使用队列互操作传输以及集成入。 优点 支持消息延迟,优先级和到期 使用DSN配置传输。 12个因素友好。 它通过几行集成代码带来了对许多MQ...
aurora 是一个基于 Web 的 Beanstalk 队列服务器控制台,用 Go 编写,适用于 macOS、Linux 和 Windows 机器。 使用 Go 进行后端开发背后的主要思想是利用编译器的能力为多个平台生成零依赖二进制文件。 创建 aurora ...
编辑S3存储桶的属性,以生成由Elastic Beanstalk创建的SQS队列的ObjectCreadted(All)事件(请勿选择名称中带有“ Dead”的队列) 将文件上传到您的S3存储桶 检查日志,您应该看到打印输出 参考 玩得开心 :)
由Beanstalk / IronMQ / SQS支持的Node.js的作业队列和计划的作业。 为什么 您的工作负载超出了Web应用程序的请求/响应周期。 一些作业已排队,一些已计划。 您决定使用Beanstalk和/或IronMQ。 现在,您需要一个简单...
aurora 是一个基于 Web 的 Beanstalk 消息队列服务器管理工具,单文件无需依赖其他组件,支持管理本地和远程多个队列服务器。 特点 跨平台支持 macOS/Linux/Windows 32/64-bit 单文件简单易部署 不依赖其他组件...
在AWS Elastic Beanstalk工作者中运行Laravel(或Lumen)任务并将侦听器排队 总览 Laravel文档建议对队列工作器使用超级用户,对计划任务使用* IX cron。 但是,将您的应用程序部署到AWS Elastic Beanstalk时,这两...
Elastic Beanstalk提供了可自动从队列中提取消息并将其转换为HTTP请求的。 这个宝石知道如何处理这些请求。 它带有一个中间件,该中间件拦截这些请求并将它们转换回随后执行的作业中。 为什么要使用这个宝石? ...