- PVSM.RU - https://www.pvsm.ru -

К сожалению, у меня нет опыта работы с микросервисами, но около года назад я очень активно интересовался этой темой и изучил все источники информации, какие смог найти. Я просмотрел несколько выступлений на конференциях, прочитал несколько статей очень авторитетных и опытных специалистов вроде Мартина Фаулера, Фреда Джорджа, Эдриана Кокрофта и Криса Ричардсона, чтобы как можно больше узнать о микросервисах. Эта статья — результат моих изысканий.
Микросервисная архитектура — это подход к созданию приложения, подразумевающий отказ от единой, монолитной структуры. То есть вместо того чтобы исполнять все ограниченные контексты приложения на сервере с помощью внутрипроцессных взаимодействий, мы используем несколько небольших приложений, каждое из которых соответствует какому-то ограниченному контексту. Причём эти приложения работают на разных серверах и взаимодействуют друг с другом по сети, например посредством HTTP.
Иными словами, мы инкапсулируем определённые контексты приложения в микросервисы, по одному на каждый, а сами микросервисы крутим на разных серверах.
Согласно Мартину Фаулеру, термином SOA злоупотребляют все кому не лень, сегодня под ним подразумевают множество вещей. С точки зрения Мартина, микросервисы — это разновидность SOA [27].
Как архитектор-теоретик, желающий стать практиком, я считаю следующее. Решая, использовать ли микросервисы, ни в коем случае нельзя руководствоваться мифами, или желанием «в следующий раз попробовать это», или стремлением быть на переднем крае технологий. К этому, в соответствии с выводами Рейчел Майерс [28], нужно подходить исключительно с прагматической точки зрения. Рейчел отмечает, что архитектура должна [29]:
Я согласен с Рейчел, но я также считаю, что этим критериям удовлетворяют и монолитные архитектурные схемы.
Мартин Фаулер выделяет несколько преимуществ [30] монолитной и микросервисной архитектур, что поможет вам решить, какой подход выбрать:
| Преимущества | |
| Монолитная архитектура | Микросервисы |
| Простота
Монолитная архитектура гораздо проще в реализации, управлении и развёртывании. Микросервисы требуют тщательного управления, поскольку они развёртываются на разных серверах и используют API. |
Частичное развёртывание
Микросервисы позволяют по мере необходимости обновлять приложение по частям. При единой архитектуре нам приходится заново развёртывать приложение целиком, что влечёт за собой куда больше рисков. |
| Согласованность (Consistency)
При монолитной архитектуре проще поддерживать согласованность кода, обрабатывать ошибки и т. д. Зато микросервисы могут полностью управляться разными командами с соблюдением разных стандартов. |
Доступность
У микросервисов доступность выше: даже если один из них сбоит, это не приводит к сбою всего приложения. |
| Межмодульный рефакторинг
Единая архитектура облегчает работу в ситуациях, когда несколько модулей должны взаимодействовать между собой или когда мы хотим переместить классы из одного модуля в другой. В случае с микросервисами мы должны очень чётко определять границы модулей! |
Сохранение модульности
Сохранять модульность и инкапсуляцию может быть непросто, несмотря на правила SOLID. Однако микросервисы позволяют гарантировать отсутствие общих состояний (shared state) между модулями. |
| Мультиплатформенность/гетерогенность
Микросервисы позволяют использовать разные технологии и языки, в соответствии с вашими задачами. |
|
Лично мне нравится прагматичный подход Эрика Эванса [31]. Микросервисы с точки зрения аппаратных ресурсов имеют преимущества, которых лишены единые архитектуры, а также облегчают решение ряда задач с программной точки зрения:
| Микросервисы | |
| Аппаратные преимущества | Программные преимущества |
| Независимая масштабируемость
При размещении модулей на отдельных серверных узлах мы можем масштабировать их независимо от других модулей. |
Сохранение модульности
И единая, и микросервисная архитектуры позволяют сохранять модульность и инкапсуляцию. Однако это может быть довольно трудной задачей, на решение которой уйдут десятилетия, несмотря на правила SOLID. Зато микросервисы позволяют обеспечивать логическое разделение приложения на модули за счёт явного физического разделения по серверам. Физическая изолированность защищает от нарушения пределов ограниченных контекстов. |
| Независимый технический стек
Благодаря распределению модулей по разным серверным узлам и независимому языку взаимодействия мы можем использовать совершенно разные языки программирования, инструменты взаимодействия, мониторинга и хранения данных. Это позволяет выбирать лучшие и наиболее удобные решения, а также экспериментировать с новыми технологиями. |
Независимая эволюция подсистем
Микросервис может развиваться и ломать обратную совместимость, не обременяя себя поддержкой старых версий, так как всегда можно оставить старую версию микросервиса работающей необходимое время. |
Я считаю, что основные причины для использования микросервисов — аппаратные преимущества, недостижимые с помощью единой архитектуры. Так что если вам важны вышеописанные моменты, то микросервисы безальтернативны. Если же аппаратные преимущества для вас некритичны, то сложность микросервисной архитектуры может перевесить её достоинства. Также мне кажется, что с помощью единой архитектуры невозможно достичь частичного развёртывания и частичной доступности, характерных для микросервисов. Это не ключевые преимущества (хотя это в любом случае преимущества).
Вне зависимости от наших вкусов и пожеланий НЕЛЬЗЯ начинать новый проект сразу с использованием микросервисной архитектуры. Вначале нужно сосредоточиться на понимании задачи и на способе её достижения, не тратя ресурсы на преодоление огромной сложности создания экосистемы микросервисов (Ребекка Парсонс [32], Саймон Браун [33]).
Возможность и нацеленность на постоянное ускорение работы
Одна из причин использования микросервисов заключается в том, что мы хотим иметь возможность быстро что-то менять, чтобы реагировать на изменения бизнес-требований, опережать конкурентов. Или, выражаясь словами Эрика Эванса, нам нужно осознавать хаос в компаниях [34]:
Реальность разработки ПО такова, что вначале мы никогда не имеем полного понимания задачи. Наше понимание углубляется по мере работ, и нам постоянно приходится рефакторить. Так что рефакторинг — это потребность, но в то же время и опасность, потому что код становится запутанней, особенно при несоблюдении ограниченности контекстов. Микросервисы заставляют соблюдать пределы ограниченных контекстов, что позволяет сохранять работоспособность, ясность, изолированность и инкапсулированность кода в отдельных связных модулях. Если модуль/микросервис становится запутанным, то эта запутанность только в нём и остаётся, а не распространяется за его пределы.
Нам нужно действовать быстрее на всех стадиях разработки! Это верно для любой архитектуры, но микросервисы в этом отношении удобнее. Мартин Фаулер говорит, что необходимо иметь возможность:
Фред Джордж утверждает [35] то же самое: есть огромная потребность ускорить работу, чтобы выдержать конкуренцию! Он приводит ретроспективный анализ времени, необходимого на введение в эксплуатацию сервера, и отмечает, что в 1990-х требовалось 6 месяцев, в 2010-м благодаря облачным сервисам — 30 минут, а в 2015-м Docker позволял поднять и запустить новый сервер менее чем за минуту.
Эдриан Кокрофт, один из ключевых специалистов в Netflix Cloud и пионер в освоении микросервисов, отмечает, как важно находиться в первых рядах при освоении новых технологий [36], а также очень быстро вводить новые серверы и развёртывать новые версии своих приложений [37]. Эдриан — большой поклонник Docker, поскольку этот сервис позволяет за секунды создавать сервер и развёртывать среды для разработки, тестирования и работы.

