Задача: организовать RealTime мониторинг процессов системы реального времени.
Стек: - java
- ejb,
- hibernate
- postgres
Особенности: долгие транзакции, нагрузка ~100rps
Сценарий:
В приложении происходят события (~100rps ), изменяющие сущность(набор сущностей) в базе данных (Postgres).
Данные
событие (1) необходимо отправить на
удаленный сервер (2) , там его
обработать( десериализовать,проверить и подготовить к записи) (3) , и отразить изменения в
хранилище (4) , для того чтобы в отдельном приложении сделать RealTime мониторинг (javascript, middleware).
Требования:- События передаются и обрабатываются в порядке их возникновения
- Необходима гарантированная доставка событий
- В дальнейшем необходимо горизонтально масштабировать
- Нужно Schemaless решение
Сразу оговорюсь , что пробовали решать "инфраструктурно", репликацией БД, но результаты не удовлетворительные , реплика отстает на 5-10 минут, из за объема данных и не очень хорошего канала.
Собственно открытые вопросы:
- Формат и протокол : В каком формате передавать (binary,json,bson), какой "сериализатор" использовать (avro,thrift,jakson,protobuf)?
- Передача : Что использовать в кач-ве транспорта (rabbitmq,kaffka,thrift rcp,http)?
- Процессинг : Как "low latency" обрабатывать события, что использовать (akka,desruptor,plain java)?
- Хранение: Какое хранилище использовать?
_______________________________________________________________________
Пока сформировалось такое видение архитектуры:
- Формат: json
- Tranport: Apache Kaffka
- Процессинг : Akka(java)
- Хранение : MongoDB
Сценарий :
- происходит событие
- Используя CDI-events, при коммите транзакции событие сериализуется в JSON
- Далее событие публикуется в топи Kaffka
- Удаленный сервер, Akka, забирает сообщение из топика, выполняет проверки
- Далее событие сохраняется в Mongo
Уважаемые коллеги, мне необходим совет и критика данного решения, или альтернативные варианты архитектуры.
Может кто-нибудь имел опыт решения подобных задач.
Заранее спасибо!