NATSを使ったPub/Subメッセージングを試してみる

NATSとは

Goで書かれたメッセージングシステムです。 NATSサーバーとNATSクライアントとして提供されており、クライアントライブラリは様々なプログラミング言語で利用可能です。 設計思想: ・ハイパフォーマンス ・高可用性 ・超軽量 ・QoSサポート ・同期・非同期メッセージングのサポート 主要な機能としては下記があります。 ・pub-sub ・クラスタリング ・クライアントの自動剪定 ・テキストベースプロトコル ・QoS ・サブスクリプションの維持(NATSストリーミング限定) ・イベントストリーミング(NATSストリーミング限定) ・メッセージキャッシング(NATSストリーミング限定)

Pub-Subモデル概念図

※上図ではより一般的な呼び名としてトピックを使い、NATSではルーティングするためのチャンネルをサブジェクトと呼びます。 Pub-Subは馴染みが無かったので、初めて聞いた時にパッとRSSが頭に浮かびました。 サブスクライバはトピックに対して配信申し込みをしてトピックが更新されるのを待ちます。 パブリッシャーはトピックに対して更新をかけ、トピックに更新があったらNATSサーバーが更新待ちしているサブスクライバに更新内容を送信します。パブリッシャーは同時にサブスクライバにもなれます。 1:Nの通信に向いている構造ですね。

Pub-Subデモ

NATSのページに分かりやすいデモがあるので試してみます。

サブスクライバの設定

サポート企業が準備したNATSサーバーに接続します。 ターミナルを開いて下記コマンドを実行します。 コマンド
telnet demo.nats.io 4222
結果
Trying 107.170.221.32...
Connected to demo.nats.io.
Escape character is '^]'.
INFO
{"server_id":"Fzwx2ndlHFg3lvVwwdBRSe","version":"0.9.6","go":"go1.7.4","host":"0.0.0.0","port"4222,"auth_required":false ,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576}
goのバージョンとか色々出てますね。 さっそくサブスクライバの設定をします。 コマンド
sub foo.* 90
結果。
+OK
これでパブリッシャーがfoo.*のID90のサブジェクトに何かメッセージを送れば、サブスクライバにメッセージが届くはず。

パブリッシャーの設定

サブスクライバ側のターミナルはそのままで、パブリッシャー用として別のターミナルを立ち上げてtelnetでNATSサーバーに接続します。 コマンド
telnet demo.nats.io 4222
パブリッシャーとしてHelloを送信する。 サブスクライバ側にHelloが出るはず。。。 *パブリッシャー側コマンド
pub foo.bar 5 //5まで入力したらエンター
hello
*パブリッシャー側結果
+OK
*サブスクライバ側の結果
MSG foo.bar 90 5
hello
OK!!メッセージ届きました。 別ターミナルをさらに開いてサブスクライバの数を増やしたら、複数のクライアントにまとめてメッセージが送れました。

サブスクライブの停止

サブスクライバの設定を切ってメッセージが届かないようにします。 *サブスクライバ側のコマンド
unsub 90
*サブスクライバ側の結果
+OK
*パブリッシャー側のコマンド
pub foo.bar 5 //5まで入力したらエンター
hello
*パブリッシャー側の結果
+OK
サブスクライバ側にメッセージが届かないことを確認できました!

PING/PONについて

NATSサーバーの機能として、「クライアントの自動剪定」がありますが、このデモを行なっている最中にも時間が経つとサーバーから死活監視のPINGが下記のように送られて来る時があります。
PING
これにPING(pingでも大丈夫見たい)を返さないと接続切断されますのでご注意を…

最後に

今回の調査に当たって知ったのですが、NoSQLで有名なRedisにも同様にPub-Subでメッセージングする機能があるようです(詳細には調べていませんが、なぜ実装されたのでしょうか)。 NATSのベンチマークではRedisの倍近いパフォーマンスが出ているので、単純にメッセージを送るだけならNATSの方が良いかも知れませんね。]]>

上部へスクロール