Мониторинг крайне важен (Ребекка Парсонс [38]), нам необходимо сразу узнавать о том, что сервер упал, что какой-то компонент перестал отвечать, что происходят сбои вызовов, причём по каждому из микросервисов (Фред Джордж [39]). Также нам нужны инструменты для быстрой отладки (Мартин Фаулер [40]).
Нам нужны devops’ы для мониторинга и управления, при этом между ними и разработчиками должны быть тесные отношения и хорошее взаимодействие (Мартин Фаулер [41]). При работе с микросервисами нам приходится больше развёртывать, усложняется система мониторинга, сильно разрастается количество возможных сбоев. Поэтому в компании очень важна сильная devops-культура (Ребекка Парсонс [42]).
Мартин Фаулер и Джеймс Льюис в своей широко известной статье [43] и выступлениях (Фаулер [44], Льюис [45]) приводят набор характеристик для определения микросервиса.
Лично я полностью согласен с определением Эдриана Кокрофта [46]:
Архитектура на основе свободно сопряжённых сервисов с ограниченными контекстами. (Loosely coupled service oriented architecture with bounded contexts.)

Ограниченный контекст — это понятие явных границ вокруг какого-то бизнес-контекста. Например, в рамках электронной коммерции мы оперируем понятиями «темы» (themes), «поставщики платёжных услуг» (payment providers), «заказы», «отгрузка», «магазин приложений». Всё это ограниченные контексты, а значит — кандидаты в микросервисы.
Полезная общая информация о микросервисах приводится в книге Сэма Ньюмена «Building Microservices». По мнению Джеймса Льюиса, микросервисы должны [47]:
Джеймс Льюис утверждает, что сервис должен быть «настолько большим, чтобы умещаться в руке [48]», то есть чтобы один человек мог полностью разобраться в его устройстве и работе.
Есть разные мнения о размерах микросервисов. Мартин Фаулер описывает случаи [49], когда соотношение количества сотрудников и сервисов колебалось от 60 к 20 до 4 к 200. К примеру, в Amazon используется подход с «командами на две пиццы» (two pizzas team): в команде микросервиса должно быть столько людей, чтобы их можно было накормить двумя пиццами.
Фред Джордж полагает [50], что микросервис должен быть «очень-очень маленьким», чтобы его создавал и сопровождал только один разработчик. То же самое говорит и Джеймс Льюис.
Я согласен с Джеймсом Льюисом, Фредом Джорджем и Эдрианом Кокрофтом. Мне кажется, микросервис должен соответствовать ограниченному контексту, который способен полностью понять один человек. То есть чем шире функциональность приложения, тем больше должно быть микросервисов. Например, в Netflix их около 800! (Фред Джордж [51])
Тем не менее как в самом начале жизненного цикла микросервиса, так и позднее ограниченный контекст может оказаться слишком велик для понимания одним человеком. Нужно выявлять такие ситуации и дробить подобные сервисы на более мелкие. Это соответствует концепциям архитектуры с эволюционным развитием и DDD, подразумевающим, что архитектура постоянно меняется/рефакторится по мере углубления в задачу и/или изменений бизнес-требований. Как говорит Ребекка Парсонс [52], «дробление крайне важно»: при разработке микросервисов труднее всего определять их границы. И при продвижении работы мы однозначно будем объединять или дробить сервисы.
Гетерогенность — это возможность построить систему с использованием разных языков программирования. У подхода есть ряд преимуществ (Мартин Фаулер [30]), а Чед Фаулер [55] считает, что системы обязаны быть гетерогенны по умолчанию, то есть разработчики должны стараться применять новые технологии.
Преимущества гетерогенной системы:
Когда-то внутри команд разработчиков самоорганизовывались группы на основе используемых технологий. В результате проект создавали команда по DBA, команда разработки серверной части и команда разработки интерфейса, действовавшие независимо друг от друга. Такая схема сказывается на качестве продукта, потому что знания в конкретных областях и усилия по разработке рассеиваются по подгруппам.
При микросервисном подходе команды должны организовываться на основе бизнес-возможностей: например команда заказов, отгрузки, каталога и т. д. В каждой команде должны быть специалисты по всем необходимым технологиям (интерфейс, серверная часть, DBA, QA...). Это даст каждой команде достаточный объём знаний, чтобы сосредоточиться на создании конкретных частей приложения — микросервисов (Мартин Фаулер [56], Эрик Эванс [57]).
Подход сочетается с законом Конвея [58], который гласит, что если нам нужны высокосвязные раздельные микросервисы, то структура организации должна отражать желаемую компонентную структуру.
Организации, разрабатывающие системы… создают архитектуры, которые копируют структуры взаимодействий внутри этих организаций.
Мелвин Конвей, 1967
Раньше был такой подход: команда создаёт какую-то функциональность, а затем передаёт её на сопровождение другой команде.
В случае с микросервисами команда должна отвечать за свой продукт в течение всего его жизненного цикла, включая разработку, сопровождение и вывод из эксплуатации. Это формирует «продуктовое мышление», что означает сильную связь между техническим продуктом и его бизнес-возможностями. То есть создаётся прямая взаимосвязь: как приложение помогает своим пользователям расширить их бизнес-возможности.
Опять же, в старые добрые времена компании использовали архитектуру Enterprise Service Bus (сервисная шина), при которой формируется канал коммуникаций между эндпойнтами и бизнес-логикой. Затем этот подход преобразился в spaghetti box.
Микросервисная архитектура переносит бизнес-логику в конечные точки и использует простые способы взаимодействия вроде HTTP.
Ключевые решения по микросервисам должны принимать люди, которые действительно разрабатывают микросервисы. Здесь под ключевыми решениями подразумевается выбор языков программирования, методологии развёртывания, контрактов публичных интерфейсов и т. д.
При традиционном подходе у приложения лишь одна база данных, и много разных компонентов бизнес-логики приложения «взаимодействуют» в рамках этой БД: напрямую читают из неё данные, принадлежащие другим компонентам. Это также означает, что для всех компонентов характерна одна и та же степень сохранности данных, даже если для каких-то из них это не самая лучшая ситуация (Мартин Фаулер [59]).
При микросервисной архитектуре, когда каждый бизнес-компонент представляет собой микросервис, все компоненты обладают собственными базами данных, которые недоступны другим микросервисам. Данные компонента доступны (для чтения и записи) только через соответствующий интерфейс компонентов. Благодаря этому степень устойчивости данных варьируется в зависимости от компонента (Мартин Фаулер [59], Чед Фаулер [55]).
С точки зрения Фреда Джорджа, это первый вызов [60] на пути к микросервисной архитектуре.

