У меня есть следующий сценарий:
- Получить массив чисел (из REDIS) условно
- Для каждого числа выполните некоторые асинхронные действия (выберите что-нибудь из БД на основе числа)
- Для каждой вещи в наборе результатов из БД сделайте еще один асинхронный материал
Периодически повторяйте 1. 2. 3.
, потому что новые числа будут постоянно добавляться в структуру REDIS. Эти числа представляют временную метку unix в миллисекундах, поэтому по умолчанию эти числа всегда будут сортироваться по времени добавления
Условно означает извлечение из REDIS тех меток времени unix, которые меньше или равны текущей метке времени unix в миллисекундах (Date.now()
).
Вопрос заключается в том, какой тип данных REDIS больше всего подходит для этого варианта использования, учитывая, что этот код будет масштабироваться до N экземпляров, поэтому N экземпляров будут совместно использовать доступ к одному экземпляру REDIS. Чтобы поровну распределить нагрузку, каждый экземпляр будет считывать, например, первые (самые старые) 5 номеров из REDIS. Числа уникальны (добавление одного и того же числа должно завершиться автоматически), поэтому REDIS SET кажется хорошим выбором, но чтение M первых элементов из набора REDIS кажется невозможным.
Чтобы два разных экземпляра кода не читали одни и те же числа, операция чтения REDIS должна быть атомарной, она должна считывать числа и удалять их. Если какая-либо асинхронная операция завершается с ошибкой для определенного числа (steps 2. and 3.
), необходимо снова добавить числа в REDIS для повторной обработки. Их следует повторно добавить обратно в голову не до конца, чтобы как можно скорее снова обработать их. Насколько я знаю, SADD
подтолкнет его к хвосту.
SMEMBERS key
читал бы всё, мне это кажется молотком. Мне нужно было бы включить некоторую логику приложения, чтобы получить первые пять, чем проверять, что меньше или равно Date.now()
, а затем удалить их и каким-то образом обернуть все в одну транзакцию. Кроме того, количество элементов набора может быть огромным.SSCAN
звучит интересно, но я понятия не имею, как это работает в "масштабированной" среде, как описано выше. Кроме того, согласно документам REDIS: семейство команд SCAN предлагает только ограниченные гарантии в отношении возвращаемых элементов, поскольку коллекция, которую мы постепенно итерируем, может измениться в процессе итерации. Как описано выше, коллекция будет часто меняться.