フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

DSA(Distributed Services Architecture)について調査したまとめ

f:id:lirlia:20180114215203p:plain

DSA

What:DSAとは?

  • Distributed Services Architecture(分散サービスアーキテクチャー)の略
  • IoT間(デバイス、サーバー等)の接続やロジックやアプリをアシストするOSSのIoTプラットフォーム
  • IoTデバイスで収集した様々なデータをDSAという共通のプラットフォームを通じて異なるデバイス・サーバ間でやりとりする

Why:DSAはなぜ作られたの?(どこで使われるの?)

IoTデバイスが増加するとセキュリティやプロトコルなどで独自仕様が乱立する可能性があるため、DSAを利用することでデバイスやメーカーにかかわらず簡単に相互接続を実現するために作られました。

DSA(より詳細にはDSLink)は様々な言語で実装されているため、アプリケーションや動作環境を選ばずに通信を成立させることができます。


Who&When&Where:誰がいつどこで作ったの?

不明(教えてください)


リファレンス


DSAを深堀りする

DSAのコアコンポーネント

DSAには3つのコアコンポーネントがあります。

  • DSBroker:送信ストリームと受信ストリームを扱うルーター。複数つなぎ合わせることで、拡張性や分散構成が構築可能
  • DSLink:DSBrokerに接続されているDSLinkは、データストリームの発信元として動作する
  • nodeAPI:DSAノード間の双方向制御と監視を行うAPI。DSAノード間の通信プロトコルで使用される

※公式のGitHub(DSA - Distributed Services Architecture for IoT · GitHub)には複数の言語のDSBrokerとDSLinkが用意されています


Distributed Service Broker

  • ライセンス:Apache 2.0 Licence
  • 言語:Dart(Google製の言語)
  • 動作プラットフォーム:Linux/OSX/Window/mobile(Android)

GitHub - IOT-DSA/sdk-dslink-dart: DSLink Dart SDK

DSBrokerに求められる仕様
  • すべての設定はディスクに保存されていること
  • ノードのアクセス許可を管理すること
  • ノートの動作を管理すること
  • DSLinkからの接続を管理すること
  • MtoMの認証ライフサイクルを指示すること
  • Brokerからノードと値の変更をsubscribeするためのWebSocket/HTTPエンドポイントを公開すること
  • DSLinkデータの公開と機能をBrokerに公開するためのWebSocket/HTTPエンドポイントを公開すること
  • Publisherのために、SubscriberのリスナーとQoSバッファを管理すること
  • DSAクエリーDSLを実装すること

※Publisher/SubscriberはDSAに関する知識ではなく、メッセージングに関する知識です

DSBrokerの動き

問い合わせがないのにデータを送るのは無駄なため、データの送信を担当するDSLink(Publisher)は、Subscriberが存在しない限りデータを送信しません。

データの送受信を確立するためには次の通信が発生します。まずSubscriberとして動くDSLinkがDSBrokerに接続し、DSLink自身の存在をDSBrokerに通知します。DSBrokerは登録されたセキュリティポリシーに基づき、Subscriberとして動くDSLinkとWebSocketかHTTP のロングポーリングを使って接続します。(ロングポーリングを使うのはDSLinkがロングポーリングを使って通信してきたとき)

データの流れ

DSLink(Publisher) →(WebSocket)→ DSBroker →(WebSocket)→ DSLink(Subscriber)

接続確立の流れ

DSLink(Publisher) ←(WebSocket) ← DSBroker ←(WebSocket)← DSLink(Subscriber)

DSBrokerは多段構成にすることもできます。

DSLink(Publisher) → DSBroker → DSBroker → DSLink(Subscriber)

DSAクエリ

DSAクエリは、DSAネットワーク上のノードやデータセットに対してクエリを発行できます。これによりエッジ(IoTデバイス側)で計算を行い、その結果だけをPublishすることができるので経路内のトラフィックを軽減されます。

※エッジコンピューティングが可能になる


DSLinkの目的はデバイスやメーカ固有の機能やライブラリをラップして、それらをDSAネットワークの1要素として扱えるようにすることです。DSAのコミュニティではDSLinkを複数の言語で実装して、様々なアプリケーションがDSLinkを使用できるようにしています。

※文章によってDSLinkがPublisherとSubscriberのいずれかを意味するので違いを意識する必要がある

DSLinkの機能

DSLinkはDSBrokerに接続してnodeAPIを介して以下の処理を行います。

  • DSLinkをPublisherとして利用する場合:nodeAPIリクエストとSubscribeへの応答
  • DSLinkをSubscriberとして利用する場合:nodeAPIを利用してBrokerに自身を通知

