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