Cloud Storage Gateway (CSG) インスタンスは、オンプレミスデータセンターおよび Alibaba Cloud で実行されますが、CSG コンソールはプライベートネットワーク経由で直接これらのインスタンスにアクセスできません。ApsaraMQ for MQTT は、パブリックネットワークとプライベートネットワーク間で安全かつコンプライアンスに準拠した疎通を提供することでこのギャップを埋め、インスタンスがどこにデプロイされているかに関わらず、コンソールと各ゲートウェイインスタンス間の双方向メッセージングチャネルを可能にします。
仕組み
CSG は 2 つのデプロイモードをサポートしています:
| デプロイモード | 説明 |
|---|---|
| オンプレミス | CSG は、ローカルデータセンター内で仮想マシンとして実行され、イントラネットにのみ接続されます。 |
| クラウドベース | CSG は、Alibaba Cloud の仮想ネットワーク環境内の Elastic Compute Service (ECS) インスタンス内で実行されます。 |
どちらのモードでも、CSG インスタンスはプライベート IP アドレスを使用します。CSG コンソールはこれらのアドレスに直接アクセスできません。クラウドにデプロイされたゲートウェイをパブリック IP アドレス経由で公開すると、セキュリティリスクと攻撃対象領域が生じます。
ApsaraMQ for MQTT は、CSG コンソールとすべてのゲートウェイインスタンス間のリレーとして機能することで、この問題を解決します。このソリューションでは、メッセージプッシュとアクティブプルを使用してステータスを表示し、コマンドを発行します。主に 2 つの通信パターンが使用されます:
コンソールからゲートウェイへ (ポイントツーポイントのダウンリンク):CSG コンソールは、ApsaraMQ for MQTT を通じて特定のゲートウェイインスタンスにコマンドをパブリッシュします。
ゲートウェイからコンソールへ (ファンインのアップリンク):各 CSG インスタンスは、メッセージをパブリッシュするか、ステータスクエリに応答することで、そのステータスをコンソールに報告します。
CSG コンソールは、バックエンド API を呼び出して個々のゲートウェイインスタンスを管理することもできます。ApsaraMQ for MQTT はすべてのリアルタイムメッセージングを処理し、ApsaraMQ for RocketMQ はサーバー側のメッセージ処理のために統合できます。


