В Rockstat построен на микросервисах (бошка не варит напишу потом) Рассмотрим пример:
event.in.gen.track.page - входящий запрос общего типа generic, который финально должен быть обработан сервисом track и название события для этого сервиса page (просмотр страницы).
Самого сервиса с названием track не существует, в этом нет необходимости. Но по этой метке другие смогут определить что это за событие.enricher. Front знает список сервисов (получает от Director service), которые хотят участвовать в обогащении событий с определённым ключом.
Например, для ключа in.gen.track.page найдутся сервисы MaxMind ip2geo, Sypex ip2geo, UserAgent parser.
Все они получат событие и на основе его содержимого сгенерируют свои дополнения.
Они произведут определение географической точки на основе ip адреса,
а также на основе User-Agent определят какие устройство, операционная система и браузер использовались.
Результаты будут отправлены обратно в Front, где будут дописаны к данным события.
/// Продолжение ниже ///handler).
Эта роль отвечает за принятие действий на основе полученного события.
На основе полученных данных handler может отправить обратно в браузер сигнал или данные,
может написать кому-то через чат-бота или послать письмо, или попросту передать сигнал в другой сервис.
Можно даже в реальном времени использовать модели машинного обучения,
например, рассчитать вероятность похождения на следующий этап воронки или попадания в CHURN.handler, событие передается сразу всем слушателям listener.
Они выполняют операции записи в базу данных, стриминга данных в другие системы,
пассивного подсчета статистики и тп.
К ним относятся входящие в базовый комплект сервисы ClickHouse Writer и Send Mixpanel, по названию которых легко понять, за что они отвечают.
Кстати, они получают все-все входящие данные и сохраняют/отправляют их, так что нет необходимости об этом заботиться.handler (если вернул), и параметры входящих данных,
на основе которых выбирает как именно нужно ответить: вернуть данные в JSON формате или вернуть 1x1 gif пиксель,
или произвести HTTP Redirect на другой адрес. Это нужно, например, для обработки логики Cookie-Sync,
где пиксель должен сделать редирект на сторонний пиксель, тот допишет свой User-ID и вернет обратно,
при это нужно уже просто показать пиксель и сохранить данные сопоставления.Все входящие запросы попадают в микросервис Front, а он передает дальше,
а куда именно, он понимает на основе ключа, по которому эти данные пришли.
Ключ имеет формат aa.bb.cc.dd, где:
genericПример: in.gen.track.page
Для входящих данных ключ не указывается, при получении данных, его самостоятельно строит сервис Front.
Делает он это на основе сегментов адреса, куда пришел запрос. Первый сегмент - это сервис, второй - это название действия.
Формат такой: https://yourdomain/{service}/{name}, пример:
https://поддомен.вашдомен/appmetrika/install -> `in.gen.appmetrika.install`
Это сделано, ведь в большинстве случает нет возможности повлиять на формат передаваемых данных, а вот указать адрес, куда они передаются почти всегда возможно.
Если данные передаются самостоятельно, удобнее передавать сервис и название действия вместе со всем остальным.
В этом случае будут использованы параметры service и name. Например, запросу:
{
"service": "track",
"name": "page",
"data": {},
"projectId": 1627632140,
"uid": "6410748886712844288",
"user": {
"gaId": "2039255293.1537236640",
"ymId": "1537242940246737376",
"ts": 1537243840171,
//....
будет присвоен ключ in.gen.track.page
enrichershandlerslisteners