1

私はマルチユーザーツリー編集アプリに取り組んでいます。バックグラウンドプロセスにresquegemを使用します。実行時のマルチユーザーの競合を回避するために、コマンドパターンを使用し、ユーザーアクションをresqueキューに保存して、誰かがブランチを削除している場合、他のユーザーがそのブランチの子を編集できないようにします。

動作しますが、resqueワーカーが5秒間隔でジョブをチェックするため、キューから最初にジョブを選択するのは非常に遅くなります。編集インターフェースの速度が大幅に低下します。このようなことをすることは可能です:

    cmd = MyCommand.create!(:attr1 => 'foo', :attr2 => 'bar')
    Resque.enqueue(MyCommand, cmd.id)
    workers = Resque.workers.select {|w| w.queues.include?('my_queue') }
    raise "Should be only one queue for commands!" if workers.size != 1
    not_done = true
    while not_done
      not_done = workers[0].process
    end

それは私が必要とすることをします、しかし私はこれをするよりエレガントな方法があるかどうか疑問に思います。また、:processはWorkerインスタンスの非推奨のメソッドです。

4

1 に答える 1

2

あなたの設計アプローチはある程度健全だと思いますが、Redis/Resque は適切ではないかもしれません。必要なのは、Resque に似た超高速のメモリ内キューですが、ポーリングの遅延はありません。

これには MemCached を使用できると確信していますが、他のオプションがあるかもしれません。キューに入れられたコマンドを特定の間隔でプルする必要があるソリューションは、おそらく 100 ミリ秒ごと、またはそれ以上の頻度でポーリングしても問題ない場合を除き、共同編集に許容できるパフォーマンスを提供しないでしょう。

最後に、コマンドを順番に (一度に 1 つずつ) しか処理できない単一のキューにすべてのアクションを配置すると、必然的に、あまりにも多くのコマンドが入ってくるためにキューがバックアップされる状況に陥ります。処理速度が遅くなります。これが、ツリーの各要素がバージョン管理され、更新/変更されると、すべての子要素も新しいバージョンで更新される、バージョン管理を使用することで、よりスケーラブルなソリューションになる可能性がある理由です。そうすれば、古いバージョン番号の編集は拒否されます。

とにかく..頑張ってください。解決するのは重要な問題のようです。

于 2011-01-14T01:16:59.440 に答える