2013-07-09 1 views
0

Я пытаюсь понять логику последовательности Resque. Я считаю, что каждая очередь обрабатывается на основе FIFO (стандартное поведение в очереди), но, скажем, у меня есть несколько очередей - все с ожидающими заданиями - и два рабочих, обрабатывающих «*» (т.е. все очереди).Resque с несколькими работниками: какой заказ?

Какой алгоритм определяет, какая работа будет обработана следующим образом? Если бы это был универсальный FIFO, это была бы самая старая работа на любой очереди, но мне кажется, что происходит некоторая ротация очереди.

ответ

2

См https://github.com/resque/resque/blob/master/lib/resque/multi_queue.rb

Если он работает в режиме (что он делает по умолчанию) блокирует, то он использует BLPOP метод Redis', который принимает список очередей, и выскочит и возвращает значение из первой очереди иметь данные.

Redis 'BLPOP ставит клиентов по первому принципу, первым обслужен. Когда заданы несколько ключей очереди, он просто выполняет итерацию через них и устанавливает блокировку для каждой клавиши. См https://github.com/antirez/redis/blob/unstable/src/t_list.c#L781-815

Resque собирается построить список очередей, чтобы проверить, просто получить что-то вроде SMEMBERS queues, что означает, что очереди будут иметь приоритет в порядке, что команда SMEMBERS возвращает их. Это уставка, что означает, что его порядок не определен; вы в основном довольны Редисом.

1

Возможно, для этого вы должны знать немного Redis, потому что спасательное внутренне пользователь [blpop][1] проверка here

Теперь, как говорят blpop работа пусть у вас есть 2 списка или очереди king и queen

Рассмотрим следующий сценарий

1) when one or more message exist in `king` and `queen` has no message i.e empty 

    blop would pop a single message from `king` 

2) when `queen` has one or more message but `king` doesnt 

    blop would pop a message from `queen` 

3) when but `king` or `queen` both has message in them. 

now the order of queues decide from which the message would be popped 

Let say `king` has 3 message and `queen` has 2 message 

and let say the order is 

redis.blpop "king","queen",0 

blop would pop message from `king` 3 times(until it has no longer message in them) and then would pop the message from queue name "queen" 

Вы можете сослаться на redis documentation в списке и блоке для получения дополнительной информации

Надеюсь, что это имеет смысл

+0

Почему люди говорят, что resque внутренне использует 'blpop'? Их readme специально говорит, что по умолчанию проводится опрос каждые 5 секунд, а в журнале redis 'monitor' отображается' lpop'. Это недавнее поведение, и можно ли переключиться в режим 'blpop'? –