Следуйте этим практическим принципам, чтобы получить хорошо разработанные границы микросервисов

1656643573 sledujte etim prakticheskim princzipam chtoby poluchit horosho razrabotannye graniczy mikroservisov

Содержание статьи

Джейк Люметта

Как избежать того, чтобы ваши микросервисы были слишком малы и тесно связаны

HCYtimj7KjfKRnaZ1wl8f1qu03qPfosHMamw
Фотография Эрола Ахмеда на Unsplash

Одним из основных преимуществ разработки новых систем с микросервисом является то, что архитектура позволяет разработчикам создавать и изменять отдельные компоненты независимо. Но могут возникнуть проблемы, когда дело доходит до минимизации количества обратных вызовов между каждым API.

Крис МакФедден, вице-президент по инженерным вопросам SparkPost, рассказал историю об ошибках проектирования микросервисов, которые могут показаться знакомыми другим разработчикам.

В начале создания SparkPost Макфаддену и его команде пришлось решить проблему, которую имеет каждый SaaS-бизнес: им нужно было предоставить такие базовые услуги, как аутентификация, управление аккаунтом и выставление счетов.

Основная проблема, конечно, заключалась не в том, как взимать деньги с пользователей. Это было как разработать их микросервисы учетных записей пользователей, чтобы поддерживать все, что связано с проблемным доменом: учетные записи пользователей, ключи API, аутентификацию, бизнес-аккаунты, выставление счетов и т.д.

Для решения этой проблемы они создали два микросервиса: Users API и Accounts API. API пользователей будет обрабатывать учетные записи пользователей, ключи API и аутентификацию, а API учетных записей будет обрабатывать всю логику, связанную с выставлением счетов. Очень логично расставание, но вскоре они заметили проблему.

«У нас была одна служба, которая называлась User API, и другая – Account API. Но проблема заключалась в том, что у них фактически были несколько звонков между собой. Так что вы могли бы сделать что-то в аккаунтах и ​​иметь звонок и конечную точку в пользователях или наоборот», – сказал Крис.

Две службы были слишком тесно связаны.

«Мы поняли, что в большинстве случаев вы действительно не хотите, чтобы одна служба вызывала другую службу иногда циклически. В общем, это не очень хорошая идея», – объяснил он.

Решение, по словам Макфаддена, состоит в применении соответствующих пределов обслуживания.

Но как определить пределы этих услуг? В отличие от иногда сложной для восприятия и абстрактной концепции проектирования, управляемого доменом (DDD) – структуры для микросервисов – практическая мудрость опытных технических директоров предлагает лучшую структуру для разработки границ микросервисов. Эта мудрость, полученная из многочасовых интервью, изложена ниже.

Избегайте произвольных правил

Разрабатывая и создавая микросервис, не попадите в ловушку использования произвольных правил. Если вы прочитали достаточно советов, вы натолкнетесь на некоторые из нижеприведенных правил. Несмотря на то, что они привлекательны нет правильные способы определения границ для микросервисов

Произвольное правило №1: микросервис должен иметь X строк кода

Давайте выясним одно: нет ограничений на количество строк кода в микросервисе. Микросервис не станет внезапно монолитом только потому, что вы пишете несколько строчек дополнительного кода. Главное – обеспечить высокую согласованность кода в службе (подробнее об этом позже).

Произвольное правило №2: превращайте каждую функцию в микросервис

Если у вас есть функция, которая вычисляет то на основе трех входных значений и возвращает результат, это хороший кандидат для микросервиса? Это должна быть собственная программа, которую можно разворачивать отдельно? Это действительно зависит от того, какая функция и как она служит всей системе.

Другие произвольные правила

Другие произвольные правила включают те, которые не учитывают весь ваш контекст, как опыт команды, мощность DevOps, то, что делает служба, и потребности в доступности данных.

Пять характеристик хорошо разработанного сервиса

Если вы читали о микросервисах, вы, несомненно, встречали советы по поводу того, что делает сервис хорошо разработанным. Значительная часть этого сводится к принципу высокой когезии и слабой связи. Несмотря на дельный совет, эти понятия достаточно абстрактны.

