Shukurdin Aidarov
Всем привет, я опять со своей болью.
Есть сервис который читает сообщения из кафки и отправляет его клиенту по веб-сокету. Недоставленные сообщения сервис хранит у себя в памяти пока действует ttl. Отправленые же сообщения он удаляет после получения потверждения от клиента (гарантийная доставка).
Дело в том что инстансов этого сервисе очень много и сообщений в кафке много, но одно сообщение предназначено для одного клиента. То есть клиент создает соединение с каким определенным инстансом сервиса, поэтому каждому инстансу приходится читать копию сообщения, чтобы можно было отправить его клиенту. Из-за этого в каждом инстансе становится очень много сообщений, которые доставить невозможно потому что соединение с нужным клиентом только на одном инстансе.
Чтобы сервис не упал из-за нехватки памяти мы сделали ограничение на максимальное количество сообщений в сервисе. Но из-за этого у нас увеличилось время доставки сообщения клиенту (лаг в кафке около 1500 сообщений).
Так вот думаем не хранить сообщения в памяти а хранить в бд - она конечно не реизновая, но в нее гораздо больше влезет. Можем чистить бд раз в день.
Как считаете норм будет или нет?
Можно складывать во что-то более-менее дешевое, например в blob, и пытаться доставить fire and forget. Не доставил - просрал, но клиент может прочитать последние сообщения. Клиент при инициализации должен сначала подписаться на сообщения, а потом перед обработкой новых считать историю, в этот момент, если нужен порядок - буферизировать у себя сообщения. Когда история считана, проигрываем историю, потом проигрываем буфер. Ну и уже после этого новые обрабатываем сразу.