web-dev-qa-db-ja.com

CPU集約型/データ集約型タスクはサーバーに属していますか

私はサーバー開発に不慣れです。責任の分割がデータ集約型タスクのどこにあるのかを理解しようとしています。Node.jsを使用しています。

例として、私が単一ページのアプリケーションを作成していると言います:

  • クライアントは、エリアごとの人口を含むマップをレンダリングします
  • サーバーは人口データのリクエストを処理します

ただし、私もデータの所有者ではなく、APIを介して第三者から収集したと仮定します。そのAPIは、単に私と人とその場所のリストを提供します。アプリケーションごとにアクセスできるように、各人をスクラブし、場所に基づいてグループ化し、それらを合計して、そのデータを保存する必要があります。人口は常に変化するわけではないので、このプロセスを常に実行する必要はありませんが、このデータセットを1日に1回更新するとします。

私の質問は、このプロセスをサーバーに置くと、要求が遅くなるほどプロセスが集中するように見えることです。いくつかのオプションが表示されますが、プロの開発環境でどのオプションを使用するのか、または最も効率的かどうかはわかりません。

私はできた:

  • クライアントに生データを送信すると、クライアント自身がすべての解析を実行できますが、ユーザーエクスペリエンスは全体的に低下します。
  • サーバーに同じスレッドで処理を実行させ、1日に1回サーバーの速度が低下する
  • 同じサーバー上でワーカースレッドを生成して処理します(非推奨?)
  • 完全に別の3台目のサーバーを用意します。メインサーバーが1日に1回pingを実行して、データを処理して返します。

私が知らない別の方法がありますか、またはこれらの方法のいずれかがより実践的ですか?

7
Kyle R

データ集約的な作業の通常のルールは、「大きな」データブロックがあまり移動しないように処理を配置することです。これは、ネットワーク遅延が他の単一のアクティビティ遅延よりもはるかに大きいことが多いためです。

しかし、あなたが説明したことから、答えはデータテーブルの合計サイズによって異なる場合があります。総人口がわずか数ダースである場合そして小さいままですの場合、すべてのデータをクライアントに転送してそこで処理すると、大幅な遅延は発生しません。

ただし、問題の人口は数百または数千になりやすいようです。その場合、すべてのクエリに応答して、ネットワーク全体のすべての生データを投げたくはありません。代わりに、サーバー上でワーカースレッドを生成するという選択を行ってください。サーバーのパフォーマンスを許容可能なレベルに維持するために、母集団データを適切に集約する作業を広げるためのいくつかの可能な戦略があります。

2
kas

あなたは常にサーバーとクライアントの間で送信されるデータの量を最小限にしたいと考えています。ある程度の追加作業を行うことで、サーバーが送信するデータの量を大幅に削減できる場合、これはおそらく成功です。

それ以外の場合は、実行する作業の総量または総コストを削減するという選択肢があります。すべてのユーザーが最新のスマートフォンを使用する1000人のユーザーにサービスを提供するサーバーを実行する場合、それらの合計計算能力は、ユーザーの10倍または100倍になる可能性があります。ハードワークをクライアントに移すことで、サーバーがすべてのユーザーにデータをより速く配信できる可能性が高くなり、全体としてユーザーが待機する時間が最小限に抑えられ、コストも最小限に抑えられます。

より多くのプログラミング作業は、いずれかを実行して(サーバーで計算orクライアント)、負荷分散のように使用できるようにすることです:サーバーが要求を受け取りすぎて遅れを始めた場合、それは作業をクライアントに送信します。

1
gnasher729