このエントリーをはてなブックマークに追加

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とか?