Непрерывное развёртывание (Мартин Фаулер [61], Ребекка Парсонс [62], Чед Фаулер [55], Эрик Эванс [63]):
Серверы, по которым распределено приложение, рано или поздно падают, особенно разные узлы. Поэтому архитектура приложений должна быть устойчива к таким сбоям (Мартин Фаулер [64]).
Chaos monkey — это инструмент, созданный в Netflix. Он позволяет выключать серверы для проверки устойчивости системы к такому типу отказов (Мартин Фаулер [65]).
Ребекка Парсонс [66] считает очень важным, что мы больше не используем даже внутрипроцессное взаимодействие между сервисами, вместо этого для связи мы прибегаем к HTTP, который и близко не бывает столь же надёжен. В результате будут возникать сбои при общении сервисов друг с другом, и система должна быть к этому готова.
Архитектура всего приложения не должна быть статичной, необходима возможность её простого развития в соответствии с потребностями бизнеса. Например, можно:
Есть два подхода к структурированию фронтенда и бэкенда при микросервисной архитектуре:
Одно из преимуществ микросервисов заключается в том, что мы можем применять разные технологии для решения одной и той же задачи. Например, в каждом микросервисе использовать разные библиотеки для XML-парсинга или разные инструменты сохранности данных. Но сама возможность не означает, что мы должны это делать. Не исключено, что обилие технологий и библиотек выйдет из-под контроля. Так что выберите базовый набор инструментов и обращайтесь к другим только тогда, когда это действительно нужно (Ребекка Парсонс [68]).
В начале разработки микросервиса его API особенно нестабилен. Но даже на более поздних стадиях, когда микросервис достаточно отработан, нам приходится менять API, его ввод и вывод. Осторожно вносите изменения, потому что другие приложения будут полагаться на стабильность API (Ребекка Парсонс [69]).
Микросервисы имеют собственные хранилища данных. И во многих случаях данные, принадлежащие одному микросервису, будут частично или целиком скопированы другим, клиентским микросервисом. Когда данные у поставщика меняются, он инициирует событие для запуска обновления данных, скопированных клиентским микросервисом. Событие попадает в очередь сообщений и ожидает, когда его получит клиентский микросервис.
Эта схема означает, что клиентский микросервис будет обладать устаревшими данными, пока не обнаружит нужное событие. Данные не согласованы.
Конечно, в итоге изменения будут применены ко всем копиям, а данные снова станут согласованными. Это называется eventual consistency — согласованность в конечном счёте. То есть мы знаем, что в течение короткого периода времени данные остаются несогласованными. Этот эффект имеет важное значение в ходе разработки приложений, от серверной части до UX-уровней (Ребекка Парсонс [70]).
Приступая к созданию приложения, нужно изначально придерживаться единой архитектуры — по причине её простоты. В то же время нужно стараться создавать его как можно более модульным, чтобы каждый компонент легко переносился в отдельный микросервис (Ребекка Парсонс [32]). Это сочетается с идеей Саймона Брауна [33] о разработке приложения в виде набора раздельных компонентов в едином развёртываемом модуле.
При декомпозиции единой архитектуры в микросервисную, или в набор раздельных компонентов, необходимо думать о нескольких измерениях в поддержку нашего решения:
В большинстве проектов не требуется микросервисная архитектура, им нужна хорошая архитектура. Под этим я подразумеваю не только хорошую структуру, но также (может, это даже важнее) ясное определение этой структуры, чёткое и аккуратное отражение структуры в самом коде, чтобы это было очевидно для разработчиков и помогло им выделить ограниченные контексты и понять, когда стоит пересекать границы, а когда нет.
А дальше уже разработчикам решать, поддерживать или развивать архитектурную структуру. Это подразумевает строгое следование плану, структуре, архитектуре, что не всегда легко. Ведь мы всего лишь люди.
Werner Vogels • декабрь 2008 • Eventually Consistent – Revisited [82]
Oracle • июнь 2012 • De-mystifying “eventual consistency” in distributed systems [83]
Мартин Фаулер и Джеймс Льюис • март 2014 • Microservices [43]
Эдриан Кокрофт • январь 2015 • The State of the Art in Microservices [84]
Чед Фаулер • июль 2015 • From Homogeneous Monolith to Radically Heterogeneous Microservices Architecture [85]
Эрик Эванс • декабрь 2015 • DDD & Microservices: At Last, Some Boundaries! [86]
Фред Джордж • август 2015 • Challenges in implementing Microservices [87]
Джеймс Льюис • октябрь 2015 • Microservices and the Inverse Conway Manoeuvre [45]
Джет Уэсли-Смит • октябрь 2014 • Real World Microservices [88]
Мартин Фаулер • январь 2015 • Microservices [44]
Рейчел Майерс • декабрь 2015 • Stop Building Services, Episode 1: The Phantom Menace [89]
Ребекка Парсонс • июль 2015 • Evolutionary Architecture & Micro-Services [90]
Автор: Mail.Ru Group
Источник [91]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vy-sokaya-proizvoditel-nost/239237
Ссылки в тексте:
[1] SOA и микросервисы: #1
[2] Когда следует использовать микросервисы?: #2
[3] Предпосылки: #3
[4] Непрерывное развёртывание: #4
[5] Усложнившийся мониторинг: #5
[6] Сильная devops-культура: #6
[7] Характеристики: #7
[8] Что такое микросервис?: #8
[9] Насколько велик микросервис?: #9
[10] Компонентное представление через сервисы: #10
[11] Гетерогенность: #11
[12] Организация человеческих ресурсов в соответствии с возможностями бизнеса: #12
[13] Продукты, а не проекты: #13
[14] Умные конечные точки и глупые каналы (Smart endpoints and dumb pipes): #14
[15] Децентрализованное управление: #15
[16] Децентрализованное управление данными: #16
[17] Автоматизация инфраструктуры: #17
[18] Страховка от сбоев (Design for failure): #18
[19] Эволюционная архитектура: #19
[20] Фронтенд/бэкенд: #20
[21] Опасности : #21
[22] Необходимо управлять гибкостью технологии: #22
[23] Необходимо управлять неустойчивостью интерфейса: #23
[24] Необходимо быть уверенными в согласованности данных: #24
[25] Как декомпозировать единое приложение: #25
[26] Заключение: #26
[27] микросервисы — это разновидность SOA: https://youtu.be/wgdBVIX9ifA?t=14m30s
[28] выводами Рейчел Майерс: https://youtu.be/qiC9OAculcc?t=5m55s
[29] архитектура должна: https://youtu.be/qiC9OAculcc?t=8m39s
[30] Мартин Фаулер выделяет несколько преимуществ: https://youtu.be/wgdBVIX9ifA?t=17m55s
[31] прагматичный подход Эрика Эванса: https://youtu.be/yPvef9R3k-M?t=29m23s
[32] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=16m40s
[33] Саймон Браун: https://leanpub.com/software-architecture-for-developers/read#leanpub-auto-a-good-architecture-enables-agility
[34] осознавать хаос в компаниях: https://youtu.be/yPvef9R3k-M?t=4m10s
[35] Фред Джордж утверждает: https://youtu.be/yPf5MfOZPY0?t=3m17s
[36] находиться в первых рядах при освоении новых технологий: https://youtu.be/pwpxq9-uw_0?t=2m38s
[37] очень быстро вводить новые серверы и развёртывать новые версии своих приложений: https://youtu.be/pwpxq9-uw_0?t=15m16s
[38] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=11m42s
[39] Фред Джордж: https://youtu.be/yPf5MfOZPY0?t=17m10s
[40] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=24m40s
[41] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=25m30s
[42] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=28m34s
[43] широко известной статье: http://martinfowler.com/articles/microservices.html
[44] Фаулер: https://www.youtube.com/watch?v=wgdBVIX9ifA
[45] Льюис: https://www.youtube.com/watch?v=uicjqeZO690
[46] определением Эдриана Кокрофта: https://youtu.be/pwpxq9-uw_0?t=21m25s
[47] микросервисы должны: https://youtu.be/uicjqeZO690?t=8m30s
[48] настолько большим, чтобы умещаться в руке: https://youtu.be/wgdBVIX9ifA?t=16m13s
[49] описывает случаи: https://youtu.be/wgdBVIX9ifA?t=16m43s
[50] Фред Джордж полагает: https://youtu.be/yPf5MfOZPY0?t=16m
[51] Фред Джордж: https://youtu.be/yPf5MfOZPY0?t=47m25s
[52] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=10m37s
[53] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=4m15s
[54] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=11m26s
[55] Чед Фаулер: https://youtu.be/sAsRtZEGMMQ?t=21m40s
[56] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=6m30s
[57] Эрик Эванс: https://youtu.be/yPvef9R3k-M?t=2m55s
[58] законом Конвея: https://en.wikipedia.org/wiki/Conway%27s_law
[59] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=9m19s
[60] первый вызов: https://youtu.be/yPf5MfOZPY0?t=18m41s
[61] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=11m22s
[62] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=12m45s
[63] Эрик Эванс: https://youtu.be/yPvef9R3k-M?t=5m45s
[64] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=12m11s
[65] Мартин Фаулер: https://youtu.be/wgdBVIX9ifA?t=12m31s
[66] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=12m14s
[67] Рейчел Майерс: https://youtu.be/qiC9OAculcc?t=27m18s
[68] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=13m5s
[69] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=15m23s
[70] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=14m
[71] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=17m23s
[72] Рейчел Майерс: https://youtu.be/qiC9OAculcc?t=12m52s
[73] 1: https://youtu.be/WhHtVUlJNA0?t=18m32s
[74] 3: https://youtu.be/WhHtVUlJNA0?t=18m54s
[75] 3: https://youtu.be/WhHtVUlJNA0?t=19m17s
[76] Рейчел Майерс: https://youtu.be/qiC9OAculcc?t=18m41s
[77] 2: https://youtu.be/WhHtVUlJNA0?t=19m58s
[78] 2: https://youtu.be/WhHtVUlJNA0?t=20m38s
[79] Рейчел Майерс: https://youtu.be/qiC9OAculcc?t=38m11s
[80] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=20m56s
[81] Ребекка Парсонс: https://youtu.be/WhHtVUlJNA0?t=21m37s
[82] Eventually Consistent – Revisited: http://www.allthingsdistributed.com/2008/12/eventually_consistent.html
[83] De-mystifying “eventual consistency” in distributed systems: http://www.oracle.com/technetwork/consistency-explained-1659908.pdf
[84] The State of the Art in Microservices: https://www.youtube.com/watch?v=pwpxq9-uw_0
[85] From Homogeneous Monolith to Radically Heterogeneous Microservices Architecture: https://www.youtube.com/watch?v=sAsRtZEGMMQ
[86] DDD & Microservices: At Last, Some Boundaries!: https://www.youtube.com/watch?v=yPvef9R3k-M
[87] Challenges in implementing Microservices: https://www.youtube.com/watch?v=yPf5MfOZPY0
[88] Real World Microservices: https://www.youtube.com/watch?v=1aaw7iYS_VM
[89] Stop Building Services, Episode 1: The Phantom Menace: https://www.youtube.com/watch?v=qiC9OAculcc
[90] Evolutionary Architecture & Micro-Services: https://www.youtube.com/watch?v=WhHtVUlJNA0
[91] Источник: https://habrahabr.ru/post/320962/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.