We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

К списку статей

Event‑Sourcing на Python: построение устойчивых бизнес‑логик

13 мар 2026 в 00:30 Усачёв Денис Евгеньевич

Event Sourcing (ES) – это архитектурный паттерн, в котором состояние приложения определяется последовательностью событий. Вместо хранения текущего состояния объекта, сохраняются все действия (события), которые привели к его текущему состоянию. Это позволяет легко отслеживать историю изменений, проводить аудит, восстанавливать состояние приложения в любой момент времени и создавать сложные аналитические отчеты. В контексте современного бизнеса, ES становится все более востребованным, особенно при необходимости обеспечения прозрачности и неизменяемости данных, что актуально в условиях усиления требований законодательства РФ.

Зачем использовать Event Sourcing?

Event Sourcing предоставляет ряд значительных преимуществ:

  • История изменений: Полная и неизменяемая история всех изменений в системе. Это критически важно для аудита и расследований.
  • Восстановление состояния: Возможность восстановления состояния приложения в любой момент времени, что полезно при сбоях или ошибках.
  • Аналитика: Легкое создание аналитических отчетов на основе исторических данных.
  • Расширяемость: Добавление новых функциональностей не требует изменения существующей базы данных. Новые слушатели событий могут подписываться на существующие события.
  • Устойчивость к ошибкам: Благодаря истории событий, можно легко отследить и исправить ошибки, возникшие в процессе обработки данных.

Архитектура Event Sourcing на Python

Типичная архитектура ES на Python включает следующие компоненты:

  • Event Store: Хранилище событий. Может быть реализовано с использованием различных технологий, таких как базы данных (PostgreSQL, MySQL) или специализированные системы хранения событий (Kafka, RabbitMQ). Для небольших проектов можно использовать базу данных, для масштабируемых – Kafka или RabbitMQ.
  • Event Handlers: Компоненты, которые обрабатывают события и обновляют внутреннее состояние приложения.
  • Read Models: Специализированные представления данных, оптимизированные для конкретных запросов. Создаются на основе событий и используются для быстрого получения данных.
  • Command Handlers: Компоненты, обрабатывающие команды от пользователей и генерирующие события.

Реализация Event Sourcing на Python

Для реализации ES на Python можно использовать различные библиотеки и фреймворки. Вот пример простой реализации с использованием библиотеки sqlalchemy для работы с базой данных и pydantic для определения структуры событий:


from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime
from pydantic import BaseModel

Base = declarative_base()

class Event(Base):
    id = Column(Integer, primary_key=True, autoincrement=True)
    event_name = Column(String)
    data = Column(String)
    timestamp = Column(DateTime, default=datetime.utcnow)

class CreateUserEvent(Event):
    event_name = 'user.created'
    data = {'username': str, 'email': str}

class UpdateUserEvent(Event):
    event_name = 'user.updated'
    data = {'username': str, 'email': str}

engine = create_engine('sqlite:///:memory:') # Пример SQLite базы данных
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()


def apply_event(event):
    # Логика обновления состояния пользователя на основе события
    print(f'Applying event: {event.event_name} with data: {event.data}')
    # Здесь можно добавить код для обновления данных в базе данных


# Создание пользователя
user_data = {'username': 'john_doe', 'email': 'john.doe@example.com'}
create_event = CreateUserEvent(data=user_data)
session.execute(session.query(Event).insert().values(event=create_event))
session.commit()

# Обработка события
print('---')
print(f'Processing event: {create_event.event_name}')
apply_event(create_event)

# Обновление пользователя
update_data = {'username': 'john_doe_updated', 'email': 'john.doe.updated@example.com'}
update_event = UpdateUserEvent(data=update_data)
session.execute(session.query(Event).insert().values(event=update_event))
session.commit()

# Обработка события
print('---')
print(f'Processing event: {update_event.event_name}')
apply_event(update_event)

session.close()

Недостатки Event Sourcing

Несмотря на многочисленные преимущества, Event Sourcing имеет и некоторые недостатки:

  • Сложность реализации: Требует значительных усилий для проектирования и реализации.
  • Сложность запросов: Запросы к данным могут быть сложнее, чем в традиционных системах, особенно если требуется агрегировать данные из множества событий.
  • Консистентность данных: Гарантия консистентности данных может быть сложной задачей.

Учет законодательства РФ

При разработке систем на основе Event Sourcing необходимо учитывать требования законодательства РФ, в частности:

  • Федеральный закон № 152-ФЗ «О персональных данных»: Необходимо обеспечить защиту персональных данных пользователей, включая хранение информации о событиях, связанных с их данными. Это потребует использования шифрования данных и соблюдения других мер безопасности.
  • Федеральный закон № 4-ФЗ «О персональных данных»**: При обработке персональных данных в рамках событий, необходимо соблюдать требования законодательства по согласию пользователей, хранению данных и их удалению.
  • Требования к аудиту: Event Sourcing предоставляет естественную возможность для проведения аудита изменений в системе, что может быть полезно для соответствия требованиям законодательства.

Заключение

Event Sourcing – мощный архитектурный паттерн, который позволяет создавать устойчивые и гибкие бизнес-логики. Хотя реализация ES может быть сложной, преимущества, которые он предоставляет, делают его привлекательным выбором для многих проектов. Правильное проектирование и соблюдение требований законодательства РФ являются ключевыми факторами успеха при использовании Event Sourcing.

РыбинскЛАБ - команда опытных разработчиков, специализирующихся на разработке сложных систем на Python, включая Event Sourcing. Мы поможем вам реализовать вашу бизнес-логику с учетом всех требований и законодательных норм.

* Материал подготовлен с использованием ИИ-ассистента, проверен и отредактирован экспертом РыбинскЛАБ.

Поделиться материалом:

Нужна сложная разработка?

Усачёв Денис Евгеньевич — проектирование архитектуры, бэкенд на PHP/Python, интеграции API и базы данных.

Обсудить проект
Поддержать проект