読者です 読者をやめる 読者になる 読者になる

beanstalkd

ジョブキューサーバー。
Gearmand と同じような機能で、設定が簡単な印象。

クライアントライブラリは、様々な言語に用意されており、困ることはない。Node.jsにも用意されている。

AWS Elastic Beanstalk とは関係ありません!

http://kr.github.com/beanstalkd/

キューはメモリ上に貯まるが、binlogの設定をすれば、再起動時もキューがクリアされない。

設定ファイル

# vi /etc/sysconfig/beanstalkd

再起動時もキューがクリアされなくなる

BEANSTALKD_BINLOG_DIR=/var/lib/beanstalkd/binlog

実際に利用した例

iPhone へプッシュ通知を行う時に利用した。

クライアントライブラリは、今回 PHPの pheanstalk を使用した。
pheanstalkでは、複数のホスト、ポートを指定することができないようだが、
ライブラリによっては複数サーバーを指定できるので、処理を分散させることもできるようだ。

beanstalkd自体は、1つ起動。ワーカーを複数起動させる。daemontools を利用し、ワーカーを起動。プロセスが何らかの理由で終了した場合、daemontoolsによって再起動されるようにした。

サンプル

下はかなり簡易にしたコード。実際には例外処理や、ログ保存を行った。
Tubeという設定で、取得するデータをフィルタすることができるので、namespaceとして利用してみた。

enqueue
$talk = new Pheanstalk ($host, $port);
$talk->useTube ($namespace);

$text = serialize ($data);
$talk->put ($text);
dequeue
$talk = new Pheanstalk ($host, $port);
$talk->watch ($namespace);

while (true) {
  $job = $talk->reserve();
  $text = $job->getData();

  $data = unserialize ($text);

  $talk->delete ($job);
}