Beanstalkd - 高性能、轻量级的分布式内存队列系统

消息队列

消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:

当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。

消息队列主要解决了应用耦合、异步处理、流量削锋等问题。

当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。

其他关于消息队列的介绍可以参考以下文章。

今天主要介绍一款高性能简单的队列系统 Beanstalkd .

官网:https://beanstalkd.github.io/

Beanstalkd

Beanstalkd,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook Causes应用。其内部实现采用 libevent,服务器-客户端之间类似 memcached 轻量级 tcp 通讯协议,因此有很高的性能。

Beanstalkd 利用任务(job) 代替消息(message) 的概念,每一个任务都有以下几种状态:

  • READY:需要立即处理的任务,当延时 (DELAYED) 任务到期后会自动成为当前任务;
  • DELAYED: 延迟执行的任务, 当消费者处理任务后, 可以用将消息再次放回 DELAYED 队列延迟执行;
  • RESERVED:已经被消费者获取, 正在执行的任务。Beanstalkd 负责检查任务是否在 TTR(time-to-run) 内完成;
  • BURIED:保留的任务: 任务不会被执行,也不会消失,除非有人把它 “踢” 回队列;
  • DELETED:消息被彻底删除。

从生产者 - 消费者的角度去看状态流转:

Beanstalkd

从开发者开发的角度去看状态流转:

Beanstalkd

Beanstalkd 最大特点是基于 管道(tube)和 任务 (job)的工作队列(work-queue),支持以下特性:

  • 任务优先级(priority)
  • 延迟任务 (delay)
  • 任务超时重发(time-to-run)
  • 任务预留 (buried)

具体介绍参考 :Beanstalkd中文协议

安装

今天主要介绍一下beanstalkd的安装使用

系统CentOS7 x64

下载地址: http://kr.github.io/beanstalkd/download.html

# 最新版本 beanstalkd-1.10.tar.gz

# 解压安装

tar -xf beanstalkd-1.10.tar.gz
cd beanstalkd-1.10
make install

# 默认安装路径 /usr/local/bin/beanstalkd

启动运行

# 查看帮助
 beanstalkd -h

Beanstalkd

# 启动beanstalkd
beanstalkd -l 127.0.0.1 -p 11300 port -c -b /var/logs/beanstalkd/
关于队列持久化
  • Beanstalkd 可以开启binlog,如果遇到 Benstalkd 进程因为某些原因挂了,或者机器需要重启时,Beanstalkd 都能轻松地从 binlog 恢复这些消息。
  • beanstalkd 的 binlog 位于 -b 选项指定的文件夹中,名字就叫 binlog.$order。
  • binlog 的序号 $order 从 1 开始,逐一递增。
  • binlog 文件大小是固定的,可以通过 -s 选项指定,默认为 10M。

搭配 supervisor 管理 Beanstalkd

前面的文章已经介绍过安装supervisor的流程,这里主要介绍一下配置 Beanstalkd 服务

添加配置

vim /etc/supervisor/beanstalkd.ini

加入以下代码

 [program:beanstalkd]
command=/usr/local/bin/beanstalkd -l 127.0.0.1 -p 11300 -c -b /etc/supervisor/logs/beanstalkd/
 process_name=%(program_name)s_%(process_num)02d
numprocs=1
autostart=true
startsecs = 5
autorestart=true
startretries=3
 user=root
 stopsignal=INT
stdout_logfile_maxbytes=10MB
 stdout_logfile_backups=10
stdout_capture_maxbytes=10MB
redirect_stderr=true
stdout_logfile=/etc/supervisor/logs/beanstalkd.log

重启 supervisor

查看 beanstalkd 已经开启

Beanstalkd

项目使用

Beanstalkd 支持的语言较多,可以根据各个语言的特点使用。

参考官网:Client Libraries


本文参考 :Beanstalkd 搭配 Supervisor 的安装与使用

微信打赏微信打赏
支付宝打赏支付宝打赏

评论: