Содержание
- 2. Меня хорошо слышно && видно?
- 3. Карта вебинара Паттерны миграции данных Event Sourcing CQRS
- 4. Кейс. Кэширование данных в разных сервисах. Есть приложение «Интернет-магазин». У нас есть несколько сервисов: Сервис «Поиск
- 5. Кейс Чтобы избежать излишней связности сервисов и сложности реализации распределенных транзакций, решили использовать очереди. Каждый сервис,
- 6. Кейс
- 7. Кейс Например Склад отправляет события: Товар id = 42 зарезервирован в количестве 2 штух на складе
- 8. Кейс Последовательно применяем события: [ {”event_type”: “productReserved”, “product_id”: 42, “quantity”: 2}, {“event_type”: “productShipped”, “product_id”: 42, ”quantity”:
- 9. Кейс Однажды сервис ”Cклад” упал, и не успел отправить сообщение в очередь, но успел изменить данные
- 10. Возможное решение (outbox table) Завести табличку с событиями (outbox table). Коммиты в табличку с данными и
- 11. Кейс Однажды сервис "перекладчик" упал, и не успел ack-нуть сообщение, но успел уже изменить данные. И
- 12. Возможное решение 1 (idempotent receiver) Завести табличку с отработанными сообщениями (processed_message). Коммиты в табличку с данными
- 13. Возможное решение 2 Для исправления решили передавать данные прямо в событии (идемпотентные события)
- 14. Кейс Как-то менеджер по скидкам, когда редактировал товары для акций ошибся: и ввел неправильную акцию для
- 15. Возможное решение? 1 При отправке в outbox: В транзакции обновляем version_id в объекте Вставляем предыдущий и
- 16. Возможное решение 2 Читаем событие Забираем актуальные данные из point of truth баз или сервисов Фактически
- 17. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 18. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 19. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 20. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 21. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 22. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 23. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 24. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 25. Возможное решение 2 Такая схема используется в Badoo - http://www.highload.ru/2017/abstracts/2930.html
- 26. Возможное решение 3 (transactional log) Читаем WAL-лог базы данных или прикидываемся репликой Можем читать outbox table,
- 27. Возможное решение 3 (transactional log) Debezium (https://debezium.io/) – платформа для Change Data Capture (CDC)
- 28. Возможное решение 3 (transactional log) Такая схема используется в Mail.Ru (mytarget) - https://habr.com/ru/company/mailru/blog/219015/
- 29. Возможное решение 3 (transactional log) Такая схема используется в Rambler - https://www.youtube.com/watch?v=oByOmhOmOh4
- 30. Event Sourcing А почему бы в базе хранить не состояние объекта, а просто набор событий? Банковский
- 31. Event Sourcing Пусть будет набор событий во времени:
- 32. Event Sourcing Если мы проиграем во времени все события, получится конечное состояние. state –> func (init(),
- 33. Что может дать Event Sourcing? Аудит лог за бесплатно Крутые средства для дебага Не теряешь данных
- 34. Event Sourcing Например, можно хранить вот в такой табличке:
- 35. Event Sourcing Как получить текущее состояние объекта (агрегата)? Последовательно применяем события к объекту и меняем его
- 36. Команды, события и применение В мире Event Sourcing есть: Cобытия – что-то, что случилось в прошлом
- 37. Event Sourcing – меняет способ написания кода Крайне важно, чтобы изменение состояния не происходило вне событийной
- 38. Event Sourcing – меняет способ написания кода Любое изменение состояния происходит только, как результат применения события
- 39. Event Sourcing – меняет способ написания кода
- 40. Command Sourcing vs Event Sourcing Если записывать не события, а команды в стор, то получим command
- 41. Event Sourcing – пример pet project https://github.com/gregoryyoung/m-r – пример реализации Event Sourcing от его создателя Грега
- 42. Снапшоты Время от времени для производительности, приходится делать снапшоты
- 43. Event Sourcing - паттерн уровня хранения данных Event Sourcing – это не паттерн уровня архитектуры всей
- 44. Event Sourcing – плюсы и минусы Плюсы Бесплатный аудит-лог Производительность event-store-ов обычно хорошая Можно делать темпоральные
- 45. Event Sourcing библиотеки и хранилища EventStore – хранилище от Янга Axon - https://axoniq.io/ Eventuate http://eventuate.io/ Грег
- 46. А как делать выборки? Сложные выборки из EventStore делать сложно. Поэтому на помочь приходит паттерн CQRS
- 47. CQRS CQRS – Command/Query Responsibility Segregation Давайте отделим чтение (Read Model/Query) от записи (Write Model/Command)
- 48. Зачем отделять чтения от записи? Операции чтения (queries) и записи (commands) имеют несколько принципиальных различий в
- 49. CQRS CQRS является органичным способом дополнением Event Sourcing. CQRS может быть без ES, ES без CQRS
- 50. Опрос https://otus.ru/polls/7756/
- 52. Скачать презентацию