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++
}
}
Мысли, комментарии по этому подходу?