異なるプロトコル(rs232、tcp、httpなど)を介して通信する複数のデバイスを取得し、複数のインターフェースからリクエストを送信できるようにしたい(各デバイスから複数のインターフェースに応答を取得できるようにしたい)。
インターフェイスクライアントとデバイスクライアント間の通信を適切に管理する方法を考えています。 1つの解決策は、複数のインターフェイスクライアントへの1つの接続と、複数のモジュールへの1つの接続を処理するサーバーマネージャーを作成することです。しかし、管理する必要があるマルチスレッドコードのため、私はそれのファンではありません。図:
私の提案は、複数のサーバーを持つマネージャーを作成することです。そのため、各モジュールと指定されたインターフェースは、具体的なモジュールサーバーと通信するクライアントになります。図:
どちらが良いのか、そしてその理由は?私の意見では、複数のサーバーを備えたバージョンでは、各モジュールのマルチスレッドロジックが分離されます。一方、複数の接続がありますが、心配する必要はありますか?
前もって感謝します。
これがどれほど大きなプロジェクトかはわかりませんが、これは好みの問題ではないように思えます。考慮すべき設計要素があります。チームは設計要素についてブレーンストーミングを行い、リスク、コスト、確率について評価し、何らかの客観的な評価方法を使用してオプションをランク付けする必要があります。どちらもさまざまな状況で完全に実行可能です。
あなたのグループが考慮すべきいくつかの質問:
異なるインバウンドプロトコルが互いに競合するリスクはどれくらいありますか?たとえば、RS232ドライバがリークしている場合は、さらにプロセスを分離する必要があります。または、ボックスをときどきクラッシュさせることがわかっている場合は、別のマシンで完全に実行する必要があります。または、それらはすべて完全に安定しているかもしれませんが、スレッドを異なる方法で処理する必要があります。異なるサイズのプール、より短いタイムアウト、または独立した構成。
状態はありますか?サービスをリセットするとどのような影響がありますか?冗長性はありますか?
どのくらいの速さで成長しますか?急成長を計画している場合は、すべてのサービスを1つのボックスで実行できるように、できるだけ簡単にスケールアウトできるように努力する必要があります。
ビジネスロジックはどのくらい複雑ですか?サービスがバックエンドサービスへのパススルーのようなものであれば、オプション2はそれほど悪くありません。それらが非常に複雑な場合は、オプション1の方が適しています。
リリースサイクルはどうなりますか?バグ修正を展開する必要がある場合、個別のサービスを持つことに利点はありますか?機能リリースを同期する予定ですか、それとも一部のチャネルがより頻繁にリリースを取得しますか?コードは異なるチームによって管理されますか?
また、このソリューションでは多くの配管が必要になり、接続の問題も発生する可能性があるため、必ずネットワークエンジニアリングチームに連絡してください。
常に複数のサーバー。サーバーがタイムアウトしない限りシリアル通信でビジーになる可能性があり、その期間中は他の通信を処理しません。
複数の通信エンティティおよびバッファを使用してテレグラム処理キューを作成を使用します。
まず、最初のアーキテクチャの利点は、クライアントが接続して使用している単一のインターフェイスであるということです。 2番目のアーキテクチャの利点は、拡張性が高く、さまざまなリソースに対してさまざまな接続が使用されることです。ただし、最初のアーキテクチャの利点は失われます。
両方を組み合わせることをお勧めします。サーバーに単一のAPIを用意し、パラメーターを使用して、さまざまなリクエストの処理方法を決定します。 2番目のアーキテクチャでは、クライアントごとにサーバー内の接点が異なるため、これは必要ありませんでした。これにより、多少の複雑さと変更が追加されます。
重要な点を繰り返します。サーバー自体は複数のサービスに分割されている可能性がありますが、APIは1つです。