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

だいぶAMQPの概要が分かってきた

AMQP RabbitMQ

RabbitMQで遊び、関連ライブラリを調べているうちにだいぶAMQPの概要が分かってきた。現時点で、参考になった資料を列挙しておく。

導入・基本概念

py-amqplibのサイトから辿っていくうちにみつけたスライド。最初は読み流してしまったけど、後で見返すとAMQP, RabbitMQ, AMQPクライアント・ライブラリについて非常によくまとまっている。

クライアント・ライブラリ

実際にコードを書いて試してみるにあたっては、次の二つのページが役にたった。

前者はオフィシャルのJavaクライアント・ライブラリのドキュメント。ステップ・バイ・ステップで書いてあるので、各モデルの概念を理解するには役に立つ。Javaの例だけれども、.NET, Python, Ruby, Erlang, AS3等のAMQPライブラリはどれも同じような構成になっているので、適時読み替えればOK。

後者はRabbitMQのcontributorで、AS3のAMQPライブラリ作者であるBen Hood氏によるErlangのAMQPクライアント・ライブラリのイントロダクション。同氏によるAMQPに関するエントリはどれも至高!!

AMQPの仕様

入門記事や実装コードを読んでいると、「実際のところ、Connection, Channel, Queue, Exchange, Messageとは何だろう?」という疑問が湧いてくる。この疑問に対しては、やはりAMQPのSpecificationを読むしかないと思う。0-10のSpecificationで300ページ弱あるので、一気に読むのはなかなか難しいと思うが、序盤の"2.1 Introduction to The AMQP Model"だけでも目を通すと、プロトコルの仕様や実装に対する見通しが広がるのではないかと思う。

Pythonプログラマならばpy-amqplibのdocstringを一通り目を通すのもよい。何がMUSTで、何がSHOULDなのか簡潔にまとまっている。

AMQPの仕様に対する見通しが立った上でも、その前でもいいと思うが、上述のBen Hood氏による下記の記事は、AMQPの仕様の背景を理解する上で非常に優れたエントリで必読だと思う。

スレッド安全性に関して

Message, Queue, Exchange, bindといった比較的高次のレイヤーの概念はどの言語でも同じだと思うのだが、低次のレイヤーのConnectionとかChannelを、各言語のライブラリでどう扱えばよいのか悩むところがある(主にスレッド安全性)。最終的には、各ライブラリのドキュメントやソースコードにあたらなくてはいけないのかもしれないが、下記の記事は参考になるだろう。

周辺技術

HTTP経由でAMQPのメッセージングを行うためのバインディング。まだ試していないのでよく分からないのだが、AMQP Erlangクライアントを使って、YawsやMochiWeb等のHTTP経由でメッセージ・リレーを行うという選択をとらなかったのはなぜだろう?(JSON-RPCの関係?)

ローカルネットワークでのAMQPメッセージをリモートのブローカーにリレーするShovelというアプリケーションの紹介。これ自体は個人的には「ふーん」って感じだが、Erlangを使うとRabbitMQのプラグイン的なものが書けるのか??というのが気になるし、よく分からないところ。

Nanite is a new way of thinking about building cloud ready web applications. Having
a scalable message queueing back-end with all the discovery and dynamic load based
dispatch that Nanite has is a very scalable way to construct web application back-ends.

http://github.com/ezmobius/nanite/tree/master

ということなのだが、こういうものを何と表現するのか良く分からない。分散プログラミング?概要を読んでいて、agentとmapperの概念や、agentの生存確認の部分とかが興味深く試してみたかったのだが、手順通りに進めていって、git cloneした後でつまってしまったので、とりあえず断念した・・・(やっぱりRubyはよく分からん。)