Оперативное обновление кода в Орлеане

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

Я знаю, что в Erlang есть акторная модель, и в Whatsapp они могут обновлять код на лету. Возможно ли это в настоящее время в Орлеане, или мне нужно остановить бункеры и развернуть новый код? Если да, то можно ли это сделать программно?

Спасибо!


person Fritjof Berggren    schedule 03.01.2017    source источник


Ответы (1)


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

Примечание. Здесь я использую термины «сервер» и «хранилище» как синонимы.

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

Описание в предыдущем абзаце может показаться немного абстрактным, поэтому давайте возьмем практический пример. У вас есть 5 серверов, все в одном кластере с DeploymentId 123, и балансировщик нагрузки перенаправляет трафик на каждый из них в циклическом режиме.

  1. Вы отключаете первые 3 бункера. Кластер замечает уход узлов и подстраивается. Балансировщик нагрузки также замечает и перенаправляет трафик только на последние 2 узла (которые все еще имеют DeploymentId 123).
  2. Вы развертываете обновленный код на первых трех бункерах с идентификатором DeploymentId 456 и включаете их. DeploymentId отличается, поэтому они не присоединятся к старому кластеру.
  3. Вы указываете балансировщику нагрузки первые 3 бункера. Теперь вы эффективно работаете с новым кодом, так как последние 2 бункера не получат никаких запросов.
  4. Вы отключаете последние 2 бункера и развертываете их с новым идентификатором развертывания (456). Когда вы включаете их, они присоединяются к новому кластеру.
  5. Вы настраиваете балансировщик нагрузки, чтобы он указывал на все 5 узлов.
person Gigi    schedule 03.01.2017
comment
Спасибо за ответ. Можно ли выполнить все описанные вами шаги с C#? И может ли переадресация трафика с 5 бункеров на 2 их отключить? - person Fritjof Berggren; 04.01.2017
comment
Не могли бы вы объяснить использование балансировщика нагрузки в этом решении? Обычно клиент orleans имеет подключения ко всем (по крайней мере, большинству) хранилищам в кластере. Эти подключения осуществляются непосредственно к хранилищу и обычно не через балансировщик нагрузки. Кроме того, клиент должен быть обновлен новым идентификатором развертывания, что требует перезапуска grinclient. - person BozoJoe; 04.01.2017
comment
@BozoJoe балансировщик нагрузки позволяет абстрагировать связь между внешними клиентами и хранилищами. Если клиент может напрямую общаться со всеми хранилищами, у вас нет возможности контролировать, взаимодействует ли он с новым или старым кластером во время развертывания. - person Gigi; 04.01.2017
comment
@FernandoUrkijoCereceda нет, вы не можете сделать это с C#; это требует администрирования программного обеспечения. - person Gigi; 04.01.2017
comment
Orleans v1.4.0, бета-версия которого была только что выпущена сегодня утром, позволяет разным бункерам в одном кластере иметь разные типы зерна. v1.5.0 будет поддерживать управление версиями зерна. Так что поддержка осуществляется. Тем не менее, мы не планируем разрешать горячую замену кода — это гораздо более фундаментальная функция, которая действительно нуждается в поддержке .NET и не дает особых преимуществ, даже если это звучит круто. github.com/dotnet/orleans/releases/tag/v1.4.0- бета - person Reuben Bond; 02.02.2017