Files
Zimin A.N. 5b96f98fb8 docs(integration): регламент НСИ + текст рассылки для интеграторов
* dictionary-criteria.md — decision framework "что заводить в НСИ":
  - 5 положительных критериев (shared, slow change, validity windows,
    audit-trail, structured schema) с min-3-из-5 threshold
  - 6 anti-patterns (transactional, high-freq mutations, derived data,
    PII без ACL, BLOBs, single-consumer данные)
  - 10-пунктный чек-лист (≥7 yes → заводи, < — обсуди)
  - Процесс создания (simple + approval-required + миграция)
  - Schema conventions (businessKey, x-localized, x-references etc)
  - Anti-patterns с примерами из практики

* email-announcement.md — текст рассылки команде:
  - URLs (prod/staging/Swagger/docs)
  - Что внутри Ordinis (37 dicts, REST API, локализация, audit, workflow)
  - С чего начать (Quick Start, Cheat Sheet, Postman, presentation)
  - 60-second smoke командой
  - Roadmap Q3
  - Plain-text вариант для систем без markdown

Both files готовы к публикации: regulation идёт в integrator docs (link
из email), letter — в Mattermost / email-рассылку.
2026-05-20 17:10:03 +03:00

11 KiB
Raw Permalink Blame History

Регламент · Что заводить в Ordinis НСИ

Decision framework для владельцев данных: какие справочники стоит выносить в централизованную НСИ Ordinis MDM, а какие держать локально в своём сервисе.

TL;DR: НСИ — для shared reference data со slow change rate. Если данные нужны только одному сервису, меняются 100 раз в секунду или это транзакции — это не НСИ.


Что стоит заводить в НСИ

Справочник — кандидат, если он удовлетворяет минимум 3 из 5 критериев ниже:

1. Shared между ≥ 2 потребителями

Данные читают/используют как минимум два разных сервиса (или будут в обозримом roadmap).

Примеры: Космические аппараты (читают планировщик миссий + геопортал + биллинг), наземные станции (планировщик + телеметрия + Альтум), классы разрешения (геопортал + ML pipeline).

💡 Если данные нужны только одному сервису — храни локально. Не плоди интеграционные точки на пустом месте.

2. Slow change rate (часы → недели, а не секунды)

Изменяется редко — раз в неделю / месяц / квартал. Не транзакционные данные.

Изменения Это НСИ?
Раз в год — справочник стран да
Раз в квартал — справочник миссий ДЗЗ да
Раз в неделю — справочник антенн (новые станции) да
Раз в час — текущая температура спутника нет (телеметрия)
100×/сек — статус заявки на съёмку нет (state machine)

3. Нужна validity-window (validFrom / validTo)

Данные актуальны на определённый период. Закрытие/замена записи через bitemporal versioning, не через DELETE.

Примеры: Тарифы (действуют с 01.01.2026), орбитальные параметры (TLE на конкретную epoch), составы flight crew (период).

Если данные «текущее состояние и забыли» — может быть просто config или KV store.

4. Требуется audit-trail (compliance / governance)

Нужно знать кто, когда, почему изменил запись — для compliance, forensics, отката.

Все справочники в Ordinis по умолчанию имеют Hibernate Envers audit log с full history.

