質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

アプリケーション同士が協調動作するための手段について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 683

kuttsun

score 38

いつもお世話になっております。
タイトルも含めて上手く説明できているかわかりませんが、宜しくお願い致します。

 前提・実現したいこと

以下のような機器がある新システムの設計に関わっています。

  • 機器A
  • 機器B
  • DB
  • 機器C(顧客が使用する機器)

機器Aと機器Bにはそれぞれ端末機器が多数接続されており、この2つの機器に載るアプリケーションがそれぞれシステムの頭脳としての役割を持っています。

機器Aと機器Bは都合上1つに統合できない前提です。

機器Aと機器Bのアプリケーションはそれぞれが自律的に動作しながらもお互いの状態に応じて処理をシーケンシャルに行っていきます。
機器Aと機器Bは1対多の関係になることもあります。

機器Cには機器Aと機器Bの状態をモニタリングする機能があります。
機器Aと機器Bからは機器Cの状態を知る必要はありません。

 直面している問題

旧システムでは DB がなく、アプリケーション間は以下のように TCP/IP で接続して独自プロトコルで通信を行い、それぞれの状態を通知したり指示を送ったりしていました。
(機器Cは機器Aを介して機器Bの状態を取得していました。)

機器C - 機器A - 機器B

今回の新システムでは、機器の状態や指示などをどのように伝えるかということで悩んでいます。

現在挙がっている案は以下です。

 案1 機器間の状態や指示は DB を介して取得する

各機器の状態は全て DB に載せ、他の機器は DB を参照して互いの状態を取得し、それに応じて処理を行うようにします。
この場合に懸念しているのは以下の点です。

  • 状態が更新されたことを知るために、定期的に DB の状態を取得しないといけない?
  • 相手の機器に障害が発生した場合、それをどうやって検知するか?
  • 一時的なデータも DB に書き込まれるため、DB の更新が頻繁に行われる
    (ストレージが SSD なので、書き込み回数の制限は大丈夫か?)
  • 結合度が強すぎる気がする

他のチームから来た人に聞くと、そのチームではこの方法で情報のやり取りをしていたとのことでした。  

 案2 通信を行う

旧システムと同じく、アプリケーション間で直接通信を行うようにします。
この場合に懸念しているのは以下の点です。

  • プロトコルどうする?
    双方向にリアルタイム通信を行う必要がある
    独自プロトコルでもよいが、個人的には好ましくないと考えている
    例えば WebSocket のようなプロトコルをアプリケーション間の通信で使用するのはありなのか?
  • マスターデータを取得するために結局 DB にアクセスするので、DB へのアクセスと通信によるやり取りと2つの処理を実装しないといけない
  • 機器Cから機器Bの状態を取得する場合、旧システムと同じく機器Aを経由するのか?
    この場合、機器Aに障害が発生すると機器Bの状態も取得できない
    それぞれが相互に接続すると複雑になるのでやりたくない

 補足情報(言語/FW/ツール等のバージョンなど)

機器Aと機器Bには OS として Windows 10 IoT が載る予定です。
DB は SQL Server 2016 Express です。
開発環境は以下です。

  • IDE: Visual Studio 2017 Professional
  • 言語: C#
  • ランタイム: .NET Framework or .NET Core (検討中)

 最終的に知りたいこと

このようなシステムの場合、どのような手法を取るのが一般的なのか?
がわからずに悩んでいます。
ですので、そういった観点から回答をいただけると助かります。

宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

要件によって異なります。機器が増設される際にシームレスに対応したいのであればDBが望ましいと思います。
各機器は1台のDBサーバの状態テーブルを一定間隔でポーリングしつつ、状態が変われば処理する様にします。

ただしこの場合、イベントのトリガが状態の変化であり、例えばテーブルのあるフィールドが 1 -> 2 -> 3 と推移した際、2 への変化を漏らす事があります。
この様なケースを救いたいのであればメッセージキューを選定されるのが良いと思います。MQTT 等を使うと、MQTTサーバに subscribe した機器に対してメッセージを分配したり A から B に対するメッセージをMQTTサーバを経由して送れます。またブロードキャストの様な事も出来ます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 23:01

    状態の変化は確実に取得できる必要はないので、問題はなさそうです。
    どうやら今回は DB を使う方法で大丈夫そうです。
    MQTT というのは初めて知りましたので、少し勉強してみます。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る