Производитель изменил тип поля, и потребитель перестал читать очередь. События живут дольше одного развертывания, поэтому совместимость нужна не только между текущими версиями, но и с сохраненной историей.
Что подготовить
- Схемы сообщений и список активных потребителей.
- Срок хранения событий и порядок развертывания компонентов.
- Правила обязательности, значений по умолчанию и неизвестных полей.
Порядок работы
- Зафиксируйте значение полей, а не только их синтаксические типы.
- Классифицируйте изменение: добавление, удаление, смена типа или смена смысла.
- Проверьте новую версию потребителя на старых сообщениях и старую версию на новых, если они будут сосуществовать.
- Вводите переходный период или отдельную версию события при несовместимой семантике.
- Проверьте повторное чтение истории и обработку неизвестной версии без бесконечного цикла ошибок.
Разобранный пример
Поле amount раньше означало целые минимальные единицы, а новая версия хочет передавать десятичное значение. Формально оба варианта могут выглядеть числом, но смысл различается. Без явной версии потребитель способен неверно посчитать сумму.
Как проверить результат
- Исторические сообщения остаются читаемыми в заявленном периоде.
- Неизвестное поле не вызывает отказ там, где расширения разрешены.
- Ошибочное сообщение изолируется с диагностикой и не блокирует всю очередь.
Если что-то пошло не так
Если смысл поля изменился, не маскируйте это сохранением прежнего имени и типа. Создайте новую форму события и переходный механизм. Для поврежденных сообщений нужен отдельный путь разбора и решения, а не бесконечный повтор.
Матрица совместимости сообщений
Постройте четыре клетки: старый производитель со старым потребителем, старый с новым, новый со старым и новый с новым. Добавьте отдельную строку повторного чтения архивных событий. Для каждой клетки сохраните пример сообщения и ожидаемый результат. Если определенная комбинация запрещена, порядок развертывания должен действительно исключать ее появление.
Проверьте отсутствие поля отдельно от явного пустого значения. Потребитель может различать эти состояния, например считать отсутствие командой сохранить прежнее значение, а пустое — командой очистить его. Значение по умолчанию нельзя назначать только ради прохождения схемы, если оно меняет смысл события. Аналогично новое значение перечисления требует определенного поведения старого обработчика.
Для несовместимого изменения запишите срок поддержки переходного формата и способ понять, что старые потребители больше не используются. Наличие новой версии в коде не подтверждает обновление всех запущенных процессов. Проверьте сообщения, уже находящиеся в очереди во время переключения. Ошибочный экземпляр должен сохранять исходные байты и причину отказа в доступном для разбора месте с подходящими правами. После исправления обработчика повторяйте только нужную группу сообщений, сохраняя защиту от повторных побочных эффектов. Это особенно важно, когда часть сообщений была применена до обнаружения несовместимости.
Промпт для разбора ваших материалов
Оцени изменение схемы событий. Построй матрицу старых и новых производителей и потребителей, включая историю. Предложи порядок развертывания, проверки и обработку неизвестных сообщений.Частые вопросы
Достаточно ли добавить номер версии?
Номер помогает выбрать обработчик, но сам по себе не обеспечивает совместимость и миграцию.
Можно ли удалить старое поле сразу?
Только после подтверждения, что поддерживаемые потребители и исторические сценарии больше от него не зависят.
Материал библиотеки решений Ильи Тарасова / TarasovWeb.
О проекте
Практическая библиотека Ильи Тарасова и TarasovWeb. Telegram-канал · Личная страница · ВКонтакте.
#tarasovweb #ИльяТарасов
