2011-01-13 3 views
1

Я работаю над многопользовательским деревом. Он использует resque gem для фоновых процессов. Чтобы избежать многопользовательских конфликтов во время выполнения, я хочу использовать шаблон команды и хранить пользовательские действия в очереди resque, поэтому, если кто-то удаляет ветку, другой пользователь не может редактировать дочерние элементы этой ветви.Использование resque для реализации шаблона команды

Он работает, но он довольно медленно выбирает работу в первый раз из очереди, потому что работник resque проверяет задания, используя интервал в 5 секунд. Это значительно замедляет редактирование интерфейса. Это possibe сделать что-то вроде этого:

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 

Он делает то, что мне нужно, но мне интересно, если есть более элегантный способ сделать это. Кроме того, процесс - это устаревший метод для экземпляров Worker.

ответ

2

Я думаю, что ваш подход к дизайну несколько звучит, но Redis/Resque может оказаться неприемлемым. То, что вы хотите, это супер быстрый очереди в памяти, который похож на Resque, но это не связано с задержкой опроса.

Я уверен, что вы можете использовать MemCached для этого, но могут быть и другие варианты. Любое решение, в котором ваши команды с очередью нужно вытягивать с определенным интервалом, вероятно, не обеспечит приемлемую производительность для совместного редактирования, если только не будет опроса, возможно, каждые 100 мс или даже чаще.

Наконец, если вы размещаете каждое действие в одной очереди, которая может обрабатывать только команду поочередно (по одному за раз), вы неизбежно окажетесь в ситуации, когда очередь может делать резервную копию, потому что приходит слишком много команд в, и они не обрабатываются так быстро. Вот почему более масштабируемое решение, возможно, с использованием управления версиями, где каждый элемент дерева версируется, а при обновлении/изменении все дочерние элементы обновляются и с новой версией. Таким образом, изменение на более раннем номере версии отклоняется.

В любом случае .. удачи, звучит как нетривиальная проблема для решения.

+0

Я впечатлен скоростью resque/redis и не против, если есть латентность менее 10-20 миллисекунд для графического интерфейса. Resque также позволяет использовать отдельный процессор для определенных задач из коробки. Так что пока я не вижу сильной причины переключиться на memcached или inmemory solution – dimus

Смежные вопросы