Припустимо, що ми хочемо реалізувати невелику підсистему безпеки для фінансової програми, яка попереджає користувачів електронною поштою, якщо виявлено дивний шаблон. У цьому прикладі схема буде складатися з трьох транзакцій, як зображено. Підсистема безпеки може читати події з основної системи з черги.
Мені хотілося б отримати попередження, яке є прямим наслідком подій, що відбуваються в системі, без проміжного представлення, яке моделює поточний стан схеми.
- Моніторинг активовано
- Операція оброблена
- Операція оброблена
- Операція оброблена
- Сповіщення спрацьовує (id: 123)
- Електронний лист для надісланого сповіщення (для id: 123)
- Операція оброблена
Маючи це на увазі, я вважав, що пошук подій може бути застосований тут дуже добре, хоча у мене є питання без чіткої відповіді. Попередження, викликане в прикладі, має чіткий побічний ефект, електронний лист потрібно надіслати, обставина, яка має відбутися лише один раз. Тому це не повинно відбуватися під час відтворення всіх подій сукупності.
Якоюсь мірою я бачу електронний лист, який потрібно надіслати аналогічно матеріалізаціям, породженим стороною запиту, яку я бачив стільки разів у літературі про джерела CQRS / події, хоча не настільки тонка різниця.
У цій літературі сторона запиту побудована з обробників подій, які можуть генерувати матеріалізацію стану в заданій точці, читаючи знову всі події. Однак у цьому випадку це неможливо зробити так, як це пояснювалося раніше. Ідея про те, що кожна держава минуща, тут не так добре застосовується . Нам потрібно зафіксувати той факт, що десь було надіслано попередження.
Простим рішенням для мене було б мати іншу таблицю або структуру, де ви ведете облік попереджуваних попереджень. Оскільки у нас є ідентифікатор, ми зможемо перевірити, чи було попередження з таким самим ідентифікатором подано раніше. Наявність цієї інформації зробить SendAlertCommand idempotent. Можна видавати кілька команд, але побічний ефект відбудеться лише один раз.
Навіть маючи на увазі це рішення, я не знаю, чи це натяк на те, що з цією архітектурою щось не так у цій проблемі.
- Чи правильний мій підхід?
- Чи є якесь місце, де я можу знайти більше інформації про це?
Дивно, що я не зміг знайти про це більше інформації. Можливо, я використав неправильне формулювання.
Дуже дякую!