Архитектура
Обработка входящих запросов
Коммуникация сервисов
Руководство пользователя
Получение данных из сервисов
Использование Панели управления
Использование инструментов из комплекта
Работа с Theia
Мониторинг Netdata
Работа с Jupyter
Работа с ClickHouse
Основные принципы
Модификация схемы
Подключение к VPN
Справочная информация
HTTP Redirect
Каналы получения данных
WebSocket
Загрузка больших файлов
JSON-RPC 2.0 RST
API сервисов
Director API
Front API
RockMe Framework (TypeScript)
Переменные окружения
Маппинг путей
Сетевая инфраструктура
Схема хранилища ClickHouse
Создание сервисов
Python + Band Framework
Организация сервиса
Коммуникация с другими сервисами
Работа с ClickHouse
Другие возможности
TypeScript + Rockme Framework
Организация сервиса
Туториалы
Получение данных из других сервисов
Сбор сырых данных Google Analytics
Создание динамического Calltracking
Построение истории отдельного пользователя
Классические модели атрибуции
Вероятностное прохождение воронки
Атрибуция по индексу активности
Воронки
Реализация Cookie-Sync
Сегментация пользователей
X
Выберите раздел

Жизненный цикл и адресация

Входящие запросы

В Rockstat построен на микросервисах (бошка не варит напишу потом) Рассмотрим пример:

  1. SDK или какой-либо внешний инструмент/сервис отправляют .
  2. Front service принимает все входящие запросы, проверяет их, добавляет метаданные, после чего они становятся событиями event.
  3. К событию будет добавлена информация о способе его получения и контексте. Также каждое событие имеет ключ маршрутизации, по которому сервисы определяют нужно его обрабатывать или нет. Пример in.gen.track.page - входящий запрос общего типа generic, который финально должен быть обработан сервисом track и название события для этого сервиса page (просмотр страницы). Самого сервиса с названием track не существует, в этом нет необходимости. Но по этой метке другие смогут определить что это за событие.
  4. Обогатитель события (которое было запросом) enricher. Front знает список сервисов (получает от Director service), которые хотят участвовать в обогащении событий с определённым ключом. Например, для ключа in.gen.track.page найдутся сервисы MaxMind ip2geo, Sypex ip2geo, UserAgent parser. Все они получат событие и на основе его содержимого сгенерируют свои дополнения. Они произведут определение географической точки на основе ip адреса, а также на основе User-Agent определят какие устройство, операционная система и браузер использовались. Результаты будут отправлены обратно в Front, где будут дописаны к данным события. /// Продолжение ниже ///
  1. Следующим этапом происходит передача события основному обработчику (handler). Эта роль отвечает за принятие действий на основе полученного события. На основе полученных данных handler может отправить обратно в браузер сигнал или данные, может написать кому-то через чат-бота или послать письмо, или попросту передать сигнал в другой сервис. Можно даже в реальном времени использовать модели машинного обучения, например, рассчитать вероятность похождения на следующий этап воронки или попадания в CHURN.
  2. Следом за handler, событие передается сразу всем слушателям listener. Они выполняют операции записи в базу данных, стриминга данных в другие системы, пассивного подсчета статистики и тп. К ним относятся входящие в базовый комплект сервисы ClickHouse Writer и Send Mixpanel, по названию которых легко понять, за что они отвечают. Кстати, они получают все-все входящие данные и сохраняют/отправляют их, так что нет необходимости об этом заботиться.
  3. Начинается фаза ответа. Front учитывает параметры возвращенные handler (если вернул), и параметры входящих данных, на основе которых выбирает как именно нужно ответить: вернуть данные в JSON формате или вернуть 1x1 gif пиксель, или произвести HTTP Redirect на другой адрес. Это нужно, например, для обработки логики Cookie-Sync, где пиксель должен сделать редирект на сторонний пиксель, тот допишет свой User-ID и вернет обратно, при это нужно уже просто показать пиксель и сохранить данные сопоставления.
  4. Изначальный инициатор запроса получил ответ, на этом цикл обработки завершается

Адресация

Все входящие запросы попадают в микросервис Front, а он передает дальше, а куда именно, он понимает на основе ключа, по которому эти данные пришли. Ключ имеет формат aa.bb.cc.dd, где:

  • aa: направление in/out, что означает входящие/исходящие
  • bb: типа запроса, сейчас почти везде используется тип generic
  • cc: название сервиса, обычно туда указывают название сервиса, который сгенерировал эти данные или название сервиса получателя этих данных
  • dd: название действия или операции, этого сервиса.

Пример: in.gen.track.page

Преобразование http путей в ключи

Для входящих данных ключ не указывается, при получении данных, его самостоятельно строит сервис 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

Ссылки по теме:

  1. TODO: Обогатители enrichers
  2. TODO: Обработчики handlers
  3. TODO: Слушатели listeners
  4. TODO: Коммуникация сервисов
  5. TODO: Сетевая инфраструктура