Redis - шаблон надежной очереди с использованием SET NX

Общий способ реализации надежной очереди с Redis - это использование RPOPLPUSH - для перехода из очереди "ожидания" в очередь "обработки". Затем работник обрабатывает задание и удаляет его из очереди "обработки". Если работающему не удается удалить его из очереди "обработки", другой процесс мониторинга переводит задание из очереди "обработки" обратно в очередь "ожидания". Подробности здесь: https://redis.io/commands/rpoplpush (Шаблон: надежная очередь)

Это один из подходов реализации Amazon SQS, например, "тайм-аут видимости" ( https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html).

Кроме того, у меня есть следующая схема, которая не требует дополнительного процесса "мониторинга": Обратите внимание, что здесь используется общий шаблон блокировки redis, описанный здесь: https://redis.io/topics/distlock 1. Jobs are queued to a "waiting" queue 2. For a worker to be able to process a job it needs to lock it 3. Locking is implemented using "SET NX" command 4. Hence to work on a job, the worker needs to: index := 0 while true { results := lrange waiting_queue index index if results is nil or empty // nothing to process, break out of loop break; else // try and lock it SET job.Id my_random_value NX PX 30000 If "SET" is successful, then lock acquired on Job { // mark it so that we can delete it later job.mark = my_random_value jobJson := toJson(job) LSET waiting_queue index jobJson process the job Del the lock Del(jobId, my_random_value) (Delete only if value matches) lrem job 1 jobJson } else { index++ } }

Мысли, комментарии по этому подходу?

0 ответов

Другие вопросы по тегам