sangoとmqttcliでMQTTを使うMicroServiceを作る

MicroServiceが微妙にバズりつつあるところですが、ここで sangomqttcli でMQTTを使ったMicroServiceを作ってみましょう。

  • (注意1: MicroService の定義はよく 知りません)

  • (注意2: mqttcliはわりとやっつけなところも多いので、問題がおきても広 い心で見てください)

準備

事前にちょっとした準備が必要です。

1. sangoアカウントを作成

まずは sango からアカウントを作成しま す。GitHubアカウントがあればすぐに作成できます。

ダッシュボードを開くと、

  • 接続先 : mqtt://<MQTTサーバーのアドレス>:1883

  • アクセス先トピック: shirou@github/#

  • ユーザー名: shirou@github

  • パスワード: ひみつ <-- クリックすると表示されます

という箇所がありますので、これらを覚えておきます。

2. mqttcliをダウンロード

https://github.com/shirou/mqttcli から辿れる drone.io に各種アーキテク チャ用のバイナリが置いてありますので、ダウンロードします。

必要に応じて chmod ugo+x などで実行権限を付けてください。

3. 設定ファイルを記載

~/.mqttcli.cfg を作成し、以下の内容を記載します。

{
  "host": "mqtt.shiguredo.jp", <--- MQTTサーバーのアドレス
  "username": "shirou@github",  <--- ユーザー名
  "password": "<パスワード>"
}

以上で終わりです。接続テストしてみましょう。

4. 接続テスト

mqttcli sub -t "shirou@github/#" -d

と打って、

INFO[0000] Broker URI: tcp://mqtt.shiguredo.jp:1883
INFO[0000] Connecting...
INFO[0000] Connected
INFO[0000] Topic: shirou@github/#

と出てくればOKです。

MircoServiceをつくろう

では、MicroServiceを作ってみましょう。

$ tail -f /var/nginx/access.log | mqttcli pub -t "shirou@github/nginx/log" -s

これで nginxのログを"shirou@github/nginx/log"というトピックに送る MicroServiceの出来上がりです。

別端末で以下のように入力してください。nginxのログはLTSVで記載しています。その他の人は適宜変えてください

$ mqttcli sub -t "shirou@github/nginx/log" | \
  grep "status:500" --line-buffered | \
  mqttcli pub -t "shirou@github/nginx/log/500" -s

はい、これで statusが500のリクエストだけを"shirou@github/nginx/log/500"に送る MicroServiceが出来上がりました。( --line-bufferd を付けないとバッファされてすぐには分かりません)

あとはお好きなように。例えば、ファイルに書き出してもいいですね。

$ mqttcli sub -t "shirou@github/nginx/log/500" > /var/log/error.log

もちろんこれらはすべて同じホストで実行しても構いませんし、別のホストでも構いません。

さらに

現在sangoではコネクションを6つまでしか張れません。しかし、今後予定して いる有料版ではもっと多くのコネクションが可能です(現在の予定は50本)。

そうすると、

  • 400だけじゃなくて他のステータスコードも扱う

  • 複数のサーバーのログを同じtopicに送ってまとめる

  • ファイルに書き出すだけではなく、メールしたりslackに送ったりする

などというMicroServiceを作成できます。トピックも nginx/log/4/400nginx/log/4/400 というように別々に送っておき、 nginx/log/4/# をsubscribeしてまとめる、なども出来ます。

これらのMicroServiceを topic とtopicに対する Pub/Sub 、そして #+ をいろいろな 形に組み合わせると、より多くなことが出来るのではないでしょうか。

まとめ

今回はsangoとmqttcliを使って

  1. nginxのログを送る

  2. ステータスが500のリクエストだけを取り出して送り直す

  3. 受け取ってファイルに書き出す

という3つのMicroServiceを作りました。

標準入力と出力なのでいろいろな応用が効きますね。ホストを分けてもちろん 問題ありません。しかも軽量なMQTTでレスポンスは非常に速いです。

ぜひsangoを使っていろいろなことを試してみてください!

余談

こうしてみると、MQTTはstreaming処理と相性がいいように見えてきますね。 spark streaming とか?

Comments

comments powered by Disqus