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
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 5 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 5 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: