Kestrel:Reliable Read

メッセージングシステムで、dequeue 後に正しく処理できずに異常終了したらどうなるのか?

Twitter などで利用されている Kestrel には reliable read という仕組みがあり、一度 dequeue したアイテムの処理中にエラーが発生しても、キューの先頭に enqueue できる。
この動作を実際に確認してみた。

Reliable Read Command

Memcached プロトコルreliable read をするには、キューからアイテムを取得する際に / に続けて以下のオプションを指定する。

  • /open : 一時的に dequeue
  • /close : dequeue を確定
  • /abort : dequeue を取り消し、queue の先頭に enqueue

Reliable Read Examples

以下の4パターンについて、キューの処理と peek の結果とジャーナルファイルへの追記を確認。

  1. reliable read を使わずに dequeue
  2. 1クライアントからの reliable read
  3. 複数クライアントからの reliable read
  4. reliable read でのアボート

Kestrel で利用されているジャーナルファイルの詳細は次のリンクを参照のこと

0. 下準備

下準備として read_test という名前のキューに a, b, c, d, e の5つを enqueue する

$ telnet localhost 2222
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
put read_test:
a
b
c
d
e
+5

この時点でのジャーナルファイルは以下の様になっている。

$ ./scripts/qdump.sh /var/spool/kestrel/read_test
Queue: /var/spool/kestrel/read_test
00000000 ADD 1
00000016 ADD 1
0000002c ADD 1
00000042 ADD 1
00000058 ADD 1

Journal size: 110 bytes, with 5 operations.
5 items totalling 5 bytes.

1. Normal Read

GET するたびに REMOVE が確定される。


2. Reliable Read

reliable read で dequeue された時点で queue からは一時的であれ削除されるため、peek すると削除後の先頭のアイテムがかえってくる。

3. Reliable Read(from multiple clients)

複数クライアントから reliable read された場合も、queue の先頭から順に dequeue される

4. Reliable Read(abort)

abort されたアイテムはキューの先頭に enqueue される


NOTE

open 数の制約
1クライアントあたり、1アイテムだけ open できる。

Only one item can be “open” per client connection.
https://github.com/robey/kestrel/blob/master/docs/guide.md

get read_test/open
VALUE read_test 0 1
a
END
get read_test/open
ERROR

close 対象の open アイテムがなかったら?

close 対象がない場合、close オプションは無視されるので、reliable read でキューを処理する設計の場合は常に /close/open のコンボで GET するとよい。

GET queu_name/close/open

The server will reject any attempt to open another read when one is already open, but it will ignore /close if there’s no open request, so that you can add /close to every GET request for convenience.

https://github.com/robey/kestrel/blob/master/docs/guide.md

get read_test/close
END
get read_test/close/open
VALUE read_test 0 1
a
END

pykestrel での reliable read 実装
pykestrel の場合、 get メソッドでは非 reliable read、 next  メソッドでは reliable read される

Advertisements
Tagged with: , ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: