2016-11-02 3 views
0

У меня есть требование, в котором мне приходится выполнять отложенное планирование в Redis. Задержка может быть в часах. Как обсуждалось в этом answer один способ достижения этой цели, как показано ниже: -Отложенное планирование в течение часа в Redis

  1. Добавить работу в отсортированный набор
  2. Диспетчерский поток, который проверяет отсортированные наборы каждые N секунд например - ZRANGEBYSCORE jobs -inf, <current unix timestamp>
  3. Всякий раз, когда некоторые рабочие доступны шаг это к основному списку заданий, где основные рабочие рабочие являются blpop'ing.
  4. Удалить задания из отсортированного набора.

Может кто-нибудь предложить несколько способов, как я могу изменить приведенный выше подход для обработки ниже случая: -

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

Один из способов, о котором я могу думать, - это поток диспетчера писать в промежуточный список, а не в основной список. Еще один поток будет проверять промежуточный список за каждые N секунд. Всякий раз, когда доступна какая-либо работа, переместите ее в основной список, выполнив BRPOPLPUSH.

Может ли кто-нибудь предложить другой лучший и оптимальный способ?

+0

Действительно ли вы хотите создать домашнюю систему массового обслуживания, если у вас есть много уже выполненных и работающих? RabbitMQ, привет? : D –

+0

У нас уже есть один. Нам нужно добавить эту поддержку отложенного планирования. Из-за некоторых нетехнических проблем мы не можем перейти на rabbitmq сейчас. – tuk

ответ

1

Я не пробовал, но думаю, вы можете использовать Lua script для перевода задания из отсортированного набора в основной список заданий и удаления его из отсортированного набора. Согласно документации по transaction:

Redis сценарий является транзакционной по определению, поэтому все, что вы можете сделать с транзакцией Redis, вы также можете сделать с помощью сценария, и, как правило, сценарий будет проще и быстрее

и

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

+0

Сценарий Lua блокирует весь redis при его выполнении или блокирует только структуру данных, на которой он работает? Я пытаюсь спросить, скажем, в сценарии lua. Я выполняю команду как «redis.call» («zadd», «test1», i, i) », поэтому это блокирует весь redis или блокирует только операции над' test1'? – tuk

+0

Я думаю, что все заблокировано до завершения скрипта, см. [Doc] (http://redis.io/commands/EVAL#atomicity-of-scripts). Я не знаю, является ли это проблемой, поскольку то, что вы пытаетесь сделать, просто. – LFI

+0

Если он блокирует все, то не должен ли подход, который я предложил в моем вопросе, лучше? – tuk

Смежные вопросы