- PVSM.RU - https://www.pvsm.ru -
Если вы собрались плотно погрузиться в тему Doman Driven Design (DDD), о том как его применять, как использовать, для чего он нужен, и как с ним связаны Command and Query Responsibility Segregation (CQRS), Event Sourcing то можно воспользоваться планом обучения, который последовательно погрузит вас в эти темы и поможет сориентироваться. Часть информации на русском, часть на английском языке, так как русскоязычных аналогов я не смог найти.
Я рекомендую сначала ознакомиться с Базовыми видео, от основателя этого термина Эрика Эванса, чтобы понять его философию и причины возникновения.
Что такое DDD от Эрика Эванса https://www.youtube.com/watch?v=pMuiVlnGqjk [1]
Ограниченные контексты от Эрика Эванса https://www.youtube.com/watch?v=am-HXycfalo [2]
Хорошая архитектура - не идеальная архитектура от Эрика Эванса https://www.youtube.com/watch?v=lY54TmmEllY [3]
Боремся со сложностью в сердце программного обеспечения от Эрика Эванса https://www.youtube.com/watch?v=dnUFEg68ESM&t=2270s [4]
Пример моделирования DDD от Эрика Эванса https://www.youtube.com/watch?v=T29WzvaPNc8&t=1718s [5]
Канал конференции по DDD где можно найти другие выступления Эрика Эванса и других спикеров https://www.youtube.com/channel/UC3PGn-hQdbtRiqxZK9XBGqQ [6]
https://habr.com/ru/post/316438/ [8] часть 1
https://habr.com/ru/post/316890/ [9] часть2
Эти книги точно стоит приобрести и прочитать, а потом много-много раз в процессе работы к ним возвращаться. Когда вас спрашивают, насколько вы знаете DDD, можете щеголять цветами прочитанных книг, посвященные в тему вас поймут :)
Зеленая книга Вернона (для начала) [10] Domain-Driven Design Distilled 1st Edition by de Vaughn Vernon
Красная книга Вернона (для погружения); [11] Implementing Domain-Driven Design 1st Edition by Vaughn Vernon
Синяя книга Эванса (для полного просветления); [12] Domain-Driven Design: Tackling Complexity in the Heart of Software by Eric Evans
https://martinfowler.com/books/eaa.html [13] Паттерны в Enterprise приложениях от Мартина Фаулера
Я бы даже назвал его план последовательного освоения материала, чтобы именно погружаться в тему постепенно, а не бултыхнуться в нее с кучей неизвестных терминов.
Для части пунктов не приведены ссылки сознательно, обычно одна статья покрывает несколько пунктов, поэтому воспользуйтесь ссылкой из пункта выше, чем тот который вас интересует.
Введение в DDD
Что такое DDD? https://blog-programmista.ru/post/132-ddd-what-is-it.html [14]
Почему вы должны заботиться о каком-то DDD? https://habr.com/ru/post/497656/ [15]
Важность коммуникации в DDD
Единый язык (ubiquitos language) https://habr.com/ru/post/232881/ [16]
Пример домена/субдомена https://mtsepkov.org/images/7/7e/CUSTIS-Tsepkov-SoftwarePeople-2013.pdf
[17]https://www.youtube.com/watch?v=CR9mLGN9jh0 [18]
Плюсы / Минусы Подводные камни DDD
Проблемы моделирования в ПО
Перечисление проблем
Что такое домен? https://qastack.ru/software/359592/what-is-a-domain [19]
Как разбить домен на субдомены https://habr.com/ru/company/otus/blog/566742/ [20]
Определение Bounded Context (ограниченный контекст)
Различие между субдоменом и ограниченным контекстом
Единый язык ограниченного контекста
Закон Конвея https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%8F [21]
EventStorming https://habr.com/ru/company/oleg-bunin/blog/537862/ [22]
Элементы доменной модели
Анемичные и Богатые модели https://habr.com/ru/company/dododev/blog/532628/ [23]
Сущности (Entities) в DDD и ограниченном контексте https://habr.com/ru/post/316890/ [9]
Принцип Single responsibility (единственной ответственности) сущностей
Ассоциации или связи
Value Object https://habr.com/ru/post/316890/ [9]
Отличие Entity от Value Object https://habr.com/ru/post/275599/ [24]
Domain Services (службы домена) https://habr.com/ru/post/316890/ [9]
Агрегаты в DDD
Определение и цели использования https://habr.com/ru/company/dododev/blog/532628/ [23]
Корневые агрегаты
Репозитории в DDD https://martinfowler.com/eaaCatalog/repository.html [25]
Определение и назначение https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design [26]
Сравнение репозиториев с фабриками
Виды репозиториев
Unit of work https://martinfowler.com/eaaCatalog/unitOfWork.html [27]
Доменные события и Анти-Коррупционный Слой
Доменные события https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/domain-events-design-implementation [28]
Грег Янг (Greg Young). Что такое событие предметной области? https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf#page=25 [29]
Границы доменных событий
Анти-коррупционный уровень https://russianblogs.com/article/2365847005/ [30]
Eventual Consistency https://star-wiki.ru/wiki/Eventual_consistency [31]
Слои в DDD приложении https://ademcatamak.medium.com/layers-in-ddd-projects-bd492aa2b8aa#:~:text=Layers%20in%20DDD%20Projects&text=In%20projects%20developed%20with%20the,try%20to%20explain%20with%20examples [32]
Назначение слоев
Presentation Layer
Application Layer
Business Logic Layer
Domain Layer
Infrastructure Layer
CQRS паттерн
Определение https://microservices.io/patterns/data/cqrs.html [33]
Контекст и проблема
Решение
Подводные камни
Когда использовать CQRS паттерн https://martinfowler.com/bliki/CQRS.html
[34]https://www.objectivity.co.uk/blog/when-to-use-and-not-to-use-cqrs/ [35]
Event Sourcing паттерн https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing [36]
Контекст и проблема
Решение
Подводные камни
Когда использовать CQRS паттерн https://martinfowler.com/eaaDev/EventSourcing.html [37]
CQRS + EventSourcing
Пример совместного использования
Пример трансформации обычного приложение с “лапша-кодом” в DDD-style с пошаговыми пояснениями (Супер!) https://slides.silverfire.me/2017/yiiconf-ddd/#/ [40]
Пример полного сжатого изложения с примерами https://habr.com/ru/company/jugru/blog/440772/ [41]
Другие паттерны используемые при разработке микросервисов
Грег Янг (Greg Young). Что такое событие предметной области? https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf#page=25 [29]
Ян Стенберг (Jan Stenberg). События предметной области и итоговая согласованность https://www.infoq.com/news/2015/09/domain-events-consistency [43]
Джимми Богард (Jimmy Bogard). Улучшенный шаблон событий предметной области https://lostechies.com/jimmybogard/2014/05/13/a-better-domain-events-pattern/ [44]
Вон Вернон (Vaughn Vernon). Эффективная конструкция агрегата. Часть II. Организация совместной работы агрегатов https://dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_2.pdf [45]
Джимми Богард (Jimmy Bogard). Усиление предметной области: события предметной области https://lostechies.com/jimmybogard/2010/04/08/strengthening-your-domain-domain-events/ [46]
Тони Чыонг (Tony Truong). Пример шаблона событий предметной области https://www.tonytruong.net/domain-events-pattern-example/ [47]
Уди Дахан (Udi Dahan). Создание полностью инкапсулированных моделей предметной области https://udidahan.com/2008/02/29/how-to-create-fully-encapsulated-domain-models/ [48]
Уди Дахан (Udi Dahan). События предметной области. Попытка 2 https://udidahan.com/2008/08/25/domain-events-take-2/ [49]
Уди Дахан (Udi Dahan). События предметной области. Спасение https://udidahan.com/2009/06/14/domain-events-salvation/ [50]
Ян Кронквист (Jan Kronquist). Не публикуйте события предметной области, а возвращайте их! https://blog.jayway.com/2013/06/20/dont-publish-domain-events-return-them/ [51]
Сезар де ла Торре (Cesar de la Torre). События предметной области Интеграция событий в DDD и архитектуры микрослужб https://devblogs.microsoft.com/cesardelatorre/domain-events-vs-integration-events-in-domain-driven-design-and-microservices-architectures/ [52]
https://www.nginx.com/blog/introduction-to-microservices/ [55]
https://itnext.io/1-year-of-event-sourcing-and-cqrs-fb9033ccd1c6 [56]
https://www.semicolonworld.com/question/1310/cqrs-command-return-values [57]
https://vladikk.com/2017/03/20/tackling-complexity-in-cqrs/ [58]
https://danielwhittaker.me/2016/04/20/how-to-validate-commands-in-a-cqrs-application/ [59]
https://teivah.medium.com/event-sourcing-and-concurrent-updates-32354ec26a4c [61]
https://medium.com/@sderosiaux/cqrs-what-why-how-945543482313 [64]
https://docs.microsoft.com/ru-ru/azure/architecture/reference-architectures/saga/saga [65]
https://medium.com/nexa-digital/my-journey-into-cqrs-and-event-sourcing-4bd7d0c1c670 [69]
https://www.sitepen.com/blog/architecture-spotlight-event-sourcing [70]
https://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats-connection/ [71]
https://eventuate.io/post/eventuate/2020/02/24/why-eventuate.html [73]
https://learn.co/lessons/microservices-patterns-chapter-7 [74]
https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224 [75]
https://livebook.manning.com/book/microservices-patterns/chapter-7/25 [77]
https://github.com/heynickc/awesome-ddd#contents [78]
https://virtualddd.com/learning-ddd/awesome-eventstorming [79]
Курс обучения (10 дней бесплатно, потом $29/месяц)
Domain-Driven Design Fundamentals
https://www.pluralsight.com/courses/domain-driven-design-fundamentals [80]
Буду рад комментариям и дополнениям.
Автор: Волков Денис
Источник [81]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/proektirovanie-i-refaktoring/372481
Ссылки в тексте:
[1] https://www.youtube.com/watch?v=pMuiVlnGqjk: https://www.youtube.com/watch?v=pMuiVlnGqjk
[2] https://www.youtube.com/watch?v=am-HXycfalo: https://www.youtube.com/watch?v=am-HXycfalo
[3] https://www.youtube.com/watch?v=lY54TmmEllY: https://www.youtube.com/watch?v=lY54TmmEllY
[4] https://www.youtube.com/watch?v=dnUFEg68ESM&t=2270s: https://www.youtube.com/watch?v=dnUFEg68ESM&t=2270s
[5] https://www.youtube.com/watch?v=T29WzvaPNc8&t=1718s: https://www.youtube.com/watch?v=T29WzvaPNc8&t=1718s
[6] https://www.youtube.com/channel/UC3PGn-hQdbtRiqxZK9XBGqQ: https://www.youtube.com/channel/UC3PGn-hQdbtRiqxZK9XBGqQ
[7] https://docs.microsoft.com/ru-ru/archive/msdn-magazine/2009/february/best-practice-an-introduction-to-domain-driven-design: https://docs.microsoft.com/ru-ru/archive/msdn-magazine/2009/february/best-practice-an-introduction-to-domain-driven-design
[8] https://habr.com/ru/post/316438/: https://habr.com/ru/post/316438/
[9] https://habr.com/ru/post/316890/: https://habr.com/ru/post/316890/
[10] Зеленая книга Вернона (для начала): https://www.amazon.com/Domain-Driven-Design-Distilled-Vaughn-Vernon/dp/0134434420/
[11] Красная книга Вернона (для погружения);: https://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577/
[12] Синяя книга Эванса (для полного просветления);: https://www.amazon.com/-/es/Ross-Venables/dp/0321125215
[13] https://martinfowler.com/books/eaa.html: https://martinfowler.com/books/eaa.html
[14] https://blog-programmista.ru/post/132-ddd-what-is-it.html: https://blog-programmista.ru/post/132-ddd-what-is-it.html
[15] https://habr.com/ru/post/497656/: https://habr.com/ru/post/497656/
[16] https://habr.com/ru/post/232881/: https://habr.com/ru/post/232881/
[17] https://mtsepkov.org/images/7/7e/CUSTIS-Tsepkov-SoftwarePeople-2013.pdf
: https://mtsepkov.org/images/7/7e/CUSTIS-Tsepkov-SoftwarePeople-2013.pdf
[18] https://www.youtube.com/watch?v=CR9mLGN9jh0: https://www.youtube.com/watch?v=CR9mLGN9jh0
[19] https://qastack.ru/software/359592/what-is-a-domain: https://qastack.ru/software/359592/what-is-a-domain
[20] https://habr.com/ru/company/otus/blog/566742/: https://habr.com/ru/company/otus/blog/566742/
[21] https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%8F: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%8F
[22] https://habr.com/ru/company/oleg-bunin/blog/537862/: https://habr.com/ru/company/oleg-bunin/blog/537862/
[23] https://habr.com/ru/company/dododev/blog/532628/: https://habr.com/ru/company/dododev/blog/532628/
[24] https://habr.com/ru/post/275599/: https://habr.com/ru/post/275599/
[25] https://martinfowler.com/eaaCatalog/repository.html: https://martinfowler.com/eaaCatalog/repository.html
[26] https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design: https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design
[27] https://martinfowler.com/eaaCatalog/unitOfWork.html: https://martinfowler.com/eaaCatalog/unitOfWork.html
[28] https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/domain-events-design-implementation: https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/domain-events-design-implementation
[29] https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf#page=25: https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf#page=25
[30] https://russianblogs.com/article/2365847005/: https://russianblogs.com/article/2365847005/
[31] https://star-wiki.ru/wiki/Eventual_consistency: https://star-wiki.ru/wiki/Eventual_consistency
[32] https://ademcatamak.medium.com/layers-in-ddd-projects-bd492aa2b8aa#:~:text=Layers%20in%20DDD%20Projects&text=In%20projects%20developed%20with%20the,try%20to%20explain%20with%20examples: https://ademcatamak.medium.com/layers-in-ddd-projects-bd492aa2b8aa#:~:text=Layers%20in%20DDD%20Projects&text=In%20projects%20developed%20with%20the,try%20to%20explain%20with%20examples
[33] https://microservices.io/patterns/data/cqrs.html: https://microservices.io/patterns/data/cqrs.html
[34] https://martinfowler.com/bliki/CQRS.html
: https://martinfowler.com/bliki/CQRS.html
[35] https://www.objectivity.co.uk/blog/when-to-use-and-not-to-use-cqrs/: https://www.objectivity.co.uk/blog/when-to-use-and-not-to-use-cqrs/
[36] https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing: https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing
[37] https://martinfowler.com/eaaDev/EventSourcing.html: https://martinfowler.com/eaaDev/EventSourcing.html
[38] https://habr.com/ru/post/146429/: https://habr.com/ru/post/146429/
[39] https://bool.dev/blog/detail/pattern-cqrs-i-event-sourcing: https://bool.dev/blog/detail/pattern-cqrs-i-event-sourcing
[40] https://slides.silverfire.me/2017/yiiconf-ddd/#/: https://slides.silverfire.me/2017/yiiconf-ddd/#/
[41] https://habr.com/ru/company/jugru/blog/440772/: https://habr.com/ru/company/jugru/blog/440772/
[42] https://mcs.mail.ru/blog/26-osnovnyh-patternov-mikroservisnoj-razrabotki: https://mcs.mail.ru/blog/26-osnovnyh-patternov-mikroservisnoj-razrabotki
[43] https://www.infoq.com/news/2015/09/domain-events-consistency: https://www.infoq.com/news/2015/09/domain-events-consistency
[44] https://lostechies.com/jimmybogard/2014/05/13/a-better-domain-events-pattern/: https://lostechies.com/jimmybogard/2014/05/13/a-better-domain-events-pattern/
[45] https://dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_2.pdf: https://dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_2.pdf
[46] https://lostechies.com/jimmybogard/2010/04/08/strengthening-your-domain-domain-events/: https://lostechies.com/jimmybogard/2010/04/08/strengthening-your-domain-domain-events/
[47] https://www.tonytruong.net/domain-events-pattern-example/: https://www.tonytruong.net/domain-events-pattern-example/
[48] https://udidahan.com/2008/02/29/how-to-create-fully-encapsulated-domain-models/: https://udidahan.com/2008/02/29/how-to-create-fully-encapsulated-domain-models/
[49] https://udidahan.com/2008/08/25/domain-events-take-2/: https://udidahan.com/2008/08/25/domain-events-take-2/
[50] https://udidahan.com/2009/06/14/domain-events-salvation/: https://udidahan.com/2009/06/14/domain-events-salvation/
[51] https://blog.jayway.com/2013/06/20/dont-publish-domain-events-return-them/: https://blog.jayway.com/2013/06/20/dont-publish-domain-events-return-them/
[52] https://devblogs.microsoft.com/cesardelatorre/domain-events-vs-integration-events-in-domain-driven-design-and-microservices-architectures/: https://devblogs.microsoft.com/cesardelatorre/domain-events-vs-integration-events-in-domain-driven-design-and-microservices-architectures/
[53] https://domaincentric.net/blog: https://domaincentric.net/blog
[54] https://microservices.io/: https://microservices.io/
[55] https://www.nginx.com/blog/introduction-to-microservices/: https://www.nginx.com/blog/introduction-to-microservices/
[56] https://itnext.io/1-year-of-event-sourcing-and-cqrs-fb9033ccd1c6: https://itnext.io/1-year-of-event-sourcing-and-cqrs-fb9033ccd1c6
[57] https://www.semicolonworld.com/question/1310/cqrs-command-return-values: https://www.semicolonworld.com/question/1310/cqrs-command-return-values
[58] https://vladikk.com/2017/03/20/tackling-complexity-in-cqrs/: https://vladikk.com/2017/03/20/tackling-complexity-in-cqrs/
[59] https://danielwhittaker.me/2016/04/20/how-to-validate-commands-in-a-cqrs-application/: https://danielwhittaker.me/2016/04/20/how-to-validate-commands-in-a-cqrs-application/
[60] https://akfpartners.com/growth-blog/cqrs-pattern: https://akfpartners.com/growth-blog/cqrs-pattern
[61] https://teivah.medium.com/event-sourcing-and-concurrent-updates-32354ec26a4c: https://teivah.medium.com/event-sourcing-and-concurrent-updates-32354ec26a4c
[62] https://habr.com/ru/company/devexpress/blog/350060/: https://habr.com/ru/company/devexpress/blog/350060/
[63] https://www.sderosiaux.com/articles/2019/08/29/cqrs-why-and-all-the-things-to-consider/#why-do-we-need-it: https://www.sderosiaux.com/articles/2019/08/29/cqrs-why-and-all-the-things-to-consider/
[64] https://medium.com/@sderosiaux/cqrs-what-why-how-945543482313: https://medium.com/@sderosiaux/cqrs-what-why-how-945543482313
[65] https://docs.microsoft.com/ru-ru/azure/architecture/reference-architectures/saga/saga: https://docs.microsoft.com/ru-ru/azure/architecture/reference-architectures/saga/saga
[66] https://coderoad.ru/53688339/CQRS-event-sourcing-%D0%BF%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D1%8B-%D1%81-%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D0%BC%D0%B8-%D0%B0%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%B0%D0%BC%D0%B8: https://coderoad.ru/53688339/CQRS-event-sourcing-%D0%BF%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D1%8B-%D1%81-%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D0%BC%D0%B8-%D0%B0%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%B0%D0%BC%D0%B8
[67] https://cqrs.nu/Faq/event-sourcing: https://cqrs.nu/Faq/event-sourcing
[68] https://www.youtube.com/watch?v=S3f6sAXa3-c: https://www.youtube.com/watch?v=S3f6sAXa3-c
[69] https://medium.com/nexa-digital/my-journey-into-cqrs-and-event-sourcing-4bd7d0c1c670: https://medium.com/nexa-digital/my-journey-into-cqrs-and-event-sourcing-4bd7d0c1c670
[70] https://www.sitepen.com/blog/architecture-spotlight-event-sourcing: https://www.sitepen.com/blog/architecture-spotlight-event-sourcing
[71] https://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats-connection/: https://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats-connection/
[72] https://habr.com/ru/post/178259/: https://habr.com/ru/post/178259/
[73] https://eventuate.io/post/eventuate/2020/02/24/why-eventuate.html: https://eventuate.io/post/eventuate/2020/02/24/why-eventuate.html
[74] https://learn.co/lessons/microservices-patterns-chapter-7: https://learn.co/lessons/microservices-patterns-chapter-7
[75] https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224: https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224
[76] https://medium.com/@ph.dang/i-think-in-the-last-sentence-client-side-discovery-pattern-should-be-server-side-discovery-2fb14af5fad0?source=responses-----cbd54afb94f3----1----------------------------: https://medium.com/@ph.dang/i-think-in-the-last-sentence-client-side-discovery-pattern-should-be-server-side-discovery-2fb14af5fad0?source=responses-----cbd54afb94f3----1----------------------------
[77] https://livebook.manning.com/book/microservices-patterns/chapter-7/25: https://livebook.manning.com/book/microservices-patterns/chapter-7/25
[78] https://github.com/heynickc/awesome-ddd#contents: https://github.com/heynickc/awesome-ddd#contents
[79] https://virtualddd.com/learning-ddd/awesome-eventstorming: https://virtualddd.com/learning-ddd/awesome-eventstorming
[80] https://www.pluralsight.com/courses/domain-driven-design-fundamentals: https://www.pluralsight.com/courses/domain-driven-design-fundamentals
[81] Источник: https://habr.com/ru/post/653421/?utm_source=habrahabr&utm_medium=rss&utm_campaign=653421
Нажмите здесь для печати.