beanstalkd

beanstalkd概要

キューシステム

producers(生産者)とworker(労働者)がjobのやりとりをする
jobの状態は、[READY]・[RESERVED]・[DELAYED]・[BURIED]がある
2013-11-10_172554

インストール

uname -a
Linux akat 3.2.0-54-generic #82-Ubuntu SMP Tue Sep 10 20:08:42 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
vi /etc/default/beanstalkd
##################################
## Defaults for the beanstalkd init script, /etc/init.d/beanstalkd on
## Debian systems. Append ``-b /var/lib/beanstalkd'' for persistent
## storage.
BEANSTALKD_LISTEN_ADDR=0.0.0.0
BEANSTALKD_LISTEN_PORT=11300
# キューはメモリ上に展開するが、-bオプションでディレクトリを設定すると、ディスクにログが残り、再起動時もキューがクリアされない
BEANSTALKD_BINLOG_DIR=/var/lib/beanstalkd/
DAEMON_OPTS="-l $BEANSTALKD_LISTEN_ADDR -p $BEANSTALKD_LISTEN_PORT -b $BEANSTALKD_BINLOG_DIR"

## Uncomment to enable startup during boot.
START=yes
##################################

/etc/init.d/beanstalkd start
 * Starting in-memory queueing server  beanstalkd                                                                  [ OK ]
netstat -anp | grep beanstalkd
tcp        0      0 0.0.0.0:11300           0.0.0.0:*               LISTEN      9811/beanstalkd
unix  3      [ ]         STREAM     CONNECTED     254916   9811/beanstalkd
unix  3      [ ]         STREAM     CONNECTED     254915   9811/beanstalkd

producers用コマンド

telnet localhost 11300 # ★beanstalkdに接続する

# キューにjobを登録する
# put <pri> <delay> <ttr> <bytes>\r\n
# <data>\r\n
# <pri> 優先度。整数値2**32以下の値で小さいほうが優先される
# <delay> readyキューに入るまでに待つ時間。このときは”delayed”状態と呼ぶ
# <ttr> workerがこのjobを処理するために許可する秒数。workerがreserveしてからカウントが開始される
# この秒数の間に、delete, release, buryされなければ、jobをタイムアウトし、releaseする。最小値1、clientが0を送ってきても1に変更する
# <bytes> jobのbodyの容量数(bytes)
# <data> jobのbodyの文字列
put 1024 10 10 5 # ★キューにjobをいれる
job01 # データ(上で指定したbytes数ぴったりでないと問題と入力を受け付けなかったため注意)
INSERTED 1

use tube1 # ★putするtubeの指定、なければtube名defaultに入る
USING tube1
list-tube-used # ★利用しているtubeの表示
USING tube1
put 1024 10 10 5
job02
INSERTED 2
put 1024 10 10 5
job03
INSERTED 3

worker用コマンド

基本的に”reserve”, “delete”,”release”, and “bury”を利用してjobを操作する
※コマンドは★マーク付き

telnet localhost 11300 # ★beanstalkdに接続する

reserve # ★jobをreserveする。多くのjobがあった場合は一番小さいpriを持つものを返却する、priが同じであれば、最初に受け取ったjobを返す
RESERVED 1 5
job01

delete 1 # ★jobをdeleteする
DELETED

★★★
watch tube1 # ★watchしたtubeはwatchリストに加えられる。reserveコマンドはwatchリストからjobを取得する。tube名defaultは最初からwatchしている ※deleteはwatchしていなくても削除可能
WATCHING 2
list-tubes-watched # ★現在クライアントからwatchedされているtubeのlistを返す
OK 22
—
- default
- tube1

その他コマンド

telnet localhost 11300 # ★beanstalkdに接続する

