Контракт: sales/orders¶
Метаданные
- Namespace: sales
- Name: orders
- Version: 2.1.0
- Owner: sales-integration
- Email: sales-data@company.ru
- Slack: #sales-data-alerts
Описание¶
Заказы клиентов из системы 1C Бухгалтерия. Содержит информацию о всех заказах клиентов, включая сумму, статус, товары и дату создания.
Используется для: - Аналитики продаж - Расчёта выручки - BI дашбордов - ML моделей прогнозирования
Kafka Topics¶
| Topic | Описание | Retention |
|---|---|---|
sales.orders.raw | Сырые данные из 1C | 7 дней |
sales.orders_prod | Провалидированные данные | 30 дней |
sales.orders_dlq | Проблемные записи | 90 дней |
Schema (Avro)¶
schema.avsc
{
"type": "record",
"name": "Order",
"namespace": "sales.orders",
"doc": "Заказ клиента из 1C",
"fields": [
{
"name": "order_id",
"type": "string",
"doc": "Уникальный ID заказа (формат: ord_XXXXXXXXXXXX)"
},
{
"name": "customer_id",
"type": "string",
"doc": "ID клиента"
},
{
"name": "total_amount",
"type": "double",
"doc": "Общая сумма заказа (RUB)"
},
{
"name": "status",
"type": {
"type": "enum",
"name": "OrderStatus",
"symbols": [
"draft",
"pending",
"confirmed",
"paid",
"shipped",
"delivered",
"cancelled",
"refunded"
]
},
"doc": "Статус заказа"
},
{
"name": "items",
"type": {
"type": "array",
"items": {
"type": "record",
"name": "OrderItem",
"fields": [
{"name": "sku", "type": "string"},
{"name": "quantity", "type": "int"},
{"name": "price", "type": "double"}
]
}
},
"doc": "Товары в заказе"
},
{
"name": "created_at",
"type": {"type": "long", "logicalType": "timestamp-millis"},
"doc": "Дата создания заказа"
}
]
}
Quality Rules¶
Critical (error)¶
- ✅
order_idне null - ✅
order_idсоответствует паттерну^ord_[a-z0-9]{12}$ - ✅
customer_idне null - ✅
total_amountне null и >= 0 - ✅
statusне null и один из допустимых значений - ✅
itemsне пустой массив - ✅
created_atне старше 1 часа (freshness) - ✅
order_idуникальный в батче
Warnings¶
- ⚠️
customer_emailвалидный формат email - ⚠️
customer_phoneформат +7XXXXXXXXXX - ⚠️
currency= "RUB" (если другое, проверить курс)
SLA¶
Availability¶
- Target: 99.9%
- Schedule: 24/7
- Maintenance: Воскресенье 03:00-04:00 MSK
Freshness¶
- Max age: 1 час
- Alert threshold: 2 часа
- Critical threshold: 4 часа
Response Time¶
| Priority | Response | Recovery |
|---|---|---|
| Critical | 15 мин | 2 часа |
| High | 1 час | 4 часа |
| Medium | 4 часа | - |
| Low | 1 день | - |
Retention¶
| Layer | Duration | Storage |
|---|---|---|
| Kafka raw | 7 дней | Kafka |
| Kafka prod | 30 дней | Kafka |
| Kafka DLQ | 90 дней | Kafka |
| DWH hot | 1 год | SSD |
| DWH warm | 3 года | HDD |
| DWH cold | 7 лет | S3 Glacier |
Physical Layout (Iceberg)¶
Partitioning¶
strategy: "iceberg_hidden"
spec:
- source_column: "created_at"
transform: "day" # Партиция по дню
- source_column: "customer_id"
transform: "bucket[32]" # 32 бакета по customer_id
Sort Order¶
Parquet Settings¶
- Compression: ZSTD level 3 (~4.5x)
- Row group size: 128 MB
- Dictionary encoding: status, currency
- Bloom filters: order_id, customer_id
Consumers¶
| System | Team | Usage | Criticality |
|---|---|---|---|
| Clickhouse DWH | analytics | Аналитика продаж | critical |
| Sales Dashboard | business-intelligence | Реалтайм дашборды | high |
| Revenue Forecast ML | data-science | ML модели | medium |
Runbook¶
DLQ переполняется¶
Симптомы: - Alert: "DLQ size > 1000 messages" - Lag в consumer group растёт
Действия: 1. Проверить DLQ: kafkacat -b kafka:9092 -t sales.orders_dlq 2. Связаться с sales-integration в #sales-data-alerts 3. Создать тикет в Jira (DATA-*) 4. После исправления переотправить данные
SLA: 2 часа
Данные не поступают¶
Симптомы: - Alert: "No messages in last 1 hour"
Действия: 1. Проверить статус 1C 2. Проверить connectivity к API Gateway 3. Проверить mTLS сертификат 4. Связаться с sales-integration
SLA: 1 час (critical)
История версий¶
v2.1.0 (2026-01-23)¶
- ➕ Добавлено поле
discount_amount(nullable) - ➕ Добавлено поле
customer_phone(nullable) - Breaking: Нет
v2.0.0 (2026-01-15)¶
- 🔄 Поле
statusтеперь enum вместо string - ➖ Удалено deprecated поле
old_customer_id - Breaking: Да
v1.0.0 (2025-12-01)¶
- 🎉 Первая версия контракта