web-dev-qa-db-ja.com

複数の労働者のためのシステム設計

サードパーティのリソースをポーリングするクローラーと見なすことができる多くのマイクロサービスがあり、新しい情報が見つかった場合は、データを処理してDBに保存する他のサービスに渡すシステムを設計する必要があります。

私はもう少しコンポーネントが必要だと思います-コーディネーター。ワーカーを生成したり、サービスが機能しているかどうかを確認したりします。

したがって、3つの主要なコンポーネントがあります。

  1. ワーカー
  2. コーディネーター
  3. プロセッサー

プロジェクトのこの時点では、労働者の仕事がどれほど集中的であるか(つまり、ポーリング間隔、新しい情報の量)はわかりません。それでも、システムを拡張できるようにしたいと思います。

次に、技術的な部分について説明します。

  1. ワーカーは新しいデータについてプロセッサにどのように通知する必要がありますか?単純なRESTサーバー(つまり、Apache Tomcat)またはメッセージブローカーを使用して、データをバックエンドサービスに配信する必要がありますか?
  2. コーディネーターのための適切なフレームワークまたはツールはありますか?車輪の再発明はしたくないし、ベストプラクティスに従いたい。
  3. 明らかに、ジョブごとに異なるサーバーを使用するのは無駄です。必要なサーバーの数を決定するにはどうすればよいですか?動的に決定できますか?すべてのワーカーが同じサーバーに住むことはできますか?
  4. 私がこれを書いているとき、私は概念的に、私たちは仕事と労働者の間で異なる必要があることに気づいています。ですから、コーディネーターは新しい仕事ごとに労働者を設定する必要があると思います。それは理にかなっていますか?

私が言ったように、私は実際に車輪の再発明をするつもりはないので、仕事に適したツールを使用したいと思います(しかし、私は最も素晴らしい解決策を探していません-私はそれを比較的単純に保ちたいです)

また、先ほど申し上げたように、作業の集中度を判断するための数値はありませんが、システムの拡張が容易であることに留意する必要があります。私はJavaを使用しています。

2
yaseco

ワーカーは新しいデータについてプロセッサにどのように通知する必要がありますか?単純なRESTサーバー(つまり、Apache Tomcat)またはメッセージブローカーを使用して、データをバックエンドサービスに配信する必要がありますか?

これにはHTTP(REST)呼び出しを使用して、シンプルに保つことができます。問題は、呼び出したいホストが何であるかをどのように知るかです。 Kafkaのようなものを使用することを検討できます。これは、イベント配信用に設計されています。非常に正当な理由がない限り、「メッセージブローカー」ソリューションは避けます。

コーディネーターのための適切なフレームワークまたはツールはありますか?車輪の再発明はしたくないし、ベストプラクティスに従いたい。

KubernetesやDockerSwarmなどのコンテナオーケストレーションが適しているようです。これらはJavaで記述されていませんが、コンテナーでJavaを実行できます。

明らかに、ジョブごとに異なるサーバーを使用するのは無駄です。必要なサーバーの数を決定するにはどうすればよいですか?動的に決定できますか?すべてのワーカーが同じサーバーに住むことはできますか?

繰り返しになりますが、これにはコンテナ化が書かれています。

私がこれを書いているとき、私は概念的に、私たちは仕事と労働者の間で異なる必要があることに気づいています。ですから、コーディネーターは新しい仕事ごとに労働者を設定する必要があると思います。それは理にかなっていますか?

私はそう思う。それは自然な解決策のようです。

2
JimmyJames