stats # ★システム全体の統計情報
OK 807
---
current-jobs-urgent: 0 # priority < 1024 であるready jobの数
current-jobs-ready: 2 # ready queueに入っているjob数
current-jobs-reserved: 0 # すべてのクライアントからreservedされているjob数
current-jobs-delayed: 0
current-jobs-buried: 0
cmd-put: 3 # putコマンド累計数
cmd-peek: 0 # peekコマンド累計数
cmd-peek-ready: 0 # peek-readyコマンド累計数
cmd-peek-delayed: 0
cmd-peek-buried: 0
cmd-reserve: 1
cmd-reserve-with-timeout: 0
cmd-delete: 1
cmd-release: 0
cmd-use: 1
cmd-watch: 1
cmd-ignore: 0
cmd-bury: 0
cmd-kick: 0
cmd-touch: 0
cmd-stats: 1
cmd-stats-job: 0
cmd-stats-tube: 0
cmd-list-tubes: 0
cmd-list-tube-used: 2
cmd-list-tubes-watched: 1
cmd-pause-tube: 0
job-timeouts: 1 # タイムアウトしたjobの累計数
total-jobs: 3 # 生み出したjobの累計数
max-job-size: 65535 # jobの最大サイズ(byte)
current-tubes: 2
current-connections: 1 # 現在開いている接続数
current-producers: 0 # 少なくとも1回以上putコマンドを実行した現在接続している数
current-workers: 1 # 少なくとも1回以上reserveコマンドを実行した現在接続している数
current-waiting: 0 # reserve commandを発行して、レスポンスを待っている現在接続している数
total-connections: 2 # 累計接続数
pid: 10120
version: 1.4.6
rusage-utime: 0.004000 # このプロセスが利用したuserCPU時間
rusage-stime: 0.000000 # このプロセスが利用したsystemCPU時間
uptime: 497
binlog-oldest-index: 1
binlog-current-index: 1
binlog-max-size: 10485760

list-tubes # ★存在するtubeを表示する
OK 22
—
- default
- tube1

stats-tube tube1 # ★tubeの確認
OK 249
---
name: tube1 # tube名
current-jobs-urgent: 0 # priority < 1024 であるready jobの数
current-jobs-ready: 2 # ready queueに入っているjob数
current-jobs-reserved: 0 # すべてのクライアントからreservedされているjob数
current-jobs-delayed: 0
current-jobs-buried: 0
total-jobs: 2 # このtubeで生み出されたjobの累計総数
current-using: 0 # このtubeに接続している数
current-watching: 1
current-waiting: 0 # reserve commandを発行して、レスポンスを待っている状態の接続している数
cmd-pause-tube: 0 # このtubeにて実行したpause-tube commandsの累計数
pause: 0 # このtubeでのpauseされた秒数
pause-time-left: 0 # pause解除までの秒数

use tube1
peek-ready # ★次のready jobidを返す (peek:のぞく)
FOUND 2 5
job02
peek-delayed # ★次のdelayedされたjobidを返す
NOT_FOUND
peek-buried # ★次のburiedされたjobidを返す
NOT_FOUND
peek 2 # ★jobidを返す
FOUND 2 5
job02

stats-job 2 # ★jobの統計情報を表示する
OK 140
---
id: 2
tube: tube1 # このjobが含まれているtube名
state: ready # “ready” or “delayed” or “reserved” or “buried”
pri: 1024 # put,release,buryコマンド時に入力されたpriority値
age: 892 # putコマンドでこのjobができてから経過した秒数
delay: 10
ttr: 10
time-left: 0 # サーバがこのjobをready queueにputしてから、残された秒数?
reserves: 0 # このjobがreservedされた回数
timeouts: 0 # このjobがreservedされたときにタイムアウトした回数
releases: 0 # このjobがreservedされたときにreleaseした回数
buries: 0 # このjobがburiedされた回数
kicks: 0 # このjobがkickedされた回数

quit # ★終了する
Connection closed by foreign host.

キューの可視化

beanstalk_console

https://github.com/ptrofimov/beanstalk_console

wget -d https://github.com/downloads/ptrofimov/beanstalk_console/beanstalk_console.zip
unzip beanstalk_console.zip
chown -R www-data:www-data beanstalk_console
vi lib/include.php
# /* Write here list of your servers */ を'127.0.0.1:11300' に書き換え

・全体をみやすい(jobが追加されたときに色づけ可能)
・job追加時にprioryなども設定して投入可能
・jobの詳細情報が確認可能
2013-11-10_223858
2013-11-10_223934
2013-11-10_225620

phpBeanstalkdAdmin

http://mnapoli.fr/phpBeanstalkdAdmin/

wget -d https://github.com/mnapoli/phpBeanstalkdAdmin/tarball/master
tar xzvf master
chown -R www-data:www-data mnapoli-phpBeanstalkdAdmin-4ed210d
cd mnapoli-phpBeanstalkdAdmin-4ed210d/
vi .htaccess
# php_flagをコメントアウト

・buryできる
2013-11-10_214906

参考URL

https://github.com/kr/beanstalkd/wiki/faq

http://nubyonrails.com/articles/about-this-blog-beanstalk-messaging-queue

https://github.com/kr/beanstalkd/blob/master/doc/protocol.txt