Eclipse Hono、Apache Kafka対応でシームレスなデバイスメッセージングを実現
Eclipse Honoは、多数の異種デバイスを(クラウド)バックエンドに接続するためのオープンソースプロジェクトです。Honoはサービスインターフェースを定義し、広く異なるプロトコルを使用するデバイス間、およびビジネスアプリケーション間での統一的な通信を可能にします。プロジェクトは一部時間存在し、数年間Bosch IoT Device Managementで成功裏に使用されてきました。新しいのは、Apache Kafkaをメッセージングにサポートするようになったことです。その結果としてのメリットとHonoの利用における変更点を本記事で紹介します。
デバイスからのデータは、Honoでプロトコルアダプタ(MQTT、HTTP、CoAP用など)によって統一メッセージ形式に変換され、メッセージングシステムへ渡されます。ビジネスアプリケーションは、これらのメッセージ(テレメトリメッセージまたはイベント)をメッセージングシステムから直接読み取ります(Command and Controlを使用してデバイスへメッセージを送信し、応答を受信することも可能)。メッセージングはHonoの一部ではなく外部提供が必要ですが、これまでAMQP 1.0プロトコルが使用されてきました。
バージョン1.7から、HonoはApache Kafkaをメッセージング用にテクニカルプレビューとしてサポート。Honoの重要な機能は、メッセージングシステムへのメッセージ転送APIの定義と実装です。API定義はメッセージングに基づき、その特性に直接依存するため、新しいメッセージングシステムのサポートはHonoにとって根本的な革新です。HonoのすべてのメッセージングAPI(テレメトリ、イベント、コマンド&コントロール)について、プロトコルアダプタ側とビジネスアプリケーション側の両方で、Kafkaベースの新仕様が策定されました。AMQPベースのAPIと可能な限り同様に振る舞うよう配慮されています。
メリット
Apache Kafkaは、メッセージ順序に関する一定の保証を提供しながら、非常に高いスループット向けに設計された分散イベントストリーミングプラットフォームです。Honoのメッセージング要件に複数の理由で最適です。主なメリット:
- スケーリング:複数のKafkaサーバーがクラスタとして同時に運用され、必要に応じて拡張可能。Kafkaは多数のプロセスが同時にデータを書き込み・読み取りできるよう最適化。AMQP 1.0でも複数プロセスが同一アドレスから並列消費可能ですが、順序が失われます。
- メッセージ順序保証:Kafkaの核心機能の一つは、パーティションキーによるデータのパーティショニング。順序を維持すべきデータと並列処理可能なデータを選択可能。Honoでは、あるデバイスからのすべてのイベントをビジネスアプリケーションに正しい順序で提供しやすくなります。デバイスのテレメトリデータは並列処理可能で、その順序も保証。他のすべてのデバイスからのメッセージは、ビジネスアプリケーションの複数インスタンスが同時使用していても、完全に独立して並列消費可能。
- 幅広い採用実績:Kafkaは多数の企業で使用され、多くの技術でサポートされています。複数の企業が様々なクラウドプラットフォームでKafka-as-a-Serviceを提供。Honoにプロフェッショナルに運用されるメッセージングシステムを容易に提供可能。ベンダーロックインも回避。
変更点
AMQP 1.0はピア同士が接続してメッセージを交換する通信プロトコル。対照的に、Kafkaクラスタはデータの書き込み(と読み取り)を永続ストレージに調整するブローカーで構成。この違いには2つの帰結があります:第一に、メッセージが一定期間取得可能な状態で保存され、最終的に削除される。AMQPでHonoでこの効果を得るには、通常、ビジネスアプリケーションが一時的に利用不能でもメッセージ損失を防ぐため、イベントを格納する別のメッセージブローカーを用意します。Kafkaではすべてのメッセージが保存されます(テレメトリメッセージも含むが、保存期間はKafkaクラスタのテレメトリトピック設定に依存)。第二に、永続ストレージ経由の通信により、送信と受信操作が時間的に分離される:プロトコルアダプタは、現在コンシューマーが接続されていない場合でもデバイスへフィードバックできなくなります。代わりに、ビジネスアプリケーションがいつ読み取るかを「知らずに」メッセージを単に格納します。
試してみる
Honoインストール時、AMQPメッセージングネットワークまたはKafkaクラスタのいずれかをデプロイする必要があります。Honoを両方のメッセージングシステムで使用するように構成することも可能。各テナント(デバイスと設定のサブセット)をAMQPまたはKafkaのいずれかで使用するよう設定できます。Honoプロジェクトは、インターネット上で公開アクセス可能なサンドボックス環境を提供し、AMQPまたはKafkaベースのメッセージングでHonoを試用できます。
実践例
以下では、HonoサンドボックスでApache Kafkaベースのメッセージングを使用する小さな例を紹介します。HTTPプロトコルアダプタにテレメトリメッセージを送信し、Kafkaクラスタから読み取ります。
コマンドラインからHTTPコマンドを送信し、インターネット接続デバイスをシミュレート。一般的なオープンソースツールcurlを使用。インストールされていない場合はcurlホームページのインストール手順を参照。ビジネスアプリケーションのシミュレーションには、Honoダウンロードページから入手可能なHonoコマンドラインクライアントを使用。Java 11以上が必要です。
以下のコマンドが動作しない場合(この類の手順では常に起こりうる)、より詳細な説明を含むKafka Messaging Guideを参照してください。
デバイス登録
まず、サンドボックスで新しいテナントを作成し、他ユーザーとの干渉を防ぎます。以下のコマンドでランダムIDのテナントを作成し、メッセージングにKafkaを使用するよう設定:
$ curl -i -H "content-type: application/json" --data-binary '{
"ext": {
"messaging-type": "kafka"
}
}' https://hono.eclipseprojects.io:28080/v1/tenants
出力に {"id":"85f63e23-1b78-4156-8500-debcbd1a8d35"} のような内容が含まれるはずです。
このIDをコピーし、環境変数として設定:
$ export MY_TENANT=85f63e23-1b78-4156-8500-debcbd1a8d35
テナントのデバイスを登録:
$ curl -i -X POST https://hono.eclipseprojects.io:28080/v1/devices/$MY_TENANT
再度、返されたIDを環境変数に設定:
$ export MY_DEVICE=4412abe2-f219-4099-ae14-b446604ae9c6
最後にデバイスのパスワードを設定:
$ export MY_PWD=my-pwd
$ curl -i -X PUT -H "content-type: application/json" --data-binary '[{
"type": "hashed-password",
"auth-id": "'$MY_DEVICE'",
"secrets": [{
"pwd-plain": "'$MY_PWD'"
}]
}]' https://hono.eclipseprojects.io:28080/v1/credentials/$MY_TENANT/$MY_DEVICE
メッセージ送信
デバイス登録完了。メッセージ送受信が可能です。
2つ目のターミナルウィンドウを開き、メッセージ受信用にします。Honoコマンドラインクライアントをダウンロードしたディレクトリへ移動。以下のコマンドでクライアントを起動(my-tenantを作成したテナントIDに置換):
# hono-cli-*-exec.jar をダウンロードしたディレクトリで $ java -jar hono-cli-*-exec.jar --spring.profiles.active=receiver,sandbox,kafka --tenant.id="my-tenant"
出力に以下のような行があれば受信準備完了:
10:23:01.807 [vert.x-eventloop-thread-0] INFO org.eclipse.hono.cli.app.Receiver - Receiver [tenant: 85f63e23-1b78-4156-8500-debcbd1a8d35, mode: all] created successfully, hit ctrl-c to exit
最初のターミナルに戻り、シミュレートデバイスからHonoへメッセージ送信。以下のコマンドでHTTPプロトコルアダプタへテレメトリメッセージを送信:
$ curl -i -u $MY_DEVICE@$MY_TENANT:$MY_PWD -H "content-type: application/json" --data-binary '{"temp": 42}' https://hono.eclipseprojects.io:8080/telemetry
メッセージが2つ目のターミナルに表示されるはずです。
イベントも送信可能:
$ curl -i -u $MY_DEVICE@$MY_TENANT:$MY_PWD -H "content-type: application/json" --data-binary '{"hello": "kafka"}' https://hono.eclipseprojects.io:8080/event
デバイスからHonoへメッセージ送信し、Kafkaクラスタから受信することに成功しました。次のステップとして、HonoのKafka Messaging Guideのより詳細な例を参照できます。ビジネスアプリケーションからデバイスへコマンドを送信し、応答する方法も紹介されています。さらに深く知りたい場合は、HonoのAPI仕様にあるKafkaベースAPIの仕様を参照してください。
結論
メッセージングシステムは、Eclipse Honoのコア機能の基盤です。AMQP 1.0に加えKafkaをサポートすることは、インターフェースが相互に容易にマッピングできるよう細心の注意を払ってきたHonoにとって、非常に深い変化です。Kafkaの主なメリットは、スケーラビリティ、順序保証、幅広い採用実績、豊富な商用サービス提供。AMQPとの主な違いは、すべてのメッセージタイプがブローカー経由になること。これにより、受信側が一時的に切断されていてもメッセージ配信が可能。通信も時間的に分離されるため、メッセージ送信者への受信者からの直接フィードバックは不可能になります。簡単な実践例で、シミュレートデバイスからHonoサンドボックスへメッセージ送信し、Kafkaクラスタから消費する方法を示しました。
産業技術
- 元素および高温超伝導体の臨界温度(ケルビン)
- 絶縁体の耐電圧 — 電気エンジニア必携のキーデータ
- 必須微分ルール:クイックリファレンス
- 基本的な原始関数ルール:定数、和、差
- Eclipse Hono、MongoDBベースのデバイスレジストリを導入——スケーラブルで本番対応
- Eclipse Hono 1.0.0リリース:統合オープンソースIoT接続プラットフォーム
- 過酷環境向け堅牢PCB:設計、メリット、アプリケーション
- 製造向けPCB設計の最適化:主要戦略とベストプラクティス
- 5G時代のPCB製造:トレンドと課題
- インダストリー4.0をマスターする:ビジネスを未来対応させる実証済みのステップ
- Eclipse HonoでのX.509証明書によるセキュアなデバイス認証