К содержанию
Лист 01 · Платформа

Платформа A-POST-OL

Сервер на C++ и платформа бизнес-логики в PostgreSQL. Вход и права, API, бизнес-процессы, события, интеграции, файлы, сообщения, отчёты и фоновые задания работают из коробки – проект описывает только свою предметную область.

От одного сервера до кластера. Готова к Kubernetes.

2017с этого года платформа работает в реальных проектахистория проектов
20+модулей платформенного слояспецификация, ч. 0, п. 7.2
400+маршрутов REST API из коробкиспецификация, ч. II, прил. А
507K RPSна простых HTTP-запросах – 90% скорости nginxоткрытый бенчмарк
112K RPSкогда каждый запрос обращается к базе данныхоткрытый бенчмарк
Лист 02 · Общая схема

Сервер на C++, вся логика в PostgreSQL

Запрос входит через сервер и одним вызовом попадает в базу, где живут данные, права и бизнес-логика. В обратную сторону база сама поручает работу фоновым службам: исходящие запросы, письма, файлы, отчёты.

Клиенты
браузермобильное приложениепартнёры и интеграцииустройства и станции
HTTPS · WebSocket
nginxTLS · домены · ограничение частоты
HTTP · WebSocket
Уровень 1A-POST-OLC++20 · libapostol · один цикл событий epoll на процесс
Принимают запросы · рабочие процессы × N
REST APIAppServer
Вход, OAuth 2.0, токеныAuthServer
WebSocket: вызовы и подпискиWebSocketAPI
Вебхуки прямо в SQLPGHTTP
Файлы по правам объектаFileServer
Шлюз API v2GatewayAPI
Модули на любом языкеза шлюзом · go-platform
Работают в фоне · одна ведущая копия
Исходящие HTTP-запросыPGFetch
Файлы и S3PGFile
Почта, push, SMSMessageServer
Задания по расписаниюTaskScheduler
ОтчётыReportServer
наружу: платёжные системы, почта, S3, API партнёров
daemon.* · один вызов на запросNOTIFY · база поручает работу
Уровень 2db-platformPostgreSQL · PL/pgSQL · 29 модулей
Вход в базу

Единственная дверь: сессия, контекст, маршрут

daemon · api · session · current · gateway
Доступ

Пользователи, группы, сессии, OAuth 2.0, права

admin · oauth2
Объекты

Классы, жизненный цикл, файлы, адреса, языки

entity · workflow · file · kladr · locale
События

Подписки, след каждого действия, уведомления, коды

observer · notification · notice · comment · verification
Доставка

Очереди задач, внешние вызовы, обмен между узлами

notify · http · mq · replication
Отчёты

Дерево отчётов, формы, построение

report · reports
Основа

Ядро, настройки, журнал, каталог ошибок, ресурсы

kernel · registry · log · error · exception · resource
Уровень 3Ваш проект

В той же базе: классы, состояния, методы, маршруты, события и права вашей предметной области. Проект расширяет платформу и не меняет её.

конфигурация в SQLсвои службы на C++свои модули на Go
Рис. 1. Сплошная линия – путь запроса, пунктир – работа, которую поручает база.
Лист 03 · Масштаб

От одного сервера до Kubernetes

Сессии, очереди и маршруты живут в PostgreSQL, поэтому экземпляры сервера взаимозаменяемы. Те же образы работают на одной машине, на нескольких серверах и в Kubernetes – код проекта при этом не меняется.

  1. IОдин серверСервер, база и всё остальное – в контейнерах на одной машине.
  2. IIВсе ядраРабочих процессов столько, сколько ядер; фоновые службы – по одной.
  3. IIIБаза в кластереPostgreSQL на отдельных серверах, с автоматическим переключением.
  4. IVНесколько серверовЭкземпляры на разных машинах за балансировщиком, база одна на всех.
  5. VKubernetesЭкземпляры в подах; оркестратор поднимает и обновляет их по одному.
Что делает это возможным
Одна ведущая копия

Фоновая служба работает в одном экземпляре, остальные ждут в резерве и забирают роль сами, если ведущая пропала. Ведущую выбирает PostgreSQL – внешний координатор не нужен.

libapostol · leader lock
Задача – ровно одному исполнителю

Исходящий запрос, письмо, отчёт или задание достаётся одной живой копии и закрывается её подтверждением. Опоздавшее подтверждение отклоняется вместе с результатом.

db-platform · notify
Любой экземпляр – полноценный шлюз

Модули API v2 подключаются к любому экземпляру; таблица маршрутов общая и хранится в базе.

GatewayAPI
Остановка без потерь

