@romashkoaleksandr

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

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

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

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

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

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

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

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

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

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

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


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

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

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

Войти через центр авторизации
Похожие вопросы
ЧИТАЙ-ГОРОД Москва
от 140 000 до 210 000 ₽
Farpost Томск
от 60 000 ₽
ManyChat Москва
от 180 000 до 250 000 ₽
26 февр. 2020, в 05:15
5000 руб./за проект
26 февр. 2020, в 01:14
600 руб./в час
26 февр. 2020, в 01:13
1500 руб./за проект