2

現在、アップロードされたファイルを処理するためのシステムを設計しています。

ファイルは LAMP Web フロントエンドを介してアップロードされ、いくつかの段階を経て処理する必要があります。いくつかの段階は順次実行され、他の段階は並行して実行される可能性があります。

いくつかの重要なポイント:

  • ファイルをアップロードするクライアントは、処理の結果ではなく、ファイルを安全に配信することのみを気にするため、完全に非同期にすることができます。
  • ファイルのサイズは最大 50kb です
  • システムは、1 日あたり 100 万を超えるファイルを処理できるようにスケールアップする必要があります
  • ファイルが失われたり未処理になったりしないようにすることが重要です
  • 私の仮定はMySQLですが、これが利点を提供できる場合、NoSQLに問題はありません.

私の最初のアイデアは、フロント エンドでファイルを MySQL DB に直接配置し、各ステップを完了するたびに多数のワーカー プロセスがデータベース設定フラグをポーリングするようにすることでした。いくつかの大まかな計算の後、ワーカーのポーリングがアップロード テーブルでロックの問題を引き起こし始めるため、これは拡張できないことに気付きました。

いくつかの調査の結果、Gearman が問題の解決策になる可能性があるようです。ワーカーは Gearman サーバーに登録でき、DB を壊すことなくジョブをポーリングできます。

私が現在困惑しているのは、最も効率的な方法でジョブをディスパッチする方法です。これを行うには、次の 3 つの方法があります。

  • データベースをポーリングしてジョブを Gearman に送信する単一のディスパッチャーを作成する
  • ファイルを受信したときに、アップロード プロセスで非同期の Gearman ジョブを起動する
  • Gearman MySQL UDF 拡張機能を使用して、ファイルが挿入されたときに DB がジョブを起動するようにします。

最初のアプローチでも DB に多少の打撃を与えますが、障害から簡単に回復できます。2 番目の 2 つのアプローチでは、障害から回復するために Gearman キューの永続性を有効にする必要があるように思われますが、これを有効にすると、Gearman に引き付けられる生の速度が失われ、DB のボトルネックがダウンストリームにシフトするのではないかと懸念しています。

これらのアプローチのどれが最も効率的であるか (またはより良い実世界の例) に関するアドバイスをいただければ幸いです。

また、私がすべてを間違った方向に進めていると思われる場合は、遠慮なくご連絡ください。

4

2 に答える 2

2

これは少し前から公開されているので、私が取ったアプローチについていくつかの情報を提供したいと思いました.

ファイルがアップロードされるたびに、各ファイルに必要な一連の処理手順を理解している「派遣」労働者のためにギアマン ジョブを作成します。ディスパッチャは、処理ステップごとにギアマン ジョブをキューに入れます。

完了するジョブはすべて、完了タイムスタンプを DB に書き戻し、ディスパッチャーを呼び出します。ディスパッチャーは、後続のタスクをキューに入れることができます。

ジョブの完了ごとにタイムスタンプが書き込まれるということは、処理が失敗したり失敗したりした場合に、永続的なキューの負担を負うことなく、システムがキューを回復できることを意味します。

于 2012-05-24T15:37:36.280 に答える
0

ファイルをディスクに保存してから、ファイル名をGearmanに送信します。プロセスの各部分が完了すると、プロセスの次の部分に対して別のメッセージが生成されます。次のステージで作業できるように、ファイルを新しい仕掛品ディレクトリに移動できます。

于 2012-01-23T18:50:33.307 に答える