2015-03-24 2 views
0

Мне нужно убедиться, что не более одной работы за user_id работает одновременно одним из 25 рабочих, чтобы избежать взаимоблокировок.Уникальная обработка вакансий Sidekiq

Я пробовал уникальные задания sidekiq, но тупики продолжаются, потому что он пытается обрабатывать все ожидающие задания в очереди, не ища user_id в параметрах.

Спасибо

класс MyWork
включают Sidekiq :: Worker
sidekiq_options: очереди => "критические", уникальны: правда, unique_args: -> (арг) {[args.user_id ]}

четкости выполнения (work_params)

+0

Вот и не очень хорошая идея: возможно, вы можете поддерживать таблицу, содержащую идентификаторы пользователей, которые обрабатываются. Каждый раз, когда вы должны начать обработку, взгляните на таблицу и текущий идентификатор пользователя; начните обработку, только если идентификатор пользователя не находится в таблице. Если он находится в таблице, верните задание обратно в очередь. – bsvin33t

+0

В конечном итоге это может быть неплохой идеей :) – ace

+0

Вы должны попытаться использовать хранилище в памяти, предоставленное redis, чтобы сделать это, а не activerecord. – bsvin33t

ответ

1

sidekiq_option args - массив, который имеет ваше works_params на первой позиции. Затем вам нужно сделать:

class MyWork 
    include Sidekiq::Worker 
    sidekiq_options :queue => "critical", unique: until_executed, 
        unique_args: ->(args) { [ args.first.user_id ] } 

    def perform(work_params) 

Обратите внимание, что unique: true является устаревшим, так что вы должны использовать unique: until_executed или что-то лучше всего подходит для вашего рабочего. См. here для других опций.