(от 10к до 50к rps) в базу данных таким образом, чтобы минимально нагружать основную бд (mysql)
Для реализации этого использую redis как intermediate storage - то есть, сначала события записываются в redis (инкрементируются), а потом, по таймеру/событию - выгребаются из redis-а и записываются в бд, после чего удаляю значения из redis-а.
Функционал разделен на два сервиса: 1 - слушает события и записывает в redis, 2 - раз в n-ое время запускается, читает данные из redis-а, записывает в mysql и удаляет ключи из redis-а
Проблемы (я вижу, их, возможно, больше):
1) В момент записи в бд и удаления ключей из redis-а придет еще множество событий, которые, в конечном итоге, не будут записаны в mysql. Как можно избежать этой ситуации, или так или иначе какое-то количество событий будет потеряно?
2) worker, который раз в n-ое количество времени будет постоянно “крутиться” в контейнер, но полноценно что-то делать будет по таймеру - может, стоит как-то изменить подход, чтобы обойтись без лишнего использования ресурсов?
Заранаее благодарю!
А не вариант вместо Redis использовать Кафку?
вариант Процесс будет такой же, верно? Один сервис - записывает Второй - раз, в какое-то время читает, записывает в основную бд и помечает сообщения в kafka как прочитанные
Плюс тут в том, что сообщения из Kafka не удаляются - то есть вы их точно не потеряете. Если припрёт обработать ещё раз (например, если что-то пошло не так), то это тоже можно.
Возьмите tarantool и оберните синз данных с мускулем через транщакцию. Плюсом получите масштабирование почти из коробки
хм, звучит интересно, спасибо большое! Не подскажате, где можно подробнее про это почитать/найти примеры?
Можно на хабре почитать или в группе @tarantool
> чтобы минимально нагружать основную бд Что такое "основная бд"?
В данном случае - mysql
я не про технологию. Почему вы называете её основной? Основная по отношению к чему?
Обсуждают сегодня