私はそれを理想的な解決策を見つけるのに苦労している問題を抱えています。それをよりよく説明するために、ここで私のシナリオを公開します。
複数のクライアントから注文を受け取るサーバーがあります。各クライアントは、指定された間隔で実行する必要がある一連の定期的なタスクを送信します。たとえば、クライアントAは、2009年12月31日から2010年12月31日まで1分ごとに実行する必要があるタスクAAを送信します。したがって、私の計算が正しければ、年間で約525 600の操作になります。クライアントとタスク が増えると、サーバーにこれらすべてのタスクを処理させることは不可能になるため、ワーカーマシンのアイデアを思いつきました。サーバーはPHPで開発されます。
ワーカーマシンは 、自宅や職場でホストする通常の安価なWindowsベースのコンピューターであり、各ワーカーには、停電を回避するための専用インターネット接続(動的IPを使用)とUPSがあります。また、各ワーカーはWebサービス呼び出しを介して約30秒ごとにサーバーにクエリを実行し、次の保留中のジョブをフェッチして処理します。ジョブが完了すると、ワーカーは出力をサーバーに送信し、新しいジョブなどを無限に要求します。システムを拡張する必要がある場合は、新しいワーカーを設定するだけで、すべてがシームレスに実行されます。ワーカークライアントはPHPまたはPythonで開発されます。
クライアントはいつでもサーバーにログオンして、注文したタスクのステータスを確認できるはずです。
ここで、注意が必要な部分が始まります。
- 何らかの理由でサーバーがダウンした場合、すでに処理されたタスクを再構築できなければなりません。
- ワーカーはクライアント固有ではありません。1人のワーカーが任意の数のクライアントのジョブを処理する必要があります。
一般的なデータベース設計と使用するテクノロジーについて疑問があります。
当初、私はいくつかのSQLiteデータベースを使用し、それらすべてをサーバー上で結合することを考えていましたが、クライアントごとにグループ化してジョブレポートを生成する方法がわかりません。
memcached、CouchDB、Hadoopなどのテクノロジーを実際に使用したことはありませんが、これらのいずれかが私の問題に適しているかどうかを知りたいのですが、そうである場合は、初心者にどちらをお勧めしますか?私のような「分散コンピューティング」(またはこれは並列ですか?)。ワーカーには動的IPがあることに注意してください。
前に言ったように、一般的なデータベース設計にも問題があります。これは、特定のR(D)DBMSをまだ選択していないこともありますが、私が選択したDBMSに依存しない問題が1つあります。キューイングシステムへ...特定のジョブに対するすべての絶対タイムスタンプを事前に計算し、タイムスタンプのセットが大きい場合は、それらを実行して昇順で完了としてフラグを立てる必要があります。または、タイムスタンプモジュラス60 = =0->実行"。この「賢い」システムの問題は、一部のワーカーが過負荷状態になっている間、何もしないで待機している可能性があるため、一部のジョブが正常に実行されないことです。何を指示してるんですか?
PS:この質問のタイトルとタグが私の問題と私がやろうとしていることを適切に反映しているかどうかはわかりません。そうでない場合は、それに応じて編集してください。
ご入力いただきありがとうございます。
@timdev:
- 入力は非常に小さいJSONエンコード文字列になり、出力もJSONエンコード文字列になりますが、少し大きくなります(1〜5 KBのオーダー)。
- 出力はWebから利用可能ないくつかのリソースを使用して計算されるため、主なボトルネックはおそらく帯域幅です。R(D)DBMSによっては、データベースへの書き込みも1つになる場合があります。