Ответ
Нет, это не ошибка, а распространённый и валидный паттерн для управления состоянием долгоживущих процессов (например, Saga или State Machine). Ключ — в корректной реализации.
Рекомендации:
- Храните только ключевые данные: ID, статус, параметры процесса. Избегайте сериализации больших объектов графа доменных сущностей.
- Используйте оптимистичную блокировку (
@Version) для предотвращения race condition при параллельном обновлении состояния. - Оптимизируйте структуру хранения: используйте тип
JSONBв PostgreSQL илиTEXTс валидацией в других СУБД.
Пример реализации на Java (Spring Data JPA):
@Entity
public class ProcessInstance {
@Id
private String id;
private String status;
@Column(columnDefinition = "TEXT")
private String contextData; // JSON с контекстом (например, orderId, paymentToken)
@Version
private Long version; // Для оптимистичной блокировки
}
Альтернативы: Для сложных workflow рассмотрите специализированные движки (Camunda, Flowable) или Event Sourcing (с хранением событий в Kafka/Cassandra). Однако для многих случаев хранение контекста в БД — это простое и надёжное решение.