У меня есть сервер, который прослушивает очередь и обрабатывает данные с нее.
Это логика для выборки данных:
BLPOP queue 60
if data found in queue:
LRANGE queue 0 9 //Fetch 10 more items
int size = queue.size()
LTRIM queue size -1 //Remove the items fetched by lrange
Задача
У меня есть 2 узла этого сервера, выполняющих одну и ту же задачу, и я столкнулся с проблемами параллелизма.
Например, один и тот же элемент извлекается в BLPOP
одного узла и LRANGE
другого узла, что приводит к дублированию обработки.
Один из способов решения проблемы - поместить MULTI
EXEC
в раздел LRANGE
LTRIM
.
Но у меня есть несколько вопросов:
- Как мне
LTRIM
получать только элементы внутри транзакции, поскольку мы не можем получить значение LRANGE
в транзакции?
- Защищает ли транзакция
LRANGE
от BLPOP
другого узла?