`
gaojingsong
  • 浏览: 1210333 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【消息队列之Beanstalk】

阅读更多

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或者其他语言作为消费者来处理

  • 大小: 20.5 KB
0
0
分享到:
评论

相关推荐

    beanstalk_console, Beanstalk队列服务器的管理控制台.zip

    beanstalk_console, Beanstalk队列服务器的管理控制台 控制台 管理控制台,用于 Beanstalk 队列服务器,用PHP编写。 功能所有用户配置中的服务器通用列表 可选的基本认证全局服务器列表可以通过BEANSTALK_SERVERS...

    beanstalk扩展连接beanstalkd的php示例程序-Beanstalk.zip

    关于beanstalk博客中有文章介绍了beanstalkd消息队列服务端的安装,以及php里关于beanstalk扩展的安装,有两种方式,我使用的是第二种connect方法连接服务端,并使用php安装扩展不采用php类文件。当前已安装好bean...

    Go-跨平台基于Web的Beanstalk队列服务器控制台

    Beanstalk是一个轻量级、高性能的工作队列系统,常用于处理异步任务和分布式系统的消息传递。 Beanstalk队列服务器是一种开源的、基于TCP协议的简单工作队列服务。它的设计目标是快速、低延迟地处理大量的工作项,...

    Python库 | beanstalk_dispatch-0.0.4-py2.py3-none-any.whl

    在实际应用中,`beanstalk_dispatch`库可以广泛应用于各种场景,例如Web服务后台的任务调度、大数据处理中的任务分发、消息队列服务的实现等。通过这个库,开发者可以轻松地将任务队列引入到项目中,提高程序的并发...

    beanstalk_console:Beanstalk队列服务器的管理控制台

    Beanstalk控制台 队列服务器的管理控制台,用PHP编写 特征配置中所有用户的服务器的通用列表+可选的基本身份验证可以通过BEANSTALK_SERVERS环境变量设置全局服务器列表每个用户都可以添加自己的个人Beanstalkd服务器...

    beanstalk通讯协议

    Beanstalk是一种简单高效的工作队列系统,主要应用于异步任务处理场景。Beanstalk通过一种简洁的文本协议进行通信,该协议基于ASCII编码,运行于TCP之上。客户端负责主动建立连接、发送命令与数据、等待响应以及关闭...

    自己手动封装beanstalk单列类

    自己手动封装的单列beanstalk类,如有问题可以联系我。注意:去使用 composer下载pheanstalk的基类。 composer require pda/pheanstalk

    Beanstalk 队列服务器控制台 Aurora-Console.zip

    aurora 是一个 Golang 编写的基于 Web 的 Beanstalk 消息队列服务器管理工具,单文件无需依赖其他组件,支持管理本地和远程多个队列服务器。 特点- 跨平台支持 macOS/Linux/Windows 32/64-bit- 单文件简单易部署- ...

    基于beanstalk封装的php分布式发布订阅消息系统.zip

    Beanstalk是一个轻量级、高性能的分布式工作队列系统,它的设计目标是使部署和使用变得极其简单。在这个项目中,Beanstalk被用作消息中间件,实现任务的发布与订阅功能。PHP作为服务器端脚本语言,通过封装Beanstalk...

    beanstalk的PHP扩展程序V1.2.1及PHP连接beanstalk的测试应用程序

    beanstalk的PHP扩展程序V1.2.1及PHP连接beanstalk的测试应用程序。Beanstalkd本身是一个独立的消息队列服务,它并不直接提供“扩展”的概念,如我们常见的软件扩展库(如PHP扩展)。但是,为了与Beanstalkd进行交互...

    Amp-beanstalk.zip

    Beanstalk是一种轻量级的分布式工作队列系统,常用于处理后台任务,如批量数据处理、发送电子邮件等。在PHP中,使用Amp-beanstalk客户端可以实现异步提交任务到Beanstalk队列,并在后台执行这些任务,而不会影响网站...

    beanstalk-pool:基于comom-pool的beanstalk的客户端

    在处理大量并发任务时,使用连接池管理Beanstalk连接是最佳实践之一。在使用过程中,合理配置连接池参数、正确处理异常以及有效地发布和消费任务是关键,这将直接影响到整个系统的稳定性和效率。

    elasticbeanstalk-worker-simulator:在本地运行 Elastic Beanstalk 工作线程应用程序

    弹性豆茎工人模拟器AWS Elastic Beanstalk 提供了一个,可以从 AWS SQS 队列中读取并将内容发送到您正在运行的服务。 该项目模拟 AWS 在部署 Elastic Beanstalk 环境时自动为您添加的工作进程。 这样您就可以在本地...

    php的beanstalk扩展(addserver方式)所需安装程序 libbeanstalkclient 压缩包

    则需要下载安装扩展: php的beanstalk扩展(addserver方式)下载 安装这种扩展时还需要安装libbeanstalkclient,下载地址:php的beanstalk扩展addserver方式时的libbeanstalkclient 。此资源为php扩展bergundy ...

    node-beanstalk:Node.js的Beanstalk客户端

    `node-beanstalk`是Node.js开发人员与Beanstalkd集成的理想选择,其全面的API、良好的错误处理和TypeScript支持,使得在Node.js环境中构建基于任务队列的系统变得简单高效。无论你是构建微服务架构、实现异步处理,...

    AWS Elastic Beanstalk的部署环境平台相关元模型

    部署应用软件到 Beanstalk 首先需要创建一个应用,并为该应用指定一个代表 AWS 全球数据中心的区域(例如 RegionList 枚举类型中的 10 个选项之一),最后还需要为该应用指定一个名称和一个可选的描述信息。...

    Yii2 队列扩展 支持 DB、Redis、RabbitMQ、Beanstalk 和 Gearman.zip

    它支持基于DB、Redis、RabbitMQ、AMQP、Beanstalk、ActiveMQ和Gearman的队列。文档位于docs/guide/README.md。 安装安装此扩展的首选方法是通过composerphp composer.phar require --prefer-dist yiisoft/yii2-queue...

    Go-go-beanstalk是beanstalkd 的GO语言的一个客户端

    例如,你可以使用`go-beanstalk`的`Put`方法将任务放入队列,`Watch`方法来监听特定的tube,然后`Reserve`方法获取待处理的任务,最后`Delete`或`Release`方法来处理任务的完成或失败。 在实现定时任务方面,`...

    beanstalk:用于beanstalkd的简约PHP客户端,没有任何依赖关系

    Beanstalk 是一个轻量级、高性能的工作队列系统,它基于简单协议的TCP服务器实现,主要用于在分布式系统中处理大量的后台任务。而 `beanstalk` 是一个针对 Beanstalkd 的 PHP 客户端库,其特点在于简洁且无任何外部...

    yii2-queue:Yii2队列扩展。 支持DB,Redis,RabbitMQ,Beanstalk和Gearman

    它支持基于DB , Redis , RabbitMQ , AMQP , Beanstalk , ActiveMQ和Gearman的队列。 文档位于 。安装安装此扩展的首选方法是通过 : php composer.phar require --prefer-dist yiisoft/yii2-queue基本用法发送...

Global site tag (gtag.js) - Google Analytics