如何在VPS上安装和使用Beanstalkd工作队列
介绍
仔细声明应用程序部署堆栈的每个元素的职责会带来很多好处,包括在问题发生时更简单地诊断问题、快速扩展的能力以及对所涉及组件的更清晰的管理范围.
在当今的 Web 服务工程世界中,实现上述场景的关键组件涉及使用消息传递和工作(或任务)队列。 这些通常具有弹性和灵活性的应用程序易于实施和设置。 当涉及到生产时,它们非常适合在应用程序包的不同部分之间拆分业务逻辑。
在这篇 DigitalOcean 文章中,继续我们关于应用程序级通信解决方案的系列文章,我们将着眼于 Beanstalkd 来创建这种片段分离。
豆茎
Beanstalkd 最初是为了解决流行的 Web 应用程序(Facebook 上的原因)的需求而开发的。 目前,它是一个绝对可靠、易于安装的消息服务,非常适合入门和使用。
如前所述,Beanstalkd 的主要用例是通过工作队列和消息来管理应用程序部署堆栈的不同部分和工作人员之间的工作流,类似于 RabbitMQ 等其他流行的解决方案。 然而,Beanstalkd 的创建方式使其与众不同。
自成立以来,与其他解决方案不同,Beanstalkd 旨在成为一个工作队列,而不是满足许多需求的综合工具。 为了达到这个目的,它被构建为一个基于 C 编程语言的轻量级和快速运行的应用程序。 它的精简架构还允许它非常简单地安装和使用,使其非常适合大多数用例。
特征
能够使用创建时返回的返回 ID 来监控作业只是 Beanstalkd 与众不同的特性之一。 提供的其他一些有趣的功能是:
- Persistence - Beanstalkd 在内存中运行,但也提供持久性支持。
- 优先级 - 与大多数替代方案不同,Beanstalkd 为不同任务提供优先级,以便在需要时处理紧急事务。
- Distribution - 可以像 Memcached 的工作方式一样分布不同的服务器实例。
- Burying - 可以无限期推迟工作(即 一项任务)通过掩埋它。
- 第三方工具 - Beanstalkd 带有多种第三方工具,包括 CLI 和基于 Web 的管理控制台。
- Expiry - 作业可以设置为过期并稍后自动排队(TTR - 运行时间)。
Beanstalkd 用例示例
Banstalkd 的一些示例性用例是:
- 允许 Web 服务器快速响应请求,而不是被迫在现场执行大量资源的程序
- 以特定的时间间隔执行特定的工作(即 爬网)
- 将作业分配给多个工人进行处理
- 让离线客户端(例如 断开连接的用户)稍后获取数据,而不是通过工作人员永久丢失数据
- 向后端系统引入完全异步功能
- 对任务进行排序和优先级
- 平衡不同工作人员之间的应用程序负载
- 大大提高应用程序的可靠性和正常运行时间
- 稍后处理 CPU 密集型作业(视频、图像等)
- 将电子邮件发送到您的列表
- 和更多。
豆茎元素
就像大多数应用程序一样,Beanstalkd 带有自己的 行话 来解释它的部分。
管/队列
Beanstalkd Tubes 从其他消息传递应用程序转换为 队列 。 它们是通过工作(或消息)转移给消费者(即 工人)。
工作/消息
由于 Beanstalkd 是一个“工作队列”,因此通过 tubes 传输的内容称为作业 - 类似于正在发送的消息。
生产者/发件人
生产者,类似于高级消息队列协议的定义,是创建和发送作业(或消息)的应用程序。 它们将由 消费者 使用。
消费者/接收者
接收器是堆栈的不同应用程序,它们从 tube 中获取 job,由生产者创建用于处理。
在 Ubuntu 13 上安装 Beanstalkd
可以通过包管理器 aptitude
非常简单地获取 Beanstalkd 并开始使用。 但是,在一些命令中,您也可以从源代码下载并安装它。
注意: 由于各种原因,我们将在新创建的 Droplet 上执行安装并执行此处列出的操作。 如果您正在积极地为客户服务并且可能已经修改了您的系统,以不破坏任何工作并且不遇到问题,强烈建议您在新系统上尝试以下说明。
使用 aptitude 安装
运行以下命令下载并安装 Beanstalkd:
aptitude install -y beanstalkd
使用 nano
编辑默认配置以在系统启动时启动:
nano /etc/default/beanstalkd
打开文件后,向下滚动到底部,找到 #START=yes
行。 将其更改为:
START=yes
按 CTRL+X 并用 Y 确认保存并退出。
要开始使用该应用程序,请跳到下一部分或继续查看如何从源代码安装 Beanstalkd。
从源安装
我们将需要一个用于从源代码安装过程的关键工具——Git。
运行以下命令以在您的 Droplet 上获取 Git:
aptitude install -y git
下载必要的开发工具包:
aptitude install -y build-essential
使用 Git 克隆(下载)官方存储库:
git clone https://github.com/kr/beanstalkd
进入下载的目录:
cd beanstalkd
从源代码构建应用程序:
make
安装:
make install
使用 Beanstalkd
安装后,您可以开始使用 Beanstalkd 服务器。 以下是运行守护程序的选项:
-b DIR wal directory -f MS fsync at most once every MS milliseconds (use -f0 for "always fsync") -F never fsync (default) -l ADDR listen on address (default is 0.0.0.0) -p PORT listen on port (default is 11300) -u USER become user and group -z BYTES set the maximum job size in bytes (default is 65535) -s BYTES set the size of each wal file (default is 10485760) (will be rounded up to a multiple of 512 bytes) -c compact the binlog (default) -n do not compact the binlog -v show version information -V increase verbosity -h show this help
示例用法:
# Usage: beanstalkd -l [ip address] -p [port #] # For local only access: beanstalkd -l 127.0.0.1 -p 11301 &
管理服务:
如果通过包管理器安装(即 aptitude),您将能够将 Beanstalkd 守护程序作为服务进行管理。
# To start the service: service beanstalkd start # To stop the service: service beanstalkd stop # To restart the service: service beanstalkd restart # To check the status: service beanstalkd status
获取 Beanstalkd 客户端库
Beanstalkd 附带一长串支持客户端库,可用于许多不同的应用程序部署。 此支持语言列表 - 和框架 - 包括:
- Python
- 姜戈
- 去
- 爪哇
- 节点.js
- Perl
- PHP
- 红宝石
- 和更多。
有关您喜欢的支持语言和安装说明的完整列表,请查看 Github for Beanstalkd 上的 客户端库 页面。
使用 Beanstalkd
在本节中 - 在完成本文之前 - 让我们快速回顾一下 Beanstalkd 的基本用法。 在我们的示例中,我们将使用 Python 语言和 Beanstald 的 Python 绑定 - beanstalkc。
要安装 beanstalkc,请运行以下命令:
pip install pyyaml pip install beanstalkc
基本操作
在您考虑使用 Beanstalkd 的所有 Python 文件中,您需要导入 beanstalkc 并连接:
import beanstalkc # Connection beanstalk = beanstalkc.Connection(host='localhost', port=11301)
排队作业:
beanstalk.put('job_one')
接受工作:
job = beanstalk.reserve() # job.body == 'job_one'
要在处理后删除作业:
job.delete()
使用特定的管子(即 队列/列表):
beanstalk.use('tube_a')
列出所有可用管:
beanstalk.tubes() # ['default', 'tube_a']
最后一个例子(nano btc_ex.py
):
import beanstalkc # Connect beanstalk = beanstalkc.Connection(host='localhost', port=11301) # See all tubes: beanstalk.tubes() # Switch to the default (tube): beanstalk.use('default') # To enqueue a job: beanstalk.put('job_one') # To receive a job: job = beanstalk.reserve() # Work with the job: print job.body # Delete the job: job.delete()
按 CTRL+X 并用 Y 确认保存并退出。
当您运行上述脚本时,您应该会看到正在打印的作业正文:
python btc_ex.py # job_one
要了解有关 beanstalkd(和 beanstalkc)操作的更多信息,请查看其 Getting Started 教程。