Я общался с десятками технических директоров по этой теме, чтобы узнать от них, как они обозначили границы своих микросервисов. Ниже я описал вам некоторые основные характеристики.

Характеристика №1: хорошо разработанная служба не делится таблицами базы данных с другой службой

Как мы видели в вышеупомянутом случае Криса Макфаддена, когда дело доходит до разработки микросервиса, если у вас есть несколько сервисов, ссылающихся на ту же таблицу, это красный флажок, поскольку это, вероятно, означает, что ваша БД является источником связи. .

На самом деле речь идет о том, как услуга связана с данными, о чем рассказал Алексей Коврин, руководитель Swiftype SRE, Elastic.

Один из основных основополагающих принципов, который мы используем при разработке новых сервисов, заключается в том, что они не должны пересекать границы баз данных. Каждая служба должна полагаться на свой набор основных хранилищ данных. Это позволяет нам централизовать средства контроля доступа, журналирование аудита, логику кэширования и т.д.», – сказал он.

Далее Ковырин объяснил, что если подмножество таблиц вашей базы данных «не имеет или имеет очень слабую связь с остальным набором данных, это является сильным сигналом того, что компонент можно выделить в отдельный API или отдельную службу».

Дарби Фрей, соучредитель Lead Honestly, повторила это мнение: «Каждая служба должна иметь собственные столы. [and] никогда не должны делиться таблицами базы данных».

Характеристика №2: Хорошо разработанный сервис имеет минимальное количество таблиц базы данных

Идеальный размер микросервиса достаточно мал, но не меньше. То же касается количества таблиц базы данных на службу.

Стивен Червински, руководитель инженерного отдела Scaylr, объяснил мне во время интервью, что лучшее место для Scaylr – это «одна или две таблицы базы данных для службы».

Крис Макфедден уточнил в подобном ключе: «У нас есть микросервисы подавления, и они обрабатывают, отслеживают миллионы и миллиарды записей вокруг подавлений, но все это очень сосредоточено вокруг подавления, поэтому там только одна или две таблицы. То же касается других сервисов, таких как вебхуки».

Характеристика №3: ​​Хорошо разработанный сервис имеет продуманное состояние или без него

Разрабатывая свой микросервис, вы должны спросить себя, нужен ли ему доступ к базе данных, будет ли это сервис без сохранения состояния, которое будет обрабатывать терабайты данных, таких как электронные письма или журналы.

Объясните это заранее и приведет к лучшему дизайну услуги.

Жюльен Лемуан из Algolia объясняет: «Мы определяем границы службы, определяя ее входящие и исходящие данные. Иногда служба является сетевым API, но это также может быть процесс, потребляющий файлы и создающий записи в базе данных (это случай нашей службы обработки журналов).»

Характеристика №4: хорошо спроектированная услуга учитывает потребности в доступности данных

Разрабатывая микросервис, нужно помнить, какие сервисы будут полагаться на этот новый сервис и какое влияние будет оказывать на всю систему, если эти данные станут недоступными. Это позволяет правильно разработать системы резервного копирования и восстановления данных для этой службы.

Во время разговора со Стивеном Червински он упомянул, что их критические данные по сопоставлению пространства строк клиентов копируются и разделяются разными способами из-за их важности.

В отличие от этого, «информация каждого фрагмента находится в отдельном маленьком разделе. Это плохо, если он упадет, потому что у этой части клиентов нет своих журналов, но это повлияет только на 5 процентов клиентов, а не на 100 процентов клиентов», – пояснил Червински.

Характеристика №5: это единственный источник правды

Последней характеристикой, о которой следует помнить, является разработка службы, которая будет единственным источником истины для чего-либо в вашей системе.

Например: когда вы заказываете что-то на сайте электронной коммерции, генерируется идентификатор заказа. Этот идентификатор заказа может использоваться другими службами для запроса службы заказа для получения полной информации о заказе. Используя концепцию pub/sub, данными, передаваемыми между службами, должен быть идентификатор заказа, а не атрибуты/информация самого заказа. Только сервис «Заказ» имеет полную информацию и является единственным источником правды по данному заказу.

Дополнительные соображения для больших команд

Эти указания должны хорошо служить всем командам, но технические директора также упомянули соображения, какие большие команды должны принять во внимание при разработке границ микросервисов.