DSLinkは様々なMW/プロトコルへの接続/変換に対応しています。

例えば下のリンクは「MQTTプロトコルをdslinkと変換するJavaのライブラリ」


nodeAPI

nodeAPIをすべてのDSAノード(DSLink/DSBroker)をつなぐ共通の通信方法です。データの送受信から

nodeAPIの技術仕様

nodeAPIはステートフルで軽量なRPCプロトコルで、同一プロセス・HTTP・WebSocket・socket・メッセージング環境で利用可能です。標準ではデータはJSON形式でやりとりされますが、MsgPackなどの形式に変換することも可能です。

SubscriberはnodeAPIを使いリクエストオブジェクトを生成して、受信したレスポンスオブジェクトを処理します。PublisherはnodeAPIを使ってリクエストオブジェクトを処理し、レスポンスオブジェクトを生成します。

DSAネットワークを流れるメッセージにはIDがあり、DSLink/DSBrokerがリクエスト/レスポンスを受け取ると同じIDのACKを返します。IDは最大2147483647(0x7FFFFFFF)で、その後1から再開します。 ※リクエストやレスポンスにメッセージが含まれていない場合にはACKは返さない

ACKが返送される前に2つ以上の受信メッセージを受け取った場合には、ACKは最後の通信とともに送信されるためマージして返却することができます。

ACK欠落時の挙動
  • 設定した最大ACK欠落数を超えた場合、Publisherはデータ送信を停止し送信途中のデータをPublisher内に保持します。Subscriberから新しいACKが届いたら、データ送信を再開します
  • 設定した最大ACK欠落数を超えた場合、リストレスポンダはデータの送信を停止し、すべての変更をマージします
  • ストリーミング呼び出しの場合、SDKはコールバックが欠落しているACKの数を知る方法を提供する必要があります

※最大ACK欠落数のdefault値は8


DSAのプロトコル通信について

DSAネットワークには3種類のノードパターンがあります。

RequesterとResponderは役割の違うDSLinkです。

  • Requester:Responderのモデルを見て捜査できる(Subscriber)
  • Responder:モデル構造の公開、ストリームの更新、コマンドの受信が可能(Publisher)
  • Requester + Responder:DSBrokerがこれ、リクエストとレスポンスをルーティングします

リクエストにはHTTPのPOSTメソッドが使用されJSONデータがエンドポイントに対して送信されます。サーバーは通信を受け取るとサーバ設定をHTTPレスポンスのボディに格納して返信します。

f:id:lirlia:20180115010236p:plain

その後、先ほどのレスポンスに記載されたWebSocketのエンドポイントに対して接続し許可が下りるとClient-Server間の通信が成功します。WebSocket通信はClient-Server間で少なくても1分に1度疎通が必要です。60秒間に通信がない場合WebSocketは通信を切断します。

node APIの通信はこの後始まります。


DSA通信時のセキュリティについて

接続時のセキュリティ

初回接続時、ClientとServer間ではWebSocketの通信をECDH(楕円曲線ディフィー・ヘルマン鍵共有)を使って認証します。

ECDHはある値をお互いに保有した状態で、それぞれの秘密鍵と相手の公開鍵を使って計算を行うことで認証を行う仕組みです。

f:id:lirlia:20180115013932p:plain 楕円曲線ディフィー・ヘルマン鍵共有 - Wikipedia

  • Client→Server:dsdl(共通の値)とClientの公開鍵を渡す
  • Server→Client:Serverの公開鍵とsaltを渡す
  • Client→Server:ECDHの計算結果とsaltを足した値、dsdlを渡す
  • Server→Client:別のsaltを渡す(WebSocketが切断された後の接続に利用)

という流れになっています。

より詳細にはこちらを参照してください。

トークン

Brokerが未知のDSLinkを許可しないように設定されている場合、新しいハンドシェイクを作成するにはトークンが必要です。

トークンを使うことで「リクエストを受け付ける時間」「通信回数の制限」「トークンによるデバイスの管理」などを実現することができます。


DSAを利用した製品


DSAと他のメッセージングとの比較

MQTTプロトコル

DSAはプラットフォームでMQTTはプロトコルのためそもそも同じ土俵にいない。MQTTは非常に軽量なメッセージングプロトコルであるため、回線が貧弱なことが多いIoTデバイスには向いている。

DSAはIoTデバイスに処理をさせたり、ほかのプロトコルに変換したりなどIoTデバイスとプラットフォーム全般を担当する機能なので厳密にいえばDSAを利用したDSLinkとMQTTを比較するのが正しい。