Сколько может жить событие в системе?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Сколько может жить событие в системе
Вопрос о жизненном цикле события (Event Lifecycle) часто игнорируется при проектировании, но это критично для надежных систем. За 10+ лет я видел события которые "зависли" на месяцы. Поделюсь практическим опытом.
Что такое событие
Событие — это сообщение о том, что что-то произошло в системе.
Примеры:
- User registered
- Payment processed
- Order created
- Inventory updated
- Email sent
В микросервисной архитектуре события путешествуют между сервисами через message queues (Kafka, RabbitMQ).
Жизненный цикл события
Время создания -> Время обработки -> Время уведомления -> Время архивирования -> Удаление
T0 T1 T2 T3 T4
Как долго должно жить событие
Ответ зависит от типа события.
1. Критичные события (Payment, Order)
Требование: Событие НЕ должно быть потеряно.
Пример: Payment.Processed
T0: Event created (user clicks Pay button)
T1: Event sent to Kafka
T2: Payment Service processes event
T3: Event moved to completed topic
T4: Event stored for 7 years (financial regulation)
T5: Event deleted after 7 years
Почему 7 лет?
- Финансовое регулирование требует хранения
- Возможны судебные разбирательства
- Аудит и reconciliation
Гарантии:
- Zero data loss (максимум 1 минута)
- Exactly-once processing
- Retry on failure (24 часа)
2. Уведомительные события (Email, SMS)
Требование: Лучше отправить дважды чем не отправить.
Пример: Order.Confirmation.Email
T0: Event created (order placed)
T1: Event sent to Kafka
T2: Email Service picks up event
T3: Email sent (best effort)
T4: Event kept for 30 days (for troubleshooting)
T5: Event deleted after 30 days
Гарантии:
- At-least-once delivery (может быть дублирован)
- Idempotency required (можно обработать 2 раза)
- Retry for 24-48 hours
3. Аналитические события (Page View, Click)
Требование: Потеря нескольких событий OK, но большинство должны дойти.
Пример: User.PageView
T0: Event created (user views page)
T1: Event sent to Kafka
T2: Analytics Service processes event
T3: Event aggregated into metrics
T4: Event kept for 30 days
T5: Event deleted (raw events removed, aggregates kept)
Гарантии:
- Best effort (может быть потеряно 0.1%)
- Fire-and-forget
- No retry
4. Быстротечные события (Real-time stats, Notifications)
Требование: Очень быстро обработать или забыть.
Пример: Stock.PriceUpdated
T0: Event created (price changed)
T1: Event sent to WebSocket
T2: Browser received (milliseconds)
T3: Event processed immediately
T4: Event discarded (TTL: 100ms)
Гарантии:
- Ultra-low latency
- No storage
- Can drop if overloaded
Сложный пример: E-commerce Order Processing
Проект где я проектировал жизненный цикл события в системе с миллионами заказов.
Событие: Order.Created
Timeline (в UTC):
2024-01-15 10:30:00 UTC
T0: Event created when user clicks "Place Order"
Event: {
id: "evt_12345",
event_type: "order.created",
timestamp: "2024-01-15T10:30:00Z",
data: { order_id: "ord_999", amount: 99.99 }
}
Topic: "orders-topic" (Kafka partition: 5)
Status: CREATED
2024-01-15 10:30:01 UTC
T1+: Event in Kafka
Retention: 7 days (default)
Status: QUEUED
Consumers:
- Payment Service (lag: 500ms)
- Inventory Service (lag: 800ms)
- Analytics Service (lag: 1.2s)
- Notification Service (lag: 2.1s)
2024-01-15 10:30:05 UTC
T2: All services processed
Status: PROCESSED
Event moved to "orders-completed" topic
2024-01-15 10:30:06 UTC
T3: Event in Archive topic
Retention: 3 years (financial requirement)
Status: ARCHIVED
2027-01-15
T4: 3 years passed
Status: ELIGIBLE_FOR_DELETION
But wait!
Legal hold placed on 2025-01-15 (lawsuit)
Deletion blocked
Status: HOLD
2028-01-15 (lawsuit settled)
Deletion hold released
Status: DELETABLE
2028-01-15 23:59:59
T5: Event deleted from archive
Status: DELETED
Факторы которые влияют на время жизни события
1. Регуляторные требования
Financial transactions: 7 years
E-commerce orders: 2-3 years
User data (GDPR): delete on request
Health records: 6-10 years
Tax records: 7 years
2. Бизнес-требования
Customer support: events for 2 years (refund claims)
Analytics: events for 1 year
Debugging: events for 30 days
Risk management: events for 5 years
3. Инфраструктурные ограничения
Kafka storage: 7 days (cost)
Database archive: 1 year
Cold storage (S3): 3+ years (cheap)
Delete policy: after 3 years
4. Тип события
Critical (payment): long retention
Normal (order): medium retention
Optional (analytics): short retention
Realtime (stream): no retention
Как я проектирую жизненный цикл
Шаг 1: Классификация события
Event: Payment.Processed
Criticality: CRITICAL
Business Impact: High (money involved)
Data Sensitivity: High (PII)
Volume: 10,000 events/day
Шаг 2: Определение требований
Retention: 7 years (regulatory)
Retry: up to 24 hours
Deadline: delivered within 1 hour
Guarantee: exactly-once processing
Archive: move to cold storage after 6 months
Шаг 3: Планирование хранения
0-7 days: Hot storage (Kafka)
Cost: $X per TB
Access: real-time (< 1 second)
Usage: live processing, debugging
7 days - 6 months: Warm storage (Database)
Cost: $Y per TB (lower)
Access: <1 second
Usage: customer service, investigation
6 months - 3 years: Cold storage (S3)
Cost: $Z per TB (much lower)
Access: minutes/hours
Usage: audit, legal
3+ years: Archive/Delete
Action: delete or move to tape
Access: never
Шаг 4: Мониторинг
Metrics:
- Event lag (max: 1 hour)
- Dead letter queue size (should be < 100)
- Retention storage usage
- Processing success rate (target: 99.99%)
Alerts:
- Lag exceeds 1 hour
- Dead letter queue growing
- Storage quota exceeded
- Processing failure rate > 0.1%
Проблемы которые я встречал
Проблема 1: Orphaned Events
Ситуация: Платеж был обработан, но заказ никогда не был создан. Платеж "зависил" на 3 дня.
Причина: Order Service был down 3 дня. Payment event остался в Kafka.
Решение:
- Monitor lag (если lag > 1 hour, alert)
- Dead letter queue для events которые не удалось обработать
- Reconciliation job: ищет события без соответствия (платеж без заказа)
Проблема 2: Duplicate Processing
Ситуация: Email отправлена дважды пользователю.
Причина: Event был обработан, но Kafka не получил ACK (из-за сетевой ошибки). Так что Event был переобработан.
Решение:
- Idempotency key в событии (email_event_id_123)
- Service check: "Did I already process this event?"
- Database unique constraint на idempotency key
Проблема 3: Storage Explosion
Ситуация: Мы хранили ВСЕ события на 7 лет. Через 2 года хранилище переполнилось. Стоимость: $50k/месяц
Решение:
- Tiered storage (hot -> warm -> cold)
- Compress old events
- Delete non-critical events after retention period
- Monthly review of storage costs
Best Practices
1. Define retention clearly
Для каждого типа события:
events:
- type: payment.processed
retention_days: 2555 # 7 years
archive_method: S3
deletion_policy: delete_after_retention
- type: page.view
retention_days: 30
archive_method: none
deletion_policy: automatic_delete
2. Implement dead letter queue
Kafka Topic: events
|
+-> Success (99.9%)
|
+-> Failure (0.1%)
|
+-> Dead Letter Queue
(manual inspection)
3. Idempotency
def process_event(event):
# Check if already processed
if db.exists(f"processed_{event.id}"):
return # Already handled
# Process event
result = handle_event(event)
# Mark as processed
db.set(f"processed_{event.id}", True, expiry=7_days)
return result
4. Monitoring
Dashboard:
- Events created: counter
- Events processed: counter
- Event lag: histogram
- Dead letter queue: gauge
- Storage usage: gauge
- Processing errors: counter
5. Graceful degradation
If storage is running out:
Option 1: Increase quota
Option 2: Delete oldest non-critical events
Option 3: Compress older events
Option 4: Move to cold storage
(do NOT lose critical events!)
Когда событие можно удалить
НИКОГДА удаляй:
- Financial transactions (7+ years)
- Health records (как требует закон)
- Security logs (для investigation)
- Legal holds
Можно удалить:
- Analytics events (после агрегирования)
- Temporary notifications (после отправки)
- Debug logs (старше 30 дней)
- Cache events (могут быть пересоздан)
Вывод
Жизненный цикл события требует:
- Классификации события по важности
- Определения retention requirements
- Планирования хранения (hot/warm/cold)
- Мониторинга lag и health
- Обработки failures (dead letter queue)
- Гарантии idempotency
- Соответствия регуляторным требованиям
Хороший системный аналитик всегда спрашивает: "Как долго должно жить это событие?"