Процесс дорабатывает начатое и только потом выходит, а упавший перезапускается сам. Экземпляры обновляются по одному – система не останавливается.

libapostol · модель процессов
Лист 04 · Из коробки

Всё серверное уже есть

Двенадцать подсистем, общих для всех проектов на платформе. Проект получает их в первый день и не пишет заново.

Вход и сессии

OAuth 2.0 и JWT, вход по паролю, по коду и через внешних провайдеров. Сессии хранятся в базе и закрываются на сервере.

Права в трёх измерениях

На класс, на метод и на объект. Разрешения и запреты для пользователей и групп, видимость по подразделениям.

Объектная модель

Документы и справочники в дереве классов: владелец, история состояний, связи, файлы, адреса, тексты на нескольких языках.

Поведение как данные

Состояния, переходы, события, маршруты и настройки – строки в таблицах. Меняются на работающей системе, без пересборки.

REST API

400+ маршрутов из коробки, маршрут проекта добавляется строкой. Один запрос – одна транзакция, пакетный тоже. Рядом API v2 для модулей на любом языке.

Реальное время

Вызовы и подписки по WebSocket. Подписчик получает только то, что прошло его фильтр и его права.

Интеграции

Вебхуки принимаются прямо в SQL. Исходящие HTTP-вызовы база ставит в очередь, служба выполняет их в фоне, с подстраховкой опросом.

Сообщения

Почта, push и SMS; уведомления пользователям и коды подтверждения почты и телефона.

Файлы

Файлы объектов с доступом по правам самого объекта; хранение на диске или в S3.

Отчёты

Дерево отчётов, формы параметров, построение в фоне и готовый документ.

Фоновые задания

Расписания и задания на SQL с историей запусков.

Журнал и аудит

Журнал событий, журнал API и след каждого выполненного метода. Ошибки – из каталога: код и текст на языке пользователя.

Лист 05 · Путь запроса

Одно действие – одна транзакция

Любой запрос проходит один и тот же путь. Объект, его состояние, история, журнал и деньги меняются вместе – или не меняются вовсе.

  1. 01nginxTLS, домен, ограничение частоты
  2. 02СерверПроверяет подпись токена и делает один вызов в базу
  3. Одна транзакция
    1. 03СессияКто, от чьего имени, в каком подразделении, на каком языке, какой операционный день
    2. 04МаршрутПуть находится в таблице маршрутов
    3. 05ПраваТолько объекты, которые вызывающему можно видеть и менять
    4. 06ДействиеНовое состояние, события по дереву классов, журнал, уведомления подписчикам
  4. 07ОтветJSON. Отказ – тоже ответ: код и текст на языке пользователя
Обратный путь – работу начинает база
  1. 01ФиксацияТранзакция записала задачу; после фиксации база будит службу
  2. 02СлужбаЗадачу берёт ровно один исполнитель
  3. 03Внешний мирПлатёжная система, почта, S3, API партнёра
  4. 04РезультатОтвет возвращается в базу вызовом и меняет состояние объекта
Лист 06 · Поведение как данные

Процессы описываются, а не программируются

Классы, состояния, методы, переходы, события и права – строки в таблицах платформы. Бизнес-процесс меняется на работающей системе, без пересборки и остановки.

СозданcreatedОткрытenabledЗакрытdisabledУдалёнdeletedоткрытьзакрытьоткрытьзакрытьудалитьвосстановитьСозданcreatedОткрытenabledЗакрытdisabledУдалёнdeletedоткрытьзакрытьоткрытьзакрытьудалитьудалитьвосстановить
Рис. 2. Автомат по умолчанию: четыре типа состояний, удалить можно из любого. Проект добавляет свои – например, «Ожидает оплаты» или «Заряжается» – и свои действия, тоже строками.
Права в трёх измерениях
01КлассСоздавать, видеть, менять и удалять объекты этого вида
02МетодВыполнять действие в данном состоянии и видеть его в интерфейсе
03ОбъектВидеть, менять и удалять конкретный объект

Разрешения и запреты задаются пользователям и группам. Видимость дополнительно ограничивают подразделение и область, в которой работает сессия.

Лист 07 · Проекты

На платформе работают

Апостол CSMSЗарядка электромобилей
Ship Safety ERPСудоходство
CopyFrogИИ
DEBT-MasterЖКХ
Apostol ARBФинтех
Campus CORSГеодезия
Talking To AIИИ
Apostol CRMОткрытый шаблон

Обсудить ваш проект

Расскажите о задаче – отвечу в течение дня. Бесплатный созвон 30 минут и письменный ориентир по срокам и бюджету.