@romashkoaleksandr

Как правильно реализовать очередь заданий используя Redis + PHP?

Здравствуйте

Необходимо реализовать очередь заданий. Эту очередь будут обрабатывать несколько серверов.
Задания в redis будет храниться как строка из 400-1000 символов

Но возникло несколько вопросов:
1. Как лучше хранить задания в redis?
a. в списке сразу хранить задания(эти 400-1000 символов)
b. брать хэш(к примеру md5) заданий и сохранять в паре ключ-значение, где ключ - это хэш, а значение - задание. а в самом списке хранить хэши, т.е. для выполнения задания нам надо будет получить хэш, и по хэшу уже само задание.

2. Как реализовать приоритет
У меня только одна мысль. Сделать несколько очередей. В одну очередь помещаем задания с минимальным приоритетом, во вторую со средним, а в третью - с высоким.

2. Как обрабатывать эти задания?
Обработчиков должно быть несколько и они будут расположены на разных серверах.
Одно задание должен обработать только один сервер.
Обработчик должен быть на PHP

Так вот я думаю сделать так

// подключаемся к redis

while (true) {
  // проверяем или есть значение в очереди с ВЫСОКИМ приоритетом
  // проверяем или есть значение в очереди с СРЕДНИМ приоритетом 
  // проверяем или есть значение в очереди с НИЗКИМ приоритетом 

  // если нашли задание, то выполняем

  // если не нашли, то выполняем цикл.
}


Направьте меня на правильный путь. Спасибо
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
2. Как реализовать приоритет

редис позволяет выбирать ключи по паттерну, соответственно в ключах и храните приоритет, типа 1_somehash. В остальном логика вроде верная.
Ответ написан
Gomonov
@Gomonov
Обычно очередь предполагает что консьюмер после обработки будет слать подтверждение. И только после этого данные удаляются из очереди. Причём, если один консьюмер забрал сообщение и его обрабатывает - второй не может его забрать, хотя оно её в очереди. В случае с redis - эту схему придётся реализовывать, как например а либе php-redis-queue, которую предложил выше A N. Конечно можно на это забить, и сразу удалять сообщение, надеясь что консьюмер его точно обработает - в этом случае реализация простая. Ну или брать php-redis-queue. А так, конечно же использовать готовые решения для очередей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 150 000 руб.
ManyChat Москва
от 180 000 до 250 000 руб.
Автокод Екатеринбург
от 65 000 до 90 000 руб.
21 июл. 2019, в 14:16
5000 руб./за проект
21 июл. 2019, в 13:57
1000 руб./за проект
21 июл. 2019, в 12:53
5000 руб./за проект