メリット
| メリット | 詳細 |
|---|---|
| 優れた拡張性 | メッセージ転送能力は無限に拡張可能です。CSG インスタンスを追加してもパフォーマンスは低下しません。 |
| 低レイテンシー配信 | コマンドは、キューの輻輳なしにミリ秒単位で 100 万台以上のデバイスに到達します。 |
| エンドツーエンド暗号化 | TLS/SSL 暗号化がサポートされており、転送中のデータを保護します。 |
| 高可用性 | すべての ApsaraMQ for MQTT サービスノードは、高い可用性と安定性を備えています。 |
| 多言語 SDK | MQTT ブローカーとクライアントアプリケーションの両方で、複数のプログラミング言語で利用可能な SDK が提供されています。 |
| 柔軟なネットワーク構成 | さまざまなデプロイメントトポロジーに対応するため、内部ネットワークアクセスとパブリックネットワークアクセスの両方がサポートされています。 |
MQTT メッセージングレイヤーの設計
管理チャネルを構築するには、以降のセクションで説明するように、クライアント ID、トピック構造、およびメッセージパラメーターを設計します。
SDK のダウンロードと API リファレンスについては、「ApsaraMQ for MQTT SDK」および「ApsaraMQ for RocketMQ SDK」をご参照ください。
クライアント ID の設計
すべての MQTT クライアントは、グローバルに一意のクライアント ID を持つ必要があります。ApsaraMQ for MQTT では、クライアント ID は @@@ という区切り文字で結合された 2 つの部分で構成されます:
<Group ID>@@@<Device ID>全長は 64 文字を超えてはなりません。
| コンポーネント | 説明 | ベストプラクティス |
|---|---|---|
| Group ID (プレフィックス) | ApsaraMQ for MQTT コンソールに登録された Group ID。 | CSG コンソールが実行される Alibaba Cloud リージョンごとに個別の Group ID を作成します (例:中国 (杭州) 用と中国 (上海) 用)。これにより、リージョンごとに問題を切り分けやすくなります。 |
| Device ID (サフィックス) | CSG インスタンス ID に 1 対 1 でマッピングされる、アプリケーションが生成した識別子。 | 各 Device ID を CSG インスタンス ID に直接マッピングして、グローバルな一意性を保証します。 |
クライアント ID の例:
GID_csg_hangzhou@@@csg-instance-a1b2c3d4
GID_csg_shanghai@@@csg-instance-e5f6g7h8クライアント ID の構造の詳細については、「用語」をご参照ください。
トピック構造の設計
MQTT はパブリッシュ/サブスクライブモデルを使用します。トピックは、親トピックとサブトピックを持つ階層的なディレクトリ構造に従います。トピックの全長 (親トピック + サブトピック) は 64 文字を超えてはなりません。
| トピックレベル | 説明 | 登録 |
|---|---|---|
| 親トピック | トピック階層の最初のレベル。名前空間に相当します。 | 使用前に ApsaraMQ for MQTT コンソールに登録する必要があります。 |
| サブトピック | 親トピックより下の任意のレベル。 | 登録は不要です。ニーズに基づいてサブトピックを自由に定義できます。 |
MQTT のパブリッシュ/サブスクライブモデルの背景については、「MQTT v3.1.1 specification」および「ApsaraMQ for MQTT とは」をご参照ください。
トピック設計の原則
CSG 管理用のトピックを定義する際は、以下のルールに従ってください:
アップリンクとダウンリンクのトラフィックを異なる親トピックに分離します。これにより、メッセージフローが分離され、トラブルシューティングが簡素化されます。
アップリンク:CSG インスタンスから管理サービスへのメッセージ。
ダウンリンク:管理サービスから CSG インスタンスへのメッセージ。
優先度やペイロードサイズが異なるメッセージには、異なる親トピックを使用します。これにより、優先度の低い大きな転送が、時間的制約の厳しい小さな制御コマンドを遅延させるのを防ぎます。
トピック階層の例:
# ダウンリンク:コンソールからゲートウェイへのコマンド (登録済みの親トピック:csg_cmd)
csg_cmd/hangzhou/csg-instance-a1b2c3d4/restart
csg_cmd/hangzhou/csg-instance-a1b2c3d4/config
# アップリンク:ゲートウェイからコンソールへのステータスレポート (登録済みの親トピック:csg_status)
csg_status/hangzhou/csg-instance-a1b2c3d4/heartbeat
csg_status/hangzhou/csg-instance-a1b2c3d4/metrics
# アップリンク:大きなファイルの転送 (別の親トピック:csg_data)
csg_data/hangzhou/csg-instance-a1b2c3d4/logsトピック名には先頭のスラッシュを含めないでください(例: csg_cmd/hangzhou を使用し、/csg_cmd/hangzhou は使用しないでください)。先頭のスラッシュを付けると、トピックの階層に不要な空のレベルが追加されます。
推奨メッセージングパターン
上記で説明した対話プロセスには、P2P メッセージングを使用します。P2P メッセージでは、受信側がトピックをサブスクライブする必要はありません。送信側がターゲットクライアントを直接指定します。これにより、コンソールがサブスクリプションを管理することなく特定のゲートウェイインスタンスにコマンドを送信できるため、コマンド & コントロールのシナリオが簡素化されます。
トピック構造の詳細については、「用語」をご参照ください。
メッセージパラメーターの設定
CSG コンソールは MQTT を使用して RPC 呼び出しをシミュレートします。各コマンドは noreply で送信されます。つまり、コンソールは戻り値を待たず、以前のメッセージを再度受信する必要もありません。エラーコードが受信された場合、コンソールはオペレーターにコマンドを再発行するように促します。
すべての MQTT クライアント接続で、次のパラメーターを設定します:
| パラメーター | 値 | 理由 |
|---|---|---|
| cleanSession | true | ブローカーは、切断されたクライアントのメッセージをキューに入れません。コマンドは送りっぱなしであるため、再接続後に以前のメッセージを再生する必要はありません。 |
cleanSession の動作の詳細については、「用語」をご参照ください。
用語
| Term | Definition |
|---|---|
| MQTT | Message Queuing Telemetry Transport -- 業界標準の IoT およびモバイルメッセージングプロトコルです。ApsaraMQ for MQTT はデフォルトで MQTT をサポートしています。 |
| CSG | Cloud Storage Gateway -- Object Storage Service (OSS) バケットをバックエンドストレージとして使用するハイブリッドストレージサービスです。CSG は、Network File System (NFS) および共通インターネットファイルシステム (CIFS) 経由でファイルストレージを、Internet Small Computer Systems Interface (iSCSI) 経由でブロックストレージを公開します。詳細については、「Cloud Storage Gateway とは? |
| MQTT broker | ApsaraMQ for MQTT のサーバー側ノードで、パブリッシャーからメッセージを受信し、サブスクライバーに転送します。 |
| MQTT client | MQTT ブローカーに接続するデバイスまたはアプリケーションです。このユースケースでは、各 CSG インスタンスが MQTT クライアントとして機能します。 |
| ApsaraDB RDS | Alibaba Cloud 上のマネージド リレーショナルデータベースサービスです。 |
| Simple Log Service (SLS) | Alibaba Cloud 上のログ分析サービスで、ここでは監査およびトレースに使用されます。 |