Технический пост: переработка очередей


Продолжаем серию технических постов по разработке и рефакторингу ГолдВойса. Прошлый пост: очередь в Redis и рефакторинг Ленты новостей.

У страха глаза велики. Достаточно начать делать какие-то вещи и все постепенно встает на свои места. Переработаны очереди на обновление информации пользователей, постов и комментариев. Если раньше запись о необходимости обновления записывалась в саму базу и ожидало обработки, то теперь очередь идет в стандартный набор (set) Redis. Любая попытка дополнить его сопровождается проверкой на наличие в наборе, таким образом не происходит повторная запись и перегрузка очереди. После этого обработчик очереди стал дышать посвободнее 🏂

Как видно — до сих пор страдает учет голосов за посты и уведомления. Но состояние гонки постепенно решается. Обработка очередей будет вынесена на отдельную машину, но для этого надо переписать работу с нодой.

Раньше вся работа строилась на веб-сокетах. Учитывая, что тот же Стим отказался от них (причины тривиальны — сложность внедрения кэширования, кластеризации, отражения ddos-атак на веб-сокетах), стоит ожидать подобного же решения и от Голоса. Поэтому мы приступили к написанию максимально простого и быстрого jsonrpc php клиента к Graphene блокчейнам. Это будет простой класс работающих на сокетах. Что может быть лучше?

Если брать во внимание проблему с текущими очередями, то стоит заняться переносом учета голосов пользователей за посты и уведомления в отдельную структуру redis. Но для корректной реализации подобных изменений нужно добавить слой пользователей в redis. Вот тут и встает вопрос — как это сделать?

Хранить всю информацию и настройки профиля в redis, освободив старую инфраструктуру от этой задачи? Или все же стоит добавить redis как прослойку к пользовательским данным.

Лента новостей показала себя хорошо, она реализована на Sorted Sets через ZADD, ZCOUNT и ZREVRANGEBYSCORE. Для каждого пользователя создается свой сортированный набор и наполняется йд постов. Таким образом можно делать линейные выборки с подзагрузкой ленты и получать количество новых записей в персональной ленте новостей.

🌊 Шторм еще силен, но уже растерял свою пиковую силу. Рассвет грядет.


Comments 2


Вы собираетесь использовать редис как основное хранилище для параметров юзера? что будет когда он упадет? быстренько пишем таску и прогреваем всех юзеров данным из "ниоткуда"? =)

12.01.2018 00:39
0

Когда он падает или ребутится, он без проблем поднимает все из резервного файла. Также можно делать бекапы этого файла по расписанию. Поднять дублирующие сервера Redis в кластере.

12.01.2018 04:19
0