#apache-kafka #publish-subscribe #akka-stream
Вопрос:
У меня есть случай использования, когда мне нужно доставлять события в реальном времени клиентам через websocket. Я подумал о том, чтобы использовать для этого Кафку. Потребляя msg из кафки и передавая его через веб-сайты. Однако, когда клиент отключается, ему нужны данные с того места, на котором он остановился. Поэтому для этого необходимо выполнить поиск с новым потребителем, а также общий потребитель не должен доставлять сообщения до тех пор, пока не будут доставлены предыдущие сообщения для этого клиента. Поэтому я чувствую, что кафка не может лучше всего подходить для этого случая. Потому что может быть много клиентов, которые просят различные компенсации.
Также я думал об использовании актеров Акка. Участники, созданные для каждого клиента, и сообщения будут помещены в соответствующую очередь участников. Однако это не будет постоянным, если сервер перезагрузится после отключения клиента.
В конечном счете, нам нужна очередь, в которой данные каждого клиента будут храниться отдельно и доставляться. В случае каких-либо проблем с подключением клиента, только определенная очередь клиентов ожидает.
Существует ли какой-либо другой механизм / очередь сообщений pub-sub, который может решить эти варианты использования, или в вышеупомянутой архитектуре можно выполнить какие-либо обходные действия ?
Ответ №1:
Существует сохраняемость Akka, которая позволяет сохранять состояние субъекта (поиск событий, вероятно, здесь подошел бы лучше, чем новый подход к длительному состоянию, тем более что последний еще не поддерживается в базах данных, которые могут обрабатывать действительно большие объемы записи).
Если все клиенты в конечном итоге используют одну и ту же тему Кафки, тогда может иметь смысл эффективно дублировать содержимое темы в постоянном субъекте (или, точнее, во многих постоянных субъектах, каждый из которых отвечает за блок последовательных сообщений из темы… общий постоянный субъект для темы может затем отслеживать, когда блоки могут быть удалены и т. Д.). У каждого клиента будет постоянный субъект, который отслеживает, где он находится в потоке.