簡単に言えば、ツールがMySQL DBサーバーに過度にヒットするという多くの問題がありました。そこで、Beanstalk を使用して、DB で実行したいことを常時実行中の DB 接続のセットに伝える一連のツール (PHP および Ruby) を作成しました。受信ジョブと応答の両方に Beanstalk チューブが使用されます。
ただし、DB リクエストのジョブ データに ExpireTime を追加しました。基本的に、DB リクエスト ジョブがかなり短い時間枠内で実行されない場合、リクエストはまったく実行されません。とにかく、要求しているタスクはそれ自体でタイムアウトするため、短い時間枠を設けることで、DB 実行スクリプトが使用されない一連の DB 要求を実行しないようにします。
すべてが 1 台のマシン上にある限り、これはすべて問題なく機能します。今、私はそれを 2 台目のマシンに拡張していますが、すぐにリクエストが期限切れと見なされる問題に遭遇しました。
タスクの現在の有効期限は 10 秒です。これは、完了しようとしている単純な DB 要求に対しては、すでにかなり長い時間です。10 秒を十分な数に増やすと、DB リクエストは問題なく迅速に実行されます。
したがって、この問題は、あるコンピューターが 12:00:XX であると考え、別のコンピューターが 12:00:YY であり、XX と YY の差が少なくとも 8 秒または 9 秒であると考えていることに要約されると思います。
LAN で Ubuntu 12.04 デスクトップとサーバーを使用しています。Ruby (1.8.7) と PHP (5.3.10-1ubuntu3.4) の両方で、この Beanstalk キューを一種の DB 接続プールとして、またプロジェクト/サイト関連のタスクを分散環境で実行するためのタスク キューとして使用するプログラムを作成します。方法。PHP には pheanstalk を使用し、Ruby には beankstalk-client gem を使用します。
私が考えたハックは、DB 要求を実行するコンピューターが 1 秒に 1 回、現在の時刻を出す豆の木管を作成することです。次に、リクエストをキューに入れている分散コンピューターは、最新のタイムスタンプを取得するために、そのジョブを取得する (削除するのではなく、解放する) 必要があります。これは大雑把であり、(私が信じている) 衝突につながると思います。つまり、現在の時間のジョブ データを取得するのを待っている要求です。これに追加するコンピューターの数を増やすと。
このフォーラムの誰かがこれを行うためのより良い方法を持っていることを願っています.