[MQTT] mqttcliとsangoでMicroServiceっぽいことをやってみる

mqttcliとsangoでMicroServiceっぽいことをやってみます。

- mqttcli: https://github.com/shirou/mqttcli
- sango: https://sango.shiguredo.jp/ (ここではライトプランを利用します)

参考: http://tdoc.info/blog/2014/09/10/micorservice.html


前提条件
========

sango
-------

sangoのアカウントを持っていて、トピックを利用できること。


mqttcli
-------

~/bin/にインストールされている。

```bash:コマンド
CMD_MQTT="${HOME}/bin/mqttcli"
```

以下のバージョンで動作確認済

* mqttcli 0.0.1

```bash:コマンド
${CMD_MQTT} -v
```

```text:結果(例):
mqttcli version 0.0.1
```


[MQTT] mqttcliをインストールしてsangoにつないでみる:  http://qiita.com/tcsh/items/0113f0517f7997b6d71c


1. 事前作業
===========


接続テスト
----------

```bash:コマンド:
CMD_MQTT="${HOME}/bin/mqttcli"
MQTT_TOPIC_ROOT=`cat ~/.mqttcli.cfg | jq -r '.username'` \
  && echo ${MQTT_TOPIC_ROOT}
${CMD_MQTT} sub -t "${MQTT_TOPIC_ROOT}/#" -d
```

```text:結果(例):
INFO[0000] Broker URI: tcp://lite.mqtt.shiguredo.jp:1883
INFO[0000] Topic: example@github/#
INFO[0000] connecting...
INFO[0000] client connected
```

上記が確認できたら、Ctrl+Cで接続を切断します。


2. sangoでトピックの作成、購読、更新
====================================

ターミナルを3つ開いて、それぞれトピックの作成、トピックの購読、トピックの更新を行なってみます。


2.1. トピックの作成 (ターミナル1)
---------------------------------

空のファイルを作成し、そのファイルが更新されたらsangoのトピックに投稿を行うプロセスを起動します。

```bash:コマンド(ターミナル1):
CMD_MQTT="${HOME}/bin/mqttcli"
MQTT_TOPIC_ROOT=`cat ~/.mqttcli.cfg | jq -r '.username'`
```

```bash:コマンド(ターミナル1):
FILE_INPUT="${HOME}/input.log"
touch ${FILE_INPUT}
tail -f ${FILE_INPUT} | ${CMD_MQTT} pub -t "${MQTT_TOPIC_ROOT}/log" -s
```


2.2. トピックの購読 (ターミナル2)
---------------------------------

トピックの購読をします。

```bash:コマンド(ターミナル2):
CMD_MQTT="${HOME}/bin/mqttcli"
MQTT_TOPIC_ROOT=`cat ~/.mqttcli.cfg | jq -r '.username'`
```

```bash:コマンド(ターミナル2):
${CMD_MQTT} sub -t "${MQTT_TOPIC_ROOT}/log" |\
  grep "status:500" --line-buffered
```


3. トピックの更新
=================


3.1.  トピック更新
------------------

トピックを更新します。

```bash:コマンド(ターミナル3):
FILE_INPUT="${HOME}/input.log"

echo 'status:500 hoge' >> ${FILE_INPUT}
echo 'status:500 hige' >> ${FILE_INPUT}
```


3.2. トピックの確認
-------------------

購読側にトピックに内容が流れてくることを確認しましょう。

```text:結果(ターミナル2):
status:500 hoge
status:500 hige
```


3.3. トピック購読の停止
-----------------------

ターミナル2でCtrl+Cを行い、接続を切断します。


4. MicroServiceっぽいことをやってみる
=====================================

statusが500のリクエストだけを"/log/500"に送るMicroServiceを作成してみます。

```bash:コマンド(ターミナル2):
${CMD_MQTT} sub -t "${MQTT_TOPIC_ROOT}/log" |\
  grep "status:500" --line-buffered |\
  ${CMD_MQTT} pub -t "${MQTT_TOPIC_ROOT}/log/500" -s
```

ターミナルを起動し、MicroServiceを利用するクライアントとして接続します。

```bash:コマンド(ターミナル4):
CMD_MQTT="${HOME}/bin/mqttcli"
MQTT_TOPIC_ROOT=`cat ~/.mqttcli.cfg | jq -r '.username'`
FILE_OUTPUT="${HOME}/sample-error.log"
${CMD_MQTT} sub -t "${MQTT_TOPIC_ROOT}/log/500" > ${FILE_OUTPUT}
```

ターミナルを起動し、クライアントが受信したトピックを表示します。

```bash:コマンド(ターミナル5):
FILE_OUTPUT="${HOME}/sample-error.log"
tail -f ${FILE_OUTPUT}
```

ログを追記してみます。

```bash:コマンド(ターミナル3):
echo 'status:200 Success' >> ${FILE_INPUT}
echo 'status:300 Redirection' >> ${FILE_INPUT}
echo 'status:400 Client Error' >> ${FILE_INPUT}
echo 'status:500 Server Error' >> ${FILE_INPUT}
```

クライアントのトピックに以下が表示されることを確認します。

```text:結果(ターミナル5):
status:500 Server Error
```


完了
====

ターミナル1、ターミナル2、ターミナル4、ターミナル5でCtrl+Cを行い、接続を切断します。