%%{init: {
'theme': 'base',
'themeVariables': {
'actorBkg': '#EBF8FF',
'actorBorder': '#A3BFFA',
'actorTextColor': '#000000',
'rectBkg': '#FAF7F0',
'rectBorder': '#E3DDCF',
'noteBkgColor': '#E6F4EA',
'noteBorderColor': '#34D399',
'noteTextColor': '#064E3B',
'signalColor': '#2D3748',
'signalLineColor': '#4A5568'
}
}}%%
sequenceDiagram
autonumber
actor Client as Мобильный Клиент (Flutter)
participant Gateway as HTTPS/WS Handler (go-pm-backend)
participant Auth as go-auth-service (gRPC)
participant MinIO as MinIO S3 (BPMN Repo)
participant Wkr as python-pm4py-worker (gRPC)
participant Alert as Slack / Jira Webhook
Client->>Gateway: GET /api/v1/process-graph?scenario=X [Authorization: Bearer]
activate Gateway
note over Gateway: Шаг 2: Валидация сессии и извлечение user_role
Gateway->>Auth: gRPC Verify(token)
activate Auth
Auth-->>Gateway: UserValid (UserID, Role, Status=ACTIVE)
deactivate Auth
note over Gateway: Шаг 3: Проверка локального LRU-кэша BPMN XML
Gateway->>MinIO: S3 GetObject(bpmn-repository/{scenario_id}.bpmn)
activate MinIO
MinIO-->>Gateway: BPMN XML Content string
deactivate MinIO
note over Gateway: Шаг 4: Формирование ConformanceRequest с noise_threshold=0.2
Gateway->>Wkr: gRPC AnalyzeConformance(scenario_id, bpmn_xml, noise)
activate Wkr
note over Wkr: Выполнение SQL в ClickHouse и Alignment-расчет PM4Py
Wkr-->>Gateway: ConformanceResponse (SummaryStats + CaseDiagnostics)
deactivate Wkr
note over Gateway: Шаг 8: Сериализация и отдача легкого JSON клиенту
Gateway-->>Client: HTTPS 200 OK + JSON payload
deactivate Gateway
note over Gateway: Шаг 9: Асинхронный роутинг классификаций
opt CRITICAL_BACKEND_BUG detected
Gateway->>Alert: HTTP POST Webhook -> Slack #incident-alerts
end
opt UNDOCUMENTED_API_FEATURE detected
Gateway->>Alert: HTTP POST Webhook -> Jira Create Ticket
end
Microservice: Сервис Оркестрации для аналитики Process Mining
pm-analytics
WarningОграничение публичной документации
В открытом доступе представлена демонстрационная версия метода. В настоящей публичной документации отображены не все шаги, технические сценарии и приватные эндпоинты для системы цифровых симуляторов бизнес-процессов.
- Полная спецификация метода: Будет доступна только во внутреннем контуре разработки (Confluence / Swagger Enterprise).
1 Общее назначение и архитектурная роль сервиса
Микросервис go-pm-backend выступает единым шлюзом аналитического контура (API Gateway & Orchestrator). Он управляет внешними HTTP/WebSocket-соединениями с Flutter-клиентами, верифицирует сессии через go-auth-service, извлекает эталонные .bpmn схемы из MinIO (S3) и маршрутизирует расчеты в изолированный воркер python-pm4py-worker по gRPC. Оркестратор реализует разделение ответственностей:
- Авторизация и Сессии: проверка JWT/Bearer через межсервисный вызов.
- Артефакты регламентов: кэширование и скачивание .bpmn файлов по scenario_id.
- Агрегация и Маршрутизация: трансляция тяжелых расчетов из Python-воркера в легкий клиентский JSON.
- Автоматический алертинг: при получении классификации CRITICAL_BACKEND_BUG отправляет нотификацию в Slack/Telegram-инженерный чат; при UNDOCUMENTED_API_FEATURE инициирует создание задачи для бизнес-аналитиков.
2 Основные бизнес-функции
- HandleProcessGraphRequest (HTTP/REST & WebSocket): прием запроса от мобильного клиента (scenario_id, фильтры по времени/роли).
- VerifyOperatorSession : синхронный gRPC/HTTP-запрос к go-auth-service для валидации токена и прав доступа (user_role).
- FetchBpmnSchemaFromMinIO : получение XML-содержимого диаграммы процесса из бакета S3 (bpmn-repository).
- DispatchToAnalyticsWorker: вызов gRPC-метода AnalyzeConformance к python-pm4py-worker с передачей XML-контента и порогов шума.
- EnrichAndRouteAnomalies: обработка поля classification из ответа воркера (генерация алертов или тикетов в Jira/Confluence API).
3 Структура базы данных и хранилищ (Реестр СУБД/S3)
| Компонент / СУБД | Логическая роль в сервисе | Схема / Бакет | Режим доступа из Go |
|---|---|---|---|
| MinIO (S3) | Репозиторий эталонных регламентов | s3://bpmn-repository/{scenario_id}.bpmn | Чтение по S3 SDK (GetObject) с локальным TTL-кэшем (5 минут) |
| go-auth-service | Сервис аутентификации и ролей | gRPC :9000 / /auth.v1.AuthService/Verify | Синхронный gRPC-клиент (таймаут 500мс) |
| python-pm4py-worker | Аналитический вычислитель | gRPC :9090 / analytics.ProcessMiningService | Синхронный gRPC-клиент (таймаут 10сек) |
| ClickHouse (logs) | Прямо из Go не читается | logs.process_events | Строго изолировано: доступ имеет только python-pm4py-worker |
4 Сквозной gRPC Контракт (analytics.proto)
syntax = "proto3";
package analytics;
option go_package = "./pb";
service ProcessMiningService {
// Выполняет мгновенный анализ соответствия реального лога эталону BPMN
rpc AnalyzeConformance (ConformanceRequest) returns (ConformanceResponse);
}
message ConformanceRequest {
string scenario_id = 1; // Например: "fridge_cooking_flow"
string user_role = 2; // User, Bot_Simulator
string bpmn_xml_content = 3; // Содержимое .bpmn файла, скачанное Go из MinIO
float noise_threshold = 4; // Калибровочный порог шума (по умолчанию 0.2)
}
message ConformanceResponse {
SummaryStats summary = 1;
repeated CaseDiagnostic detailed_cases = 2;
}
message SummaryStats {
double global_fitness_score = 1; // Индекс прилегания от 0.0 до 1.0
int32 total_cases_analyzed = 2;
string health_status = 3; // HEALTHY, ATTENTION_REQUIRED
}
message TokenMetrics {
int32 consumed = 1; // Потреблено позициями (c)
int32 produced = 2; // Сгенерировано (p)
int32 missing = 3; // Пропущено / Ошибка порядка (m)
int32 remaining = 4; // Застряло в тупиках (r)
}
message AnomalyDetail {
string type = 1; // MISSING_TOKEN_STATE_MACHINE, HIDDEN_API_ROUTE
string severity = 2; // CRITICAL, HIGH, LOW_WARNING
string message = 3; // Человекочитаемое описание для мобилки или Slack
}
message CaseDiagnostic {
string case_id = 1; // ID сессии трансформации сущностей
double fitness_score = 2; // Локальный Fitness Score трека
bool is_compliant = 3; // Идеально соответствует?
TokenMetrics metrics = 4; // Метрики c, p, m, r
string classification = 5; // CRITICAL_BACKEND_BUG, UNDOCUMENTED_API_FEATURE
repeated AnomalyDetail anomalies = 6;
}5 Пример клиентского JSON-ответа (Mobile API Payload)
{
"summary": {
"global_fitness_score": 0.845,
"total_cases_analyzed": 1250,
"status": "ATTENTION_REQUIRED"
},
"detailed_cases": [
{
"case_id": "cooking_session_xyz777",
"fitness_score": 0.5,
"is_compliant": false,
"metrics": { "consumed": 4, "produced": 4, "missing": 2, "remaining": 2 },
"classification": "CRITICAL_BACKEND_BUG",
"anomalies": [
{
"type": "MISSING_TOKEN_STATE_MACHINE",
"severity": "CRITICAL",
"message": "Критический баг Go Core: сырье списано на шаге 'Готовка', но транзакция создания нового блюда не зафиксирована."
}
]
},
{
"case_id": "fast_consume_session_888",
"fitness_score": 0.75,
"is_compliant": false,
"metrics": { "consumed": 3, "produced": 4, "missing": 0, "remaining": 1 },
"classification": "UNDOCUMENTED_API_FEATURE",
"anomalies": [
{
"type": "HIDDEN_API_ROUTE",
"severity": "LOW_WARNING",
"message": "Обнаружена скрытая фича API: Вызван метод быстрого списания в обход экрана инвентаря во Flutter. Требуется обновить BPMN."
}
]
}
]
}6 Диаграмма последовательности (Sequence Diagram)
7 Таблица расшифровки шагов сценария
| Шаг | Источник | Получатель | Протокол / Метод | Полезная нагрузка (Payload) | Обработка сбоев (Fallback) |
|---|---|---|---|---|---|
| 1 | Мобильный Flutter | go-pm-backend | HTTPS GET /api/v1/process-graph?scenario=X | Header: Authorization: Bearer |
Возврат 401 Unauthorized или 400 Bad Request |
| 2 | go-pm-backend | go-auth-service | gRPC AuthService.Verify | { token: “…” } | При таймауте (>500ms) или сбое — 503 Service Unavailable |
| 3 | go-pm-backend | MinIO (S3) | S3 GetObject | Bucket: bpmn-repository, Key: {scenario_id}.bpmn | Использование локального in-memory кэша / fallback-шаблона |
| 4 | go-pm-backend | python-pm4py-worker | gRPC ProcessMiningService.AnalyzeConformance | ConformanceRequest (scenario_id, bpmn_xml_content, noise_threshold) | Circuit Breaker: при DEADLINE_EXCEEDED (>10s) возврат кэшированного графа |
| 5 | python-pm4py-worker | ClickHouse | TCP/HTTP SQL Query | Чтение logs.process_events по case_id / timestamp | Возврат пустого среза за период |
| 6-7 | python-pm4py-worker | go-pm-backend | gRPC Response ConformanceResponse | (SummaryStats, repeated CaseDiagnostic) | Логирование ошибки парсинга XML/Petri-сети |
| 8 | go-pm-backend | Мобильный Flutter | HTTPS 200 OK | JSON Listing 2 | Отправка частичного отчета с флагом degraded_mode: true |
| 9 | go-pm-backend | Slack / Jira API | HTTP POST Webhook | Асинхронная отправка инцидента по classification | Подавление дубликатов алертов через Redis-окно (1 час) |
8 Справочник ошибок шлюза (go-pm-backend)
| HTTP / gRPC Статус | Каноничный код (canonical_code) | Уровень | Сообщение для клиента (message) | Действие бэкенда |
|---|---|---|---|---|
| 401 / UNAUTHENTICATED | GATEWAY_AUTH_INVALID | WARN | Недействительный или просроченный токен авторизации. | Сброс сессии на клиенте |
| 404 / NOT_FOUND | BPMN_SCENARIO_MISSING | ERROR | Сценарий процесса не найден в репозитории регламентов. | Лог system_error_logs, алертинг аналитикам |
| 504 / DEADLINE_EXCEEDED | PM4PY_WORKER_TIMEOUT | ERROR | Аналитический движок перегружен, попробуйте позже. | Возврат фоллбек-статистики, метрика pm4py_timeout_total |
| 502 / INTERNAL | BPMN_XML_PARSE_ERROR | ERROR | Ошибка структуры эталонной BPMN-диаграммы. | Создание задачи в Jira для исправления XML в MinIO |