Примеры: Регуляторные классификации, security clearances, тарифные планы (для финансового audit'а).

5. Есть схема (structured, validated)

Данные имеют стабильную JSON-Schema с required-полями и валидацией. Не «свободный мешок ключей».

Если структура каждую неделю меняется и нет SLA на стабильность — может быть это ещё не НСИ, а Notion-like wiki.


Что не стоит заводить в НСИ

A. Транзакционные данные

Заявки, заказы, события, измерения, журналы. Это transactional store (PostgreSQL/Kafka topic application'а), не НСИ.

Признак: растёт линейно со временем работы системы.

B. Высокочастотные мутации

100 updates/sec — не лезет в audit, забивает Kafka outbox. Для счётчиков и telemetry — Redis / time-series DB / Prometheus.

C. Производные / вычисляемые данные

Если значение вычисляется из других данных — храни источник, не результат. Кэш производных — в Redis с invalidation.

Антипример: «активные миссии за месяц» — это query, не справочник.

D. PII / sensitive без access control

Персональные данные физлиц, payment data, security secrets. Ordinis сейчас поддерживает scope (PUBLIC / INTERNAL / RESTRICTED), но per-record ACL пока в roadmap (Q4 2026).

Для PII — выделенный сервис с шифрованием и compliance audit, не общий НСИ.

E. Большие BLOB'ы

Изображения, PDF, сырые телеметрические дампы. → MinIO/S3 + ссылка в справочнике, но не контент в data.

F. Данные, нужные только одному сервису

Если справочник никогда не покинет границу сервиса X — это его внутренний config. Не выноси наружу.

Boundary test: «может ли потребитель Y разумно захотеть читать это?» Нет → не НСИ.


📋 Чек-лист перед созданием справочника

[ ] 1. Минимум один реальный потребитель кроме создателя? (named system)
[ ] 2. Согласованная schema (фиксированный набор полей)?
[ ] 3. Change rate < 10/мин в среднем?
[ ] 4. Validity windows имеют смысл (или достаточно "current state")?
[ ] 5. Audit-trail нужен для compliance / forensics?
[ ] 6. Owner назначен? Reviewer pool назначен (для approval-required dicts)?
[ ] 7. Bundle подобран? (cuod / geo / comms / delivery — см. existing)
[ ] 8. Локализация — нужна? Какие locale supported?
[ ] 9. Scope: PUBLIC / INTERNAL / RESTRICTED?
[ ] 10. Onboarding plan — кто и когда мигрирует существующие consumers?

Если ≥ 7 yes — заводи. Если меньше — обсудите с Ordinis team, возможно паттерн не НСИ.


Процесс создания справочника

Простой случай (PUBLIC scope, owner = создающий)

  1. Owner открывает /dictionaries admin UI → Создать
  2. Заполняет name, displayName, schema (через UI builder или импорт JSON)
  3. Тестит в staging (ordinis.k8s.265.nstart.cloud)
  4. После validation — publish; данные иммутабельно зашиваются в Kafka outbox
  5. Сообщение в #ordinis Slack — потребители подхватывают через /dictionaries listing

Approval-required (для критичных)

  1. Owner создаёт schema draft (не публикует сразу)
  2. Reviewer pool получает email уведомление
  3. Reviewer открывает /reviews → diff → approve/reject
  4. После approval — auto-publish через workflow

Onboarding существующих данных (миграция)

  1. Owner экспортирует существующий справочник из source-системы в CSV/JSON
  2. Создаёт schema в Ordinis (UI builder)
  3. Bulk import API (Q4 2026) или manual seed через bundle YAML
  4. Запускает параллельное чтение — потребители читают и из source, и из Ordinis, сверяют diff
  5. После недели зелёного diff — переключают consumers на Ordinis exclusive
  6. Декомиссия source: справочник удаляется в source, остаётся в Ordinis

Conventions для schema

Чтобы интеграторам было проще читать твой справочник:

  • businessKey должен быть human-readable стабильный идентификатор. Не UUID — GS_MOSCOW_A1 лучше чем b284f74e-60c8-….
  • Required fields — минимум что нужно для валидности. Не объявляй required то, что может быть пустым в legacy data.
  • x-localized: true на текстовых полях, которые должны переводиться (name, displayName, description).
  • x-references: target_dict.field для FK — Ordinis валидирует и строит граф.
  • x-section — группировка полей в UI editor'е (Основное, Геометрия, Метаданные).
  • enum для closed lists вместо свободной строки (тип КА, статус миссии).
  • format: date-time для timestamps (Ordinis парсит как ISO-8601).

Anti-patterns (видели на практике)

Справочник = state machine состояний заявки: application_status: NEW/APPROVED/REJECTED. Это enum в схеме заявки, а не отдельный справочник.

Справочник под per-user preferences: предпочтения юзера X — это его profile в auth-сервисе.

Справочник вместо feature flag: если читается на каждом запросе для decisions — config service (Spring Cloud Config + LaunchDarkly-like).

«Логирование» через справочник: лог событий — Kafka topic + Loki, не НСИ.

Справочник, чтобы передать данные между двумя своими микросервисами: используй внутреннюю DB / message broker, не НСИ.


Когда сомневаешься — спроси

Лучше 30 минут на консультацию, чем месяц на отрыв справочника обратно в local store.

— Ordinis team · v1.0 · 2026-05