Как отобразить задание среди нескольких работников с помощью Redis Pub / Sub?

#php #performance #redis #publish-subscribe

#php #Производительность #redis #опубликовать-подписаться

Вопрос:

У меня есть клиент Redis, которому необходимо разделить / сопоставить задание, скажем, между 3 работниками. Предположим, задание состоит из 3 задач. Я хочу распределить их таким образом, чтобы 3 из них выполнялись параллельно и задание занимало всего (приблизительно) 1/3 времени выполнения. Есть ли какой-нибудь способ сделать это с помощью самого Redis? Я не нашел ни одного.

Ответ №1:

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

Основной псевдокод:

 while(1)
  if some_condition
    redis.rpush "tasks", "task1"
    redis.rpush "tasks", "task2"
    redis.rpush "tasks", "task3"
  end
  sleep 5
end
  

Псевдокод рабочего:

 while(1)
  # blpop blocks until there is an element in "tasks" 
  task = redis.blpop("tasks", 0)[1]
  perform task
end
  

Комментарии:

1. Я бы использовал blpop вместо lpop в worker. blpop блокируется до тех пор, пока в очереди не появится что-то, что позволяет избежать ожидания занятости.

2. @Theo спасибо за совет! Это немного упрощает рабочий код.

3. Спасибо. Я тоже задавал этот вопрос в redis list. Есть несколько ответов, которые не используют Pub / Sub, но одинаково полезны. groups.google.com/group/redis-db/browse_thread/thread /…

4. @mixdev Правильно, это не решение для pub / sub. Я думаю, вы хотели бы использовать pub / sub только в том случае, если всем работникам необходимо получить одну и ту же задачу при размещении в очереди. Однако, похоже, это не соответствует вашему варианту использования.