Как стать автором
Обновить

Комментарии 6

Напишу свое мнение про данную тему в Редисе, т.к. последние полгода довольно плотно использую его «и в хвост и в гриву».


Из хорошего — все нужные примитивы, действительно, есть. Поддержка lua-хранимок (кастомных команд) сделана просто великолепно. И можно построить космический корабль, если хочется (единственное «но» — БД не может быть больше памяти, вот это неустранимый минус).


А теперь о плохом. Такое ощущение, что разработчики Редиса пытались сделать «швейцарский нож» и хватались делать абсолютно все фич-реквесты пользователей, не следя особо за архитектурой и смыслом. Например, блокирующий BLPOP (как и бОльшая часть остальных блокирующих команд) не имеет не малейшего смысла, потому что обработку очереди на ее основе не построить: если клиент упал после выемки элемента, но до его обработки, элемент потеряется. Это архитектурная проблема. (Впрочем, внутри lua-хранимок такие команды могут еще иметь хоть какой-то смысл.)


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

если клиент упал после выемки элемента, но до его обработки, элемент потеряется


В статье приведён пример BRPOPLPUSH, про 2 очереди:
1) общая очередь с уведомлениями о заданиях
2) processing-очередь с заданиями, которые нужно удалять после выполнения

В примере при запуске/перезапуске клиента, невыполненные задания начинают выполнятся.
На мой взгляд правильнее при запуске/перезапуске клиента + по таймеру периодически проверять время создания заданий и просто переносить просроченные в общую очередь.

Brpolpush-то есть. Но речь была не об этом, а о том, что есть и вещи, которые использовать нельзя никак, и таких вещей подозрительно много.


Но некоторых вещей также нет совсем, либо же сделано неправильно. Например, hset с expiration элемента — нет. А для кастомного шардинга (выбора слота) часть ключа нужно обрамлять в {}, что несовместимо с бинарными ключами (приходится ключи делать base64 и терять половину места: +треть дает base64 и еще +2 байта дают эти {}).

первый абзац про очередь событий, FIFO это стек, насколько я знаю, а не очередь. Опечатка или я не прав? Прошу прощения, если ошибся
Да, Вы неправы. Очередь — это когда первым пришёл и первым ушёл.
Результат на строке 5 покажет изменения только экземпляра 2, и изменение цвета экземпляром 1 будет утеряно

Так JSON же здесь не причем, это так называемое состояние гонки (race condition), которое можно продемонстрировать даже на простом инкрементировании числа на стороне клиента

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории