現在、アップロードされたファイルを処理するためのシステムを設計しています。
ファイルは 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 のボトルネックがダウンストリームにシフトするのではないかと懸念しています。
これらのアプローチのどれが最も効率的であるか (またはより良い実世界の例) に関するアドバイスをいただければ幸いです。
また、私がすべてを間違った方向に進めていると思われる場合は、遠慮なくご連絡ください。