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