これはもっと経済的な問題だと主張します。しかし、それはエンジニアができるべき判断判断です。したがって、私は答えています。
私は答えを4つの部分に分けています。
危機管理
そのため、クライアントがサーバーからの応答を取得できない場合があります。これはプログラム上のエラーによるものではないと想定します(そうでない場合、解決策は修正することですので、それを行ってください)。代わりに、それはあなたの制御を超えた偶然の状況のためでなければなりません...
しかし、あなたの知識を超えていません。あなたが知っている必要があります:
- どのくらいの頻度で発生しますか。
- どのような影響がありますか。
たとえば、失敗して再試行が発生するのは約2%の時間だけである場合、おそらく対処する価値はありません。それが時間の約80%で起こるならば、まあ...依存します...
クライアントはどれくらいの時間待つ必要がありますか?そして、それはどのようにコストに変換されますか...あなたが見るように、あなたは通常のアプリケーションにわずかな遅延があります、それはおそらく大したことではないでしょう。それが重要であり、リアルタイムアプリケーションまたはオンラインビデオゲームがある場合、これはユーザーを追い払うでしょう。おそらく、より多くのまたはより良いサーバーに投資するほうがよいでしょう。そうでない場合は、おそらく「ロード中」または「サーバーを待機中」というメッセージを表示できます。遅延が非常に大きい(数十秒程度)場合を除き、通常のアプリケーションでも遅延が大きすぎる可能性があります。
戦略
上で言ったように、この問題を解決する方法は複数あります。既にtry-fail-retryループを実装していると仮定します。それでは、見てみましょう...
- 読み込みメッセージを入れてください。安価で、ユーザーの保持に役立ちます。
- 並列クエリ。速くなることも、失敗することもあります。冗長サーバー(高価になる可能性があります)が必要になり、サーバー時間とネットワークトラフィックが無駄になります。
- 並行してクエリを実行して、より高速なサーバーを確立し、それ以降を使用します。速くなることも、失敗することもあります。冗長サーバーが必要になり(高価になる可能性があります)、サーバー時間とネットワークトラフィックを無駄にしません。
さて、これらはまだ失敗する可能性があると言っています。サーバーへのクエリが失敗する可能性が80%あると仮定すると、2つのサーバーへの並列クエリが失敗する可能性は64%になります。したがって、まだ再試行する必要があります。
より高速なサーバーを選択して使用し続けることのボーナスの利点は、ネットワークの問題により高速なサーバーが故障する可能性が低いことです。
リクエストが失敗する理由を理解できれば、それを思い出してください。障害を防ぐことができなくても、状況をよりよく管理するのに役立ちます。たとえば、サーバー側でより多くの転送速度が必要ですか?
もう少し:
- 世界中に複数のサーバーを展開し、ジオロケーションごとにサーバーを選択します。
- サーバー側で負荷分散を行います(専用のマシンがすべてのリクエストを受け取り、それらをサーバーに送ります。そこで並列処理を行うか、より良いバランス戦略をとることができます)。
そして誰があなたがこれらのうちの1つだけをしなければならないと言ったのですか?読み込みメッセージを入れ、wrold全体に分散している複数のサーバーにクエリを実行して、より高速なものを選択し、それ以降のみを使用して、失敗した場合はループで再試行し、それらのサーバーのそれぞれを負荷分散を備えたマシンのクラスターにすることができます。何故なの?まあ、コスト...
費用
4つのコストがあります。
- 開発コスト(通常は非常に安い)
- 展開のコスト(通常は高い)
- コストランタイム(アプリケーションの種類とビジネスモデルに依存)
- 失敗のコスト(おそらく低いが、必ずしもそうではない)
それらのバランスを取る必要があります。
たとえば、満足したユーザーごとに約1ドル稼げるとしましょう。1日に3000人のユーザーがいること。リクエストが約50%失敗すること。そして、ユーザーの2%は、リクエストが失敗したときに支払いをせずに去ります。これは、1日あたり30ドル(3000 * 50%* 2%)失うことを意味します。さて、新しい機能の開発には100ドルかかり、サーバーの展開には800ドルかかります-そして、ランタイムコストを無視すると-((100 + 800)/ 30 )30日。これで、予算を確認して決定できます。
これらの値は現実を代表するものとは考えないでください。私は数学の便宜のためにそれらを選びました。
補遺:
- 私も詳細を無視していることを忘れないでください。たとえば、デプロイコストはほとんどありませんが、CPU時間を支払う必要があるため、それを考慮する必要があります。
- 一部のクライアントは、冗長なリクエストでデータパッケージを無駄にしないと感謝する場合があります。
- 製品の改善は、自然な広告をもたらすのに役立つ場合があります。
- 機会費用を忘れないでください。他の何かを開発すべきですか?
問題は、バランスコストの観点から問題を検討する場合、検討する戦略のコストを推定し、この分析を使用して決定できることです。
直感
経験によって育てば直観。この種の分析を毎回行うことを提案しているわけではありません。一部の人々は、それは大丈夫です。これについてある程度理解し、直観を深めることをお勧めします。
さらに、工学では、実際の科学から得た知識の他に、実践で学び、何が機能して何が機能しないかのガイドラインをまとめます。したがって、最新技術が何であるかを見るのが賢明です...しかし、時々、あなたはあなたの地域の外を見る必要があります。
この場合、私はオンラインビデオゲームを見ます。ロード画面があり、複数のサーバーがあり、待ち時間に基づいてサーバーを選択します。また、ユーザーがサーバーを切り替えることもできます。私たちはそれが機能することを知っています。
リクエストごとにネットワークトラフィックとサーバー時間を無駄にする代わりに、それを行うことをお勧めします。また、サーバーが冗長であっても障害が発生する可能性があることに注意してください。