История и остаток отвечают на разные вопросы
Пусть в вымышленном клубе было двадцать одинаковых складных табличек. В журнал внесли выдачу пяти, затем возврат двух. Текущий остаток составляет семнадцать. Если хранить только это число, по нему нельзя восстановить обе операции. Неизменяемые события позволяют увидеть, как система пришла к результату. При этом пользовательскому экрану необязательно каждый раз показывать весь журнал: для чтения может существовать отдельное представление текущего остатка. Источник истории и удобный вид данных выполняют разные задачи. Неизменяемость событий не требует неподвижности отображаемого состояния.
Корректировка добавляет смысл, а не стирает прошлое
Позже выяснилось, что первоначально выдали четыре таблички, но записали пять. Можно добавить корректирующее событие, которое отменяет лишнее списание одной единицы и ссылается на ошибочную запись. Тогда рассчитанный остаток станет восемнадцать: двадцать минус пять плюс два плюс одна корректировка. В журнале остаётся видно и первоначальное сообщение, и исправление. Это не означает, что пять табличек действительно выдавались. Журнал подтверждает историю записей системы, а соответствие записей реальному миру требует проверки. Такая граница особенно важна при разборе ошибок и спорных данных.
Неизменяемые события не устраняют все сложности
Для надёжной модели нужно определить порядок событий, защиту от повторной обработки и правила одновременных изменений. Иначе два процесса могут принять решения по устаревшему остатку. Также со временем меняется структура данных, поэтому чтение старых событий требует продуманной совместимости. История полезна, когда её действительно нужно анализировать или воспроизводить, но хранение и сопровождение добавляют сложность. Это не универсальная замена обычной базе с обновляемыми записями. Состав сохраняемых сведений и сроки хранения тоже проектируют отдельно: принцип неизменяемости не означает, что следует бессрочно накапливать любые персональные данные.
Попробуйте на практике
Воспроизведите журнал вымышленного клуба на бумаге. Настоящая база, программный код и реальные данные об участниках не нужны.
- Запишите начальный остаток двадцать табличек. Добавьте событие выдачи пяти и событие возврата двух, сохраняя порядок. Получите текущий остаток семнадцать.
- Добавьте новое условие: в первой записи количество выдачи завышено на одну. Не зачеркивайте исходное событие, а создайте отдельную корректировку со ссылкой на него и объяснением причины.
- Пересчитайте состояние по всей последовательности и получите восемнадцать. Отдельно восстановите состояние до корректировки, чтобы показать различие между прежним знанием системы и уточнённым результатом.
- Нарисуйте рядом экран, который показывает только текущий остаток. Объясните, почему его значение меняется при добавлении события, хотя уже сохранённые записи журнала остаются прежними.
Как проверить результат. До исправления получилось семнадцать, после восемнадцать. Корректировка связана с ошибочным событием и не применена дважды. История записей отделена от текущего представления и от утверждения о том, что происходило физически.
Частые вопросы
Можно ли назвать любой список изменений событийной архитектурой?
Нет. Нужно понимать, является ли история источником состояния или лишь вспомогательным журналом рядом с основной записью. Название без описания роли данных мало что объясняет.
Почему бы всегда не хранить только последний результат?
Иногда этого достаточно. История становится полезной, когда нужно объяснить происхождение состояния или восстановить прежние сведения. Выбор зависит от задачи и оправданности дополнительной сложности.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.