Для крупных организаций, где целые команды могут быть посвящены владению услугами, организационные соображения вступают в игру при определении границ услуг. И следует помнить о двух моментах: независимом графике выпуска и разной важности безотказной работы.

«Самая успешная реализация микросервисов, которую мы видели, базируется либо на принципе проектирования программного обеспечения, например, на основе доменного дизайна, и сервис-ориентированной архитектуры, либо на отражающих организационный подход», — сказал Хаш Саджади, генеральный директор компании Cloud66.

«Поэтому [for the] Платежная команда, – продолжил Саджади, – у них есть платежная служба или служба подтверждения кредитной карты, и это та услуга, которую они предоставляют внешнему миру. Это не обязательно связано с программным обеспечением. В основном это касается бизнес-единицы [that] оказывает еще одну услугу внешнему миру».

Amazon является отличным примером большой организации с несколькими командами. Как упоминалось в статье, опубликованной в API Evangelist, Джефф Безос выдал всем сотрудникам доверенности, в котором сообщалось, что каждая команда в компании должна общаться через API. Кто этого не сделал, тот был бы уволен.

Таким образом все данные и функциональные возможности были представлены через интерфейс. Безос также сумел заставить каждую команду отделиться, определить, каковы их ресурсы, и сделать их доступными через API. Amazon создавал систему с нуля. Это позволяет каждой команде в компании стать партнером друг друга.

Тревис Ридер, технический директор Iron.io, прокомментировал внутреннюю инициативу Безоса.

«Джефф Безос приказал, чтобы все команды должны были создать API для общения с другими командами. Он тоже тот парень, который придумал правило «двух пицц»; Команда не должна быть больше, чем может накормить две пиццы», — сказал он.

«Я думаю, что то же самое применимо и здесь: все, что небольшая команда может развивать, управлять и быть продуктивной. Если он начинает становиться громоздким или начинает тормозить, он, вероятно, становится слишком большим», – сказал Ридер.

Руководства при тестировании и внедрении

Технические директора также предложили информацию о красных флажках, на которые следует обратить внимание, чтобы определить, слишком ли услуга слишком мала или неправильно определена.

Следите за чрезмерной зависимостью между двумя службами

Если две службы постоянно перезванивают друг другу, это весомый показатель связи и сигнал о том, что их лучше объединить в одну службу.

Возвращаясь к примеру, приведенному Крисом Макфедденом в начале этого раздела, где он имел две службы API, учетные записи и пользователей, постоянно общавшихся между собой. Макфадден придумал идею объединить службы и решил назвать это API обвинителя. . Это оказалось плодотворной стратегией:

«Мы начали уничтожать эти связи [which were the] внутренние вызовы API между ними. Это помогло упростить код». Макфедден сообщил мне.

Перевешивают ли накладные расходы на настройки службы преимущества независимости?

Дарби Фрей объяснила: «Каждая программа нуждается в собранных журналах и мониторинге. Для этого необходимо настроить оповещение. Вам нужно иметь стандартные рабочие процедуры и вести книги для выявления неисправностей. Вы должны управлять доступом SSH к этой вещи. Существует огромное основание вещей, которые должны существовать, чтобы программа просто запускалась».

Рассмотрим эти характеристики

Разработка микросервисов – это сочетание искусства и науки, но характеристики успешного внедрения микросервисов являются отличным контрольным списком при разработке следующего набора границ сервисов.

Хорошо продуманный сервис:

  1. Не предоставляет общий доступ к таблицам базы данных другим службам
  2. Имеет минимальное количество таблиц базы данных
  3. Является задумчиво государственным или без гражданства
  4. Учтены ли потребности в доступности данных
  5. Является единственным источником правды

Если вам понравилась эта статья, помогите ей распространиться, хлопая ниже! Чтобы получить больше подобного содержимого, следите за нами в Twitter и подпишитесь на наш блог.

Джейк Луметта – генеральный директор ButterCMS и публикует микросервисы для стартапов.

И если вы хотите добавить блог или CMS на свой веб-сайт, не возясь с WordPress, вам следует попробовать Butter CMS.

Добавить комментарий

Ваш адрес email не будет опубликован.