Check! Azure IoT Hub message routing と Azure Stream Analytics の使いどころ比較

こんにちは、 @dz_ こと大平かづみです。

Microsoft Azure Advent Calendar 2018 14日目の記事です。（遅くなりました :sweat_drops: ）

## Prologue - はじめに

Azure IoT Hub を勉強していて、IoT Hub からほかの Azure リソースに連携する方法として _message routing_ があることを知り、今まで使っていた Azure Stream Analytics との違いについて気になったのでまとめてみました。

## まとめ
### 所感

まとめてみた結果、IoT Hub message routing はイベント振分け、Stream Analytics はデータストリームという位置づけがしっくりきました。

とはいえ、IoT Hub message routing もデバイステレメトリも扱えるので、基本的には  IoT Hub message routing で事足りそうです。IoT Hub の料金プランの中で使え、ライフサイクルの変更や、Twin の変更などのイベント（プランの制限による※1）も扱えます。

そして、データ量が多い場合や、より柔軟なクエリ処理を行いたい場合、または IoT Hub message routing にはないエンドポイントを使いたい場合に Stream Analytics を選択するとよさそうです。

#### 処理できるメッセージ
| 項目 | IoT Hub message routing | Stream Analytics |
|------|----------------------------|-------------------|
| デバイスからのテレメトリ | 〇 | 〇 |
| デバイスのライフサイクルイベント（※1） | 〇 | △（※2） |
| Twin の変更イベント（※1） | 〇 | △（※2） |

- ※1 ライフサイクルイベントや Twin のイベントは、Free または Standard tier でのみ使えます。詳しくはこちら「[ソリューションに適した IoT Hub のレベルを選択する \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-scaling)」をご確認ください。
- ※2 各種イベントは IoT Hub message routing で Built-in Event Hub にルーティングすれば、 Stream Analytics の Input で受けとれると思います。（未検証）

#### 出力先
| 出力先 | IoT Hub message routing | Stream Analytics |
|---------|----------------------------|-------------------|
| Azure Blob Storage | 〇 | 〇 |
| Azure Service Bus Queues | 〇 | 〇 |
| Azure Service Bus Topics | 〇 | 〇 |
| Azure Event Hub | 〇 | 〇 |
| Azure Data Lake Store | × | 〇 |
| Azure SQL Database | × | 〇 |
| Power BI | × | 〇 |
| Table Storage | × | 〇 |
| Azure Cosmos DB | × | 〇 |
| Azure Functions | × | 〇 |

#### その他

| 項目 | IoT Hub message routing | Stream Analytics |
|------|----------------------------|-------------------|
| 特徴 | IoT Hub におけるメッセージルーティング | 複数の入出力に対応したデータストリーム |
| コスト | IoT Hub の料金プランに含まれる | ストリームユニットごとに時間に応じて課金 |
| レイテンシ | 低（平均 500ms 未満の増加のみ） | 低（1 秒間に数百万のデータを並列処理） |
| 時間をさかのぼって処理できる | × | 〇 |
| SLA | message routing に対する SLA はない（※3） | 〇 [SLA for Stream Analytics](https://azure.microsoft.com/support/legal/sla/stream-analytics/v1_0/) |
| 入力元 | IoT Hub のみ | Azure IoT Hub, Event Hub, Blob storage |
| 出力先 | (上述) | (上述) |

- ※3 IoT Hub 自体の SLA は「[IoT Hub の SLA](https://azure.microsoft.com/ja-jp/support/legal/sla/iot-hub/v1_2/)」をご参照ください。

## 機能紹介
### Azure IoT Hub message routing

- IoT Hub の一機能
- デバイスからのテレメトリや、イベントをルーティングする
- 出力先（エンドポイント）
  - Built-in Event Hub（IoT Hub の一部として提供される Event Hub）
  - 上述
- 専用のクエリによってフィルタリング、ルーティングを仕分けられる
  - テストメッセージで動作確認可能
- Fallback route: クエリにマッチしなかったメッセージの収集
- diagnostic settings や Azure Monitor でモニタリング可能
  - 参考: [Azure IoT Hub の正常性の監視 \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-monitor-resource-health)

詳細は「[Azure IoT Hub メッセージ ルーティングについて \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-messages-d2c)」にまとまっているので、ぜひ見てみてください。

### Azure Stream Analytics

- 様々な入力元、出力先をもつイベント処理エンジン
- 大量のデータを並列で処理でき、スケール可能、パーティション対応
- SQLライクなクエリでフィルタリング、加工、振り分けができる
- 用途
  - IoT におけるテレメトリのリアルタイム分析
  - Web のログや動向分析、など
- 入力元、出力先
  - 上述

詳細は「[Azure Stream Analytics の概要 \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/stream-analytics/stream-analytics-introduction)」をはじめとしたドキュメントをご参照ください。

## おまけ

### メッセージとテレメトリについて

余談ですが、いろいろ調べていると _messages_ と _telemetry_ という言葉が出てきて混乱しました(笑) IoT Hub では以下のような意味合いで言葉が使われているようです。


| 用語 | 説明 |
|------|-------|
| メッセージ (_messages_) | デバイス⇔クラウド間で送受信されるデータ全般を指す。テレメトリやイベントを含む。 |
| テレメトリ (_telemetry_) | デバイスから送られてくる任意のデータ。 |
| イベント (_events_) | ライフサイクルや Twin に応じたイベントの情報をもつデータ。 |

## References
### IoT Hub message routing
- [Understand Azure IoT Hub message routing \| Microsoft Docs](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messages-d2c)
- [Azure IoT Hub message routing dramatically simplifies IoT solution development \| Blog | Microsoft Azure](https://azure.microsoft.com/en-us/blog/azure-iot-hub-message-routing-enhances-device-telemetry-and-optimizes-iot-infrastructure-resources/)
- [IoT Hub message routing: now with routing on message body \| Blog | Microsoft Azure](https://azure.microsoft.com/en-us/blog/iot-hub-message-routing-now-with-routing-on-message-body/)
- [Configure message routing with Azure IoT Hub (.NET) \| Microsoft Docs](https://docs.microsoft.com/en-us/azure/iot-hub/tutorial-routing#set-up-azure-stream-analytics)

### Stream Analytics

- [Azure Stream Analytics Documentation - Tutorials, API Reference \| Microsoft Docs](https://docs.microsoft.com/en-us/azure/stream-analytics/)
- [Understand inputs for Azure Stream Analytics \| Microsoft Docs](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-add-inputs)
- [Understand outputs from Azure Stream Analytics \| Microsoft Docs](https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-define-outputs)

### Others

- [Triggers and bindings in Azure Functions \| Microsoft Docs](https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings)

## Epilogue - おわりに

IoT Hub message routing を活用すれば、Stream Analytics を動かしてると課金が…という心配も減りますね！

適材適所で使っていきましょう～ :ok_woman: