Архитектура платформы

Платформа имеет микросервисную архитектуру, состоящую из stateless-компонентов.

Компоненты платформы и часть смежных сервисов (ElasticSearch, Redis, PostgreSQL) поставляются в виде docker-контейнеров. Общая архитектура:

Описание компонент платформы

Core

Основная библиотека, отвечающая за взаимодействие всех компонент платформы.

Apache Kafka

Является основной шиной данных. Через неё происходит обмен сообщениями между компонентами.

Data Storage (DS)

Хранилище данных - под разные потребности может быть разным, нет четкой привязки. Это может быть, например, MongoDB, HBase. Также в качестве хранилища данных могут быть использованы классические реляционные БД, например, Postgres, Oracle, MySQL, и другие.

PostgreSQL

Хранилище метаданных, необходимых для функционирования Directual Apps: информация о приложениях, пользователях, сценариях, структурах данных, настроек приложений и др.

Directual UI & API

Компоненты отвечают за следующие процессы:

  • Взаимодействие пользователей с платформой через веб-интерфейс.

  • REST API / SOAP для взаимодействия с платформой: точка входа для создания и редактирования объектов (CRUD) - когда в интерфейсе что-то создаётся или сохраняется (сценарий, структура, и т.д.), происходит обращение к web-ui.

  • При создании новых объектов в Kafka отправляется событие с типом new.

  • REST API для сторонних веб-приложений (принимает запросы, например, search, fromIndex и другие).

  • Security Layer - механизм для построения REST API end-points для Directual Apps (приложения на Directual)

  • Обрабатывает вызов сценариев по sysname для синхронного выполнения сценариев.

Взаимодействие с DS: Выполняет все операции CRUD и методы search и fromIndex.

Custom Integrations

В данный момент платформа поддерживает следующие виды интеграций с внешними системами:

  • JDBC listener (Mysql, Oracle, PostgreSQL),

  • REST,

  • SOAP,

  • LDAP,

  • SMTP,

  • GoogleSheet, OpenOffice,

  • Unisender,

  • Twilio,

  • Mandrill.

Для реализации новых интеграций достаточно реализация интерфейса посредством Directual SDK.

Distributor

Взаимодействие с Kafka: Обрабатывает сообщение из очереди new Kafka. Из одного сообщения из очереди distributor может сформировать несколько сообщений в очередь process (в случае, если сообщение вызовет несколько сценариев).

Взаимодействие с DS: Distributor читает данные из DS (например, при проверке условия, что поле было изменено).

Delay Processor

Отвечает за обработку отложенных событий, порождаемых в том числе при невозможности установки лока. Пока события в очереди, они хранятся в отдельной очереди в Kafka.

Связь с Kafka: Задача - читать сообщения из Kafka и класть обратно, перекладывая из одной очереди в другую. Когда решаем, что сообщение должно быть отложено до определённого момента (например, при использовании кубика Delay), мы указываем в нём, насколько оно должно быть отложено (actual date). Когда время подошло, delay отправляет сообщение обратно в Kafka в топик process - те сообщения, которые надо обработать. И затем processor это сообщение обрабатывает.

Не взаимодействует с DS

Schedule Operations

Компонент отвечает за периодический запуск сценариев и заполнение индекса Elastic в случае его использования (Если есть HBase Datasource).

Взаимодействие с DS: Запуск сценариев по Cron: В крон-задачах описаны мета-данные о сценариях с расписанием запусков. Operations запрашивает у DS все сценарии, запускающиеся по крону. Для каждого полученного сценария проверяет, когда последний раз запускался крон для этого сценария и решает, нужно ли по этому крон-выражению сейчас запускать этот сценарий. Если да, то берёт из DS все объекты структуры, на которую ссылается данный сценарий и отправляет в Kafka сообщения, чтобы этот сценарий их обработал.

Взаимодействие с ElasticSearch (при наличии HBase и использовании индексов): Заполнение индекса Elastic: Делает в Postgres запрос за всеми индексируемыми структурами и получает их. У каждой структуры есть два параметра - timestamp последней индексации и имя индекса. Запрашивает изменения за время от последнего изменения до текущего. Если находятся поля, которые менялись или если это первая индексация, то operators формирует запрос на обогащение данных в Elastic (INSERT), где сообщает, что определенный объект с указанным id имеет определенные значения индексируемых полей. Индекс ставится только на те поля, к которым нужен быстрый доступ. В API есть отдельный endpoint метод fromIndex - с его помощью данные забираются из эластика, а не из Hbase.

Масштабируемость системы

Архитектура платформы - микросервисная, поэтому при необходимости масштабирование каждого из компонент линейное. Встроенный service discovery также обеспечивает функционирование при потери-отключении какого либо из сервисов.

Список компетенций для разработки и администрирования

Администрирование: опыт работы со следующим стеком k8s, ansible, docker, mongo, postgres, grafana.

Разработчик: Достаточно умения логически мыслить. Специализированные знания необязательны, но знание JS на начальном уровне является большим преимуществом