web-dev-qa-db-ja.com

WebSocketを介した複数のバックエンドシステムとIoTデバイス間の通信のアーキテクチャ

何千ものIoTデバイス(それぞれにSIMカードが取り付けられている)が地理的に分散していて、個別に制御されるシナリオがあります。

したがって、各IoTデバイスには、中央システムに接続できるWebSocketクライアントがあります。多くの通信が行われる可能性があるため、IoTデバイスは、水平方向にスケーラブルでロードバランサーの背後にあるバックエンドWebSocketサーバーコンポーネント(ゲートウェイ)に接続します。

バックエンドランドスケープには、UIDに基づいてIoTデバイスにコマンドまたはクエリを送信する他のコンポーネント(マスター)があります。したがって、マスターは、その特定のIoTデバイスとのオープンWebSocket接続を持つ正しいゲートウェイを見つける必要があります。

私の最初のアイデアは、すべてのマスターコンポーネントとゲートウェイコンポーネントの間にメッセージブローカー(Kafka?!)を導入することです。各コマンドまたはクエリメッセージは、ターゲットUIDとともに、メッセージブローカーおよび要求トピック/キュー/ストリームにスローされます。

各ゲートウェイはすべての要求メッセージを読み取り、1つのゲートウェイが指定されたUIDを持つIoTデバイスへのアクティブなWebSocketセッションを持っている場合、コマンドまたはクエリがIoTデバイスに送信されます。

説明したデザインのレビューをいただければ幸いです。信頼できる一般的なヒューリスティックまたはアルゴリズム(分散システム設計)はありますか?

追加の呼び出しが発生したり、各マスターが独自のレジストリを構築したり、ゲートウェイがクラッシュした場合にレジストリを更新する必要があるため、登録サービスは必要ありません。

1
jstr

メッセージブローカーを使用したアプローチは、NetのSignalRが使用するものであり、メッセージブローカーには複数のオプションがあります。他のテクノロジーを使用している場合でも参照できるように、以下のリンクを含めました。これは、Azure ServiceBusをバックプレーンとして使用したものです。

https://docs.Microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-in-signalr

1