Azure クラウド サービスを使用したエンタープライズ アプリケーションの設計に関していくつか質問があります。
バックストーリー
SQL バックエンド上の約 12 個の WCF Windows サービスで構成されたシステムがあります。現在、約 10 のクライアントがありますが、システムのスループット要求がおそらく 100 倍に増加し、100 に成長する可能性があると予想しています。現在のシステムは設計が不十分で、単純にスケーリングできません。そのため、Azure プラットフォームでリエンジニアリングを行うのに適切な時期であると思われます。
プロセスフロー
簡略化した一連のサービスとプロセス フローについて簡単に説明した後、Azure クラウド サービスを利用して新しいシステムを構築することに関していくつかの質問をさせてください。
サービス A は外部システムにログオンし、データを継続的にダウンロードします
サービス B は 2 番目の外部システムにログオンし、データを継続的にダウンロードします
サービス A と B のそれぞれにログインできるインスタンスは 1 つだけです。
A と B の両方が、2 つの外部ソースからのデータを調整するサービス C にデータを渡します。
検証および調整されたデータは、C からサービス D に渡され、サービス D はいくつかのアカウンティング機能を実行してから、結果のデータをサービス E および F に渡します。
サービス E は継続的に外部システムにログインし、データをアップロードします。
サービス F はレポートを生成し、FTP などを介してクライアントに公開します
システムは実際にはこれよりもはるかに複雑ですが、上記は関連するプロセスを示しています。システムは 1 日 24 時間、週 6 日稼動しています。キューは、すべてのサービス間でメッセージをバッファリングするために使用されます。
Azure 永続 VM を使用してこのシステムを構築し、サービス バスやキューなどを利用することもできますが、それは垂直スケーリング戦略に結びついてしまいます。次の質問が与えられた場合、どのようにクラウド サービスを利用して実装できますか。
質問
サービス A、B、および E が外部システムに永続的にログインしている場合、それぞれのアクティブなインスタンスは 1 つしか存在できません。これらを単一インスタンスのワーカー ロールとして実装すると、ダウンタイムとパッチ適用の問題が発生します (これは容認できません)。それぞれのインスタンスを 2 つ作成した場合、Azure でワーカー ロールを使用してアクティブ/パッシブ負荷分散を実装する標準的な方法はありますか?それとも、独自のロード バランサーを構築する必要がありますか? 私が考えていなかったこの問題に対する別の解決策はありますか?
サービス C と D は、複数の worker ロール インスタンスを使用してスケーリングするのに適した候補です。ただし、各インスタンスは関連データを処理する必要があります。たとえば、それぞれが 5 つの個別のクライアントのデータを処理する 4 つのインスタンスを持つことができます。各インスタンスによってグループ (クライアント中心) で処理されるメッセージを取得するにはどうすればよいでしょうか? また、パッチ適用が行われる場合などに、1 つのインスタンスから残りのインスタンスに負荷をどのように再配分するか。たとえば、5 つのクライアントのデータを処理するインスタンス 1 が OS パッチ適用のためにダウンした場合、そのクライアントのデータは次のようにする必要があります。再起動するまで、残りのインスタンスによって処理されます。同様に、追加のワーカー ロールをスピンアップすることにした場合、どのように負荷を再分散できますか?
あなたが提供できる洞察や提案は大歓迎です。
マット