4

私は、従業員が業界統計を必要とする製品のリストをアップロードするためのインターフェースをまとめています (現在、一度に 1 つずつ手動で行っています)。
各製品は、Web サービス API を介して統計エンジンに提供されます。
返信させていただきます。Stat のエンジンは、API から「次の犠牲者」を要求します。

ユーザーがアップロードする各リストには、50 ~ 1000 個の製品が含まれ、独自のキューになります。
今のところ、キュー/リストは 1 日あたり約 10 ~ 20 回追加 (および完了により削除) される可能性があります。
成功すれば、トラフィックはおそらく数か月後に 1 日あたり 700 ~ 900 件のリストに回復するでしょう。

単純なラウンド ロビン アプローチを使用して、トラフィックをキュー間で均等に転送することを計画しています。
マルチプレクサは、List A、次にList B、次にList Cの一番上のアイテムを取得し、再びList Aにループバックします... リスト/キューはいつでも追加/削除できることに注意してください。

私が直面している問題は、これの管理を概念化することです。
各キューをフラット ファイルとして保存し、リレーショナル DB (MySQL) を介してローテーションを管理することを考えました。逆に考えてみました。完全にフラット ファイルにするか、完全にリレーショナル DB にするかを考えましたが、結論として、私は柔軟です。
とにかく、参加者の可変リストを循環ローテーションでステートレスに融合しようとすると、私の脳は単に蒸気ロックです (短い休暇から戻ったばかりで、私の脳はまだ家に帰っていないと思います;)

誰かがこのようなことをしましたか?
どのように対処しましたか?
もう一度やり直さなければならないとしたら、何を改善しますか?

あらゆるヒント/提案/アドバイスを歓迎します。

注: 統計のエンジン/ツールからの各リクエストは、数分とは言わないまでも数秒間隔で分割されるため、これをステートレスに保つ必要があります。

4

3 に答える 3

1

確かに、リスト データはデータベースに保存する必要があります。PHP 側には、システムのステータスを示すビューと、リストを追加するためのフォームが必要です。

各リクエストが独自のキューになり、すべてのリクエスト キューの優先度が等しいと見なされるため、テーブルの理想的な数はおそらく 3 です。1 つはリクエストとその優先度を別のテーブル (ラウンド ロビンで次に進む人を決定するため) と処理ステータスをリストするもの、もう 1 つはまだ処理されていない各リクエストの内容(リスト項目) をリストするもの、3 つ目のテーブル各キューから処理されたアイテムを一覧表示します。

また、実際の処理を実行するスクリプトも必要です。これは、ユーザーの要求によってではなく、定期的に実行される (必要に応じて調整される) システムによってスケジュールされたジョブによって駆動されます。もちろん、これは PHP でも可能です。ここで、一度に 10 個のリストのチェックと更新を設定します。

処理は次のようになります。

  1. 優先度の最も高いキューから次の最大 10 個のアイテムのセットを選択します。
  2. それらを処理し、完了すると DB ステータスを更新します。
  3. 上記のキューの優先度を更新して、優先度が最も低くなるようにします。

また、新しいキューが追加された場合、それらは最も低い優先度で追加されます。

優先度は整数で表すことができます。

ユーザーは、リストが処理されるまで辛抱強く待ってから、結果を表示またはダウンロードする必要があります。ビュー ページで、このための自動更新スクリプトを設定できます。

于 2012-07-24T23:02:14.717 に答える
0

おやすみなさいの睡眠の後、私は今、私についての私の知恵を持っています(私は願っています:)。
簡単な解決策は、優先順位のフラット ファイルです。
各行に 1 つのリスト/キュー ID を含む単純なテキスト ファイルを作成します。リストの一方の端から
フィードし、もう一方の端に追加する... シンプルです。

批判は大歓迎です;o)

フィードバックをくれた @Trylobot と @Chris_Henry に感謝します。

于 2012-07-25T12:46:52.370 に答える
0

Gearmanがすでに非常にうまく行っていることを実装しようとしているようですね。アップロード/リクエストごとに、単純にジョブを Gearman サーバーに送信してキューに入れることができます。

Gearman は永続的であるように構成できます (事態が最悪の事態に陥った場合に備えて)。これにより、リレーショナル データベースに要求を記​​録する必要がなくなります。

その後、必要な数のワーカーを開始できます。すべてのジョブを連続して実行することをお勧めしていることは知っていますが、これは引き続き実行できますが、作業を並列化することもできるため、すべてのジョブが連続して処理された場合に比べて、ユーザーが長時間座っていることはありません。ファッション。

于 2012-07-25T01:37:42.977 に答える