web-dev-qa-db-ja.com

多くの非同期呼び出しとAPIへの単一呼び出し

REST APIを開発しています。このAPIは、JavaScriptを介してHTML5フロントエンドによって使用されます。このアプリケーションは組織内で使用するためのもので、通常約300人のユーザーがいますが、 1000ユーザー程度までです。

通常、APIへの接続はLAN内で行われるため、接続の品質とレイテンシは良好ですが、接続が低速で、3G/4G経由の遅延が大きくなる可能性があるインターネット経由での時折の使用は除外されません。

私たちが考えた2つのオプションは次のとおりです。

  1. フロントエンドは、APIに対して複数の非同期呼び出しを同時に行って、インターフェースのさまざまなコンポーネントをロードします。

    • 長所:シンプルさ。
    • 短所:サーバーへの接続が多い。
  2. フロントエンドのコントローラーは、取得する必要のあるオブジェクトをパラメーターとして渡して、APIを1回呼び出します。

    • 長所:サーバーはデータベースへの複数の接続を作成しますが、サーバーへの接続は1つだけです。
    • 短所:フロントエンドとAPIの両方にメカニズムが必要です。デザインが複雑になります。

詳細説明:異なるリソース.../Product .../Locationsなどがあります。これらのリソースは単独でフェッチできますが、1つの呼び出しで両方をフェッチする別の抽象リソース.../screen?Product&Locationsがあります。

12
mattinsalto

次の理由により、オプション1(複数の非同期呼び出し)が最適です。

  1. 各呼び出しは独自のエンティティなので、何かが失敗した場合に個別に再試行できます。モノリシックな「ワンコール」アーキテクチャでは、1つのことが失敗した場合は、コール全体をもう一度行う必要があります。
  2. サーバー側のコードはより単純になります。ここでも、modularityです。つまり、異なる開発者が異なるAPIリソースで作業できるということです。
  3. 典型的なMVCパターンでは1つのAPI呼び出しで複数のseparateリソースをロードしても意味がありません;たとえば、ページに表示する製品のリストを取得するために/productsにリクエストを送信し、人気のある製品が販売されている場所のリストも表示したい場合、2つの個別のリソースがあります:ProductおよびLocation。同じページに表示されますが、論理的に論理的に/productsを呼び出して、場所も返すことはできません。
  4. ロギング/使用率レポートは、モジュール方式の方が簡単です。 /productsにリクエストを送信し、場所もロードしている場合、ログファイルは本当に混乱します。
  5. 特定のリソースに問題がある場合、1回の呼び出しでページ全体が壊れ、ユーザーにはわかりません何が壊れたか-これは、チームが問題を修正するのに時間がかかることを意味します。ただし、モジュラーアプローチでは、1つの問題が発生した場合、何が故障したかが非常に明確になり、より迅速に修正できます。また、ページの残りを台無しにすることはありません(物事が密接に結合されていない限り...)
  6. 物事が分かれている場合、一般的に変更を加えるのが簡単になります。 1回のAPI呼び出しで5つのリソースが読み込まれている場合、何かを変更したいときに壊れないようにする方法を理解するのは難しくなります。

重要な点は、リソースが個別であることであり、REST APIでは、単一のAPIパスから多くの個別のリソースを返すことは、「サーバーへの接続を保存する」場合でも意味がありません。ところで、パラメーターを使用して(異なる)リソースを条件付きでロードすることはRESTfulではありません。

そうは言っても、唯一の論理的なオプションは、リソースを分離するために複数の非同期リクエストを行うことです:モジュラーアプローチを取る

PS-「サーバーへの接続」を途中で最適化しないでください。特に、HTTP接続のオーバーヘッドが非常に低く、LAN上にいる場合は特にそうです。すぐにシンプルなデザインを選択する代わりにそのような考えをすると、後で問題が発生します。

14
Chris Cirefice