Kestrelのqueue aliasを使ってみる

ひっそりと2012年7月にリリースされた Kestrel 2.3 から queue alias という機能が実装されたようなのでどういうものか触ってみた。

Queue Aliasとは
まずはドキュメントから。

Queue Aliases
Queue aliases are somewhat similar to fanout queues, but without a required naming convention or implicit creation of child queues. A queue alias can only be used in set operations. Kestrel responds to attempts to retrieve items from the alias as if it were an empty queue. Delete and flush requests are also ignored.
https://github.com/robey/kestrel/blob/master/docs/guide.md

queue alias が fanout に近いということまではわかるが、ピンとこなくて、使い方もさっぱりわからない。

ソースコードやテストコードのreload aliasesを見てみるとだいたい以下のような機能だと読み取れる。

  • config/production.scala でエイリアスとキュー名を一対多で対応付ける。
  • エイリアスキューにメッセージを送ると、対応付けた各キュー(destinationQueues)にメッセージが配信される。

動作の確認

デフォルトの設定ファイル production.scala にエイリアス設定があるので、これをそのまま利用。
エイリアスキュー spam_all に対して、キュー spamspam0 が設定されている。

  aliases = new AliasBuilder {
    name = "wx_updates"
    destinationQueues = List("weather_updates")
  } :: new AliasBuilder {
    name = "spam_all"
    destinationQueues = List("spam", "spam0")
  }

メッセージの送信
キュー spam_all, spam, spam0 それぞれにメッセージを送信する。エイリアスキュー spam_all へ送信したメッセージが spam と spam0 の両方に配信され、残り2つは direct exchange 的にそれぞれのキューだけに配信されるはず。

$ telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set spam_all 0 0 1
a
STORED
set spam 0 0 1
b
STORED
set spam0 0 0 1
c
STORED

メッセージの受信
spam_all(alias queue)
エイリアスなので、何も配信されない

Kestrel responds to attempts to retrieve items from the alias as if it were an empty queue.

get spam_all
END

spam(destination queue)
エイリアス向けメッセージ(a)と spam 向けメッセージ(b)が配信される。

get spam
VALUE spam 0 1
a
END
get spam
VALUE spam 0 1
b
END
get spam
END

spam0(destination queue)
エイリアス向けメッセージ(a)と spam0 向けメッセージ(c)が配信される。

get spam0
VALUE spam0 0 1
a
END
get spam0
VALUE spam0 0 1
c
END
get spam0
END

ファンアウトとの比較

“spam”, “spam+alice”, “spam+bob” の3つのキューを用意し、設定ファイルで fanoutOnly = true を指定すると、”spam” キュー向けメッセージはファンアウト用キュー(キュー名の”+”が含まれている“spam+alice”“spam+bob”)にしか配信されなくなる。この配信パターンは queue alias と同じ。

queues = new QueueBuilder {
  name = "spam"
  fanoutOnly = true
}

ファンアウトの場合、クライアントがサーバーにファンアウトキューを伝えてからでないとファンアウトされない。

When a fanout queue is first referenced by a client, the journal file (if any) is created, and it will start receiving new items written to the parent queue. Existing items are not copied over.
https://github.com/robey/kestrel/blob/master/docs/guide.md

キューエイリアスの場合、配信先はサーバ設定だけに依存している。

などなど

Queue Aliases 関連コミット

他のミドルウェアの Queue Aliases

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: