Где эликсир/Эрланг вписываются в микрослужб подход? [закрытый]


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

но я тоже экспериментировал с эликсиром, и я очень люблю преимущества, которые обеспечивает сам по себе. Учитывая, что это поощряет упаковку вашего кода в несколько разъединенные приложения и поддержка обновлений горячего кода, как бы вы смешали docker с elixir (или erlang, если на то пошло)?

например, если я хочу использовать docker, потому что он обеспечивает четность dev-prod, как эликсир вписывается в это? Учитывая, что контейнеры docker неизменяемы, я теряю возможность выполнять обновления горячего кода, верно? Как насчет синих / зеленых развертываний или Канарских выпусков?

Я имею в виду, я мог бы просто написать микросервисов с эликсиром и использовать их как если бы они были написаны на любом другом языке полиглотизм является одним из преимуществ микросервисов в любом случае, но тогда я не получаю все преимущества использования платформы OTP, я думаю, что чистые совместные приложения erlang являются более оптимальными, чем использование промежуточных очередей для связи между микросервисами, написанными на разных (или нет) языках.

1 91

1 ответ:

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

во-первых, давайте начнем с фона. Виртуальная машина Erlang и ее стандартная библиотека были разработаны заранее для создания распределенных систем, и это действительно проявляется. Насколько я знаю, это единственная среда выполнения и виртуальная машина, широко используемая в производстве, разработанная заранее для этого использования случай.

приложения

например, вы уже намекали на "приложения". В Erlang/Elixir код упакован внутри приложений, которые:

  1. запускаются и останавливаются как единое целое. Запуск и остановка вашей системы-это вопрос запуска всех приложений в ней
  2. обеспечить единую структуру каталогов и API конфигурации (который не является XML!). Если вы уже работали с приложением OTP и настроили его, вы знаете, как это сделать работайте с любым другим
  3. содержит ваше дерево наблюдения за приложениями, со всеми процессами (под процессом я подразумеваю "процессы VM", которые являются легкими потоками вычислений) и их состоянием

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

  1. как их код запускается и останавливается
  2. какие процессы являются частью приложения и поэтому, что такое состояние приложения
  3. как эти процессы будут реагировать и быть затронуты в случае сбоев или когда что-то пойдет не так

не только это, инструментарий вокруг этой абстракции велик. Если у Вас установлен Elixir, откройте "iex" и введите: :observer.start(). Помимо отображения информации и графиков о вашей живой системе, вы можете убить случайные процессы, увидеть их использование памяти, состояние и многое другое. Вот пример запуска этого в Фениксе применение:

Observer running with a Phoenix application

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

Если вы спросите кого-нибудь, кто работает с распределенной системой, это то, что они хотят, и с Erlang/Elixir у вас есть это как строительный блок.

сообщении

все это только начало на самом деле. При построении распределенной системы необходимо выбрать протокол связи и сериализатор данных. Многие люди выбирают HTTP и JSON, которые, когда вы думаете об этом, очень многословны и дороги комбинация для выполнения того, что действительно вызывает RPC.

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

Джейми говорил об этом на Erlang Factory 2015 и как они смогли использовать это для создания игровой платформы: https://www.youtube.com/watch?v=_i6n-eWiVn4

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

микрослужб

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

не только это, они также упакованы в приложения, которые группируют их как объекты, которые могут быть запущены и остановлены как единое целое. Если у вас есть приложения A, B и C, а затем вы хотите развернуть их как [A, B] + [C] или [A] + [B] + [C], у вас будет очень мало проблем с этим из-за их присущего дизайна. Или, что еще лучше, если вы хотите избежать добавления сложности развертывания микросервисов в свою систему заранее, вы можете просто развернуть их полностью в тот же узел.

и, в конце концов, если вы используете все это с помощью распределенного протокола Erlang, вы можете запускать их в разных узлах, и они смогут достигать других, пока вы ссылаетесь на них {:node@network, :name} вместо :name.

я мог бы пойти дальше, но я надеюсь, что убедил вас в этом пункте. :)