メッセージング用にApacheKafkaをサポートするEclipseHono
Eclipse Honoは、多数の異種デバイスを(クラウド)バックエンドに接続するためのオープンソースプロジェクトです。 Honoは、ビジネスアプリケーションだけでなく、大きく異なるプロトコルを使用する可能性のあるデバイス間の均一な通信を可能にするサービスインターフェイスを定義しています。このプロジェクトはしばらく前から存在しており、BoschIoTデバイス管理で数年間使用されています。新しいのは、メッセージング用にApacheKafkaをサポートするようになったことです。この記事では、Honoの使用によるメリットと変更点を紹介します。

デバイスからのデータは、プロトコルアダプタによってHonoで統一されたメッセージ形式に変換されます (たとえば、MQTT、HTTP、CoAp用のものがあります)そしてメッセージングシステムに渡されます。ビジネスアプリケーションは、これらのメッセージを読み取ります。これらのメッセージは、テレメトリメッセージのいずれかです。 またはイベント 、メッセージングシステムから直接(コマンドアンドコントロールを使用することもできます) デバイスにメッセージを送信し、応答を受信します)。 Honoの一部ではないが外部から提供する必要があるメッセージングについては、これまでAMQP1.0プロトコルが使用されてきました。
バージョン1.7以降、Honoはテクニカルプレビューとしてメッセージング用のApacheKafkaをサポートしています。 。 Honoの重要な機能は、メッセージングシステムとの間でメッセージを転送するためのAPIの定義と実装です。 API定義はメッセージングに基づいており、そのプロパティに直接依存しているため、新しいメッセージングシステムをサポートすることは、Honoの根本的な革新です。 HonoのすべてのメッセージングAPI(テレメトリ 、イベント 、およびコマンドアンドコントロール )、Kafkaに基づく新しい仕様が作成され、プロトコルアダプタとビジネスアプリケーションの両方に直面しています。 AMQPベースのAPIと可能な限り同じように動作するように注意が払われました。
メリット
Apache Kafkaは、メッセージの順序で特定の保証を提供しながら、非常に高いスループットを実現するように設計された分散イベントストリーミングプラットフォームです。これは、いくつかの理由から、メッセージングに関するHonoの要件に最適です。主なメリットは次のとおりです。
- スケーリング :複数のKafkaサーバーは、必要に応じて拡張できるクラスターとして同時に動作します。 Kafkaは、多くのプロセスがデータの書き込みと読み取りを同時に行えるように最適化されています。 AMQP 1.0では、複数のプロセスが同じアドレスからのメッセージを並行して消費することもできます。ただし、それは彼らが注文を失うことを意味します。
- メッセージの順序 :Kafkaのコア機能の1つは、パーティションキーによるデータのパーティション化です。 これは、順序を維持する必要のあるデータと並行して処理できるデータを選択するために使用できます。 Honoでは、これにより、デバイスからのすべてのイベントが正しい順序でビジネスアプリケーションに提供されることを簡単に確認できます。デバイスのテレメトリデータは並行して処理でき、その順序も保証されます。他のすべてのデバイスからのメッセージは、同時に使用されているビジネスアプリケーションの複数のインスタンスであっても、完全に独立して並行して消費できます。
- 大規模な採用 :Kafkaは多くの企業で使用されており、他の多くのテクノロジーによってサポートされています。いくつかの会社が、さまざまなクラウドプラットフォームで予約できるサービスとしてKafkaを提供しています。これにより、Honoに専門的に運用されるメッセージングシステムを簡単に提供できます。ベンダーロックインも回避されます。
変更
AMQP 1.0は、ピアが相互に接続してメッセージを交換する通信プロトコルです。対照的に、Kafkaクラスターは、永続ストレージへのデータの書き込み(および読み取り)を調整するブローカーで構成されます。この違いには2つの結果があります。1つは、メッセージが最終的に削除される前に、しばらくの間取得できることです。 AMQPを使用してHonoでこの効果を実現するには、通常、イベントが発生する別のメッセージブローカーを提供します。 ビジネスアプリケーションが一時的に利用できなくなった場合にメッセージが失われないように保存されます。 Kafkaを使用すると、すべてのメッセージが保存されます。これにはテレメトリメッセージが含まれます(ただし、保存時間はKafkaクラスターのテレメトリトピックの構成によって異なります)。次に、永続ストレージを介した通信により、送信操作と受信操作が相互に分離されます。現在、コンシューマーが接続されていない場合、プロトコルアダプターはデバイスにレポートを返すことができなくなります。代わりに、ビジネスアプリケーションがメッセージを読み取るかどうか、またはいつ読み取るかを「知る」ことなく、メッセージを保存するだけです。
試してみる
Honoをインストールするときは、AMQPメッセージングネットワークまたはKafkaクラスターのいずれかを展開する必要があります。 両方を使用するようにHonoを構成する可能性もあります メッセージングシステム。次に、各テナント(デバイスと構成のサブセット)をAMQPまたはKafkaのいずれかを使用するように構成できます。 Honoプロジェクトは、インターネット上で公的にアクセス可能なサンドボックス環境を提供し、AMQPまたはKafkaベースのメッセージングを使用してHonoを試すことができます。
実例
以下では、HonoサンドボックスでApacheKafkaベースのメッセージングを使用する方法の簡単な例を紹介します。テレメトリメッセージをHTTPプロトコルアダプタに送信してから、Kafkaクラスタから読み取ります。
コマンドラインからHTTPコマンドを送信することにより、インターネット対応デバイスをシミュレートします。このために、人気のあるオープンソースツール curl を使用します 。現在コンピュータにインストールされていない場合は、curlホームページのインストール手順を参照してください。ビジネスアプリケーションをシミュレートするために、HonoのダウンロードページからダウンロードできるHonoのコマンドラインクライアントを使用します。 Javaを実行するには、少なくともバージョン11にJavaをインストールする必要があることに注意してください。
以下に示すコマンドのいずれかが機能しない場合(このような手順で常に発生する可能性があります)、説明に詳細が記載されているKafkaメッセージングガイドを参照してください。
デバイスの登録
まず、他のユーザーの邪魔にならないように、サンドボックスに新しいテナントを作成する必要があります。次のコマンドは、ランダムなIDでテナントを作成し、メッセージングにKafkaを使用するように構成します。
$ curl -i -H "content-type:application / json" --data-binary '{ "ext":{ 「メッセージングタイプ」:「kafka」 } } 'http://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 http://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 '[{ "タイプ": "ハッシュパスワード"、 "auth-id": "'$ MY_DEVICE'"、 「秘密」:[{ "pwd-plain": "'$ MY_PWD'" }] }] 'http://hono.eclipseprojects.io:28080/v1/credentials/$MY_TENANT/$MY_DEVICEメッセージの送信
デバイスを登録したので、メッセージを送受信できます。
2番目のターミナルウィンドウを開いてメッセージを受信します。 Honoコマンドラインクライアントをダウンロードしたディレクトリに移動します。次に、次のコマンドでクライアントを起動します。必ず my-tenant
を置き換えてください。 作成したテナントのIDを使用:
出力に次のような行が含まれている場合、クライアントはメッセージを受信する準備ができています。
10:23:01.807 [vert.x-eventloop-thread-0] INFOorg.eclipse.hono.cli。 app.Receiver-レシーバー[テナント:85f63e23-1b78-4156-8500-debcbd1a8d35、モード:すべて]が正常に作成されました。ctrl-cを押して終了します
これで、シミュレートされたデバイスからHonoにメッセージを送信できます。これを行うには、最初のターミナルウィンドウに戻ります。次のコマンドは、テレメトリメッセージをHTTPプロトコルアダプタに送信します。
$ curl -i -u $ MY_DEVICE @ $ MY_TENANT:$ MY_PWD -H "content-type:application / json" --data-binary '{"temp":42}' http://hono.eclipseprojects.io:8080 /テレメトリーこれで、メッセージが2番目の端末に出力されます。
イベントを送信することもできます :
$ curl -i -u $ MY_DEVICE @ $ MY_TENANT:$ MY_PWD -H "content-type:application / json" --data-binary '{"hello": "kafka"}' http://hono.eclipseprojects.io :8080 /イベントこれで、デバイスからHonoにメッセージを送信し、Kafkaクラスターからメッセージを受信することに成功したはずです。次のステップとして、HonoのKafkaメッセージングガイドのより詳細な例を見ることができます。また、ビジネスアプリケーションからデバイスにコマンドを送信してそれに応答する方法も示します。さらに深く掘り下げたい場合は、HonoのAPI仕様にあるKafkaベースのAPIの仕様を確認することをお勧めします。
結論
メッセージングシステムは、そのインターフェイスがその上に提供されているため、EclipseHonoのコア機能の基盤です。 AMQP 1.0と一緒にKafkaをサポートすることは、Honoにとって非常に大きな変更であり、インターフェイスを相互に簡単にマッピングできるようにすることに大きな重点が置かれています。 Kafkaの主な利点は、そのスケーラビリティ、注文の保証、大規模な採用、および豊富な商用サービスの提供です。 AMQPを使用したメッセージングとの主な違いは、すべてのメッセージタイプが仲介されることです。これは、受信者が一時的に切断された場合でもメッセージを配信できることを意味します。また、通信は時間の観点から切り離されているため、メッセージの受信者から送信者への直接フィードバックは不可能になります。簡単な実際の例では、シミュレートされたデバイスからHonoサンドボックスにメッセージを送信し、Kafkaクラスターからメッセージを消費する方法を示しました。
産業技術