Я не думаю, что вы можете развернуть код на лету, как вы говорите. Зерна - это классы, и они могут зависеть от других классов, и все эти классы находятся в DLL. Если вы добавляете новый класс, например, вы должны развернуть эту DLL на все ваши силосы.
Примечание: Я использую здесь «сервер» и «силос».
Что вы можете сделать, чтобы избежать простоев, это развернуть часть ваших серверов, переключить трафик на них и затем развернуть остальные серверы. Развертывания в Орлеане поддерживают DeploymentId, который является уникальным для кластера. Если вы развертываете свои силосы с новым DeploymentId, они не присоединятся к старому кластеру.
Описание в предыдущем абзаце может показаться немного абстрактным, поэтому давайте рассмотрим практический пример. У вас есть 5 серверов, все в одном кластере с DeploymentId 123, а балансировщик нагрузки пересылает трафик каждому из них в круговом стиле.
- Вы выключаете первые 3 силоса. Кластер замечает отклонение узлов и настраивает. Балансировщик нагрузки также уведомляет и перенаправляет трафик только на последние 2 узла (которые все еще имеют DeploymentId 123).
- Разверните обновленный код на первых 3 силосах с помощью DeploymentId 456 и включите их. DeploymentId отличается, поэтому они не присоединятся к старому кластеру.
- Вы указываете балансировщик нагрузки на первые 3 силоса. Теперь вы эффективно запускаете новый код, так как последние 2 силоса не будут получать никаких запросов.
- Вы выключаете последние 2 силоса и развертываете их с помощью нового DeploymentId (456). Когда вы включаете их, они присоединяются к новому кластеру.
- Вы настраиваете балансировщик нагрузки, чтобы указать на все 5 узлов.
Спасибо за ответ. Могут ли все шаги, которые вы делаете, сделать с C#? И может ли пересылка трафика с 5 силосов в 2 получить их вниз? – toroveneno
Не могли бы вы объяснить использование балансировки нагрузки в этом решении? Обычно клиент orleans имеет подключения ко всем (по крайней мере, большинству) силосов в кластере. Эти соединения находятся непосредственно в бункере и обычно не через балансировщик нагрузки. Кроме того, клиенту необходимо будет обновить новый вариант развертывания, который требует перезапуска. – BozoJoe
@BozoJoe балансировщик нагрузки позволяет абстрагировать связь между внешними клиентами и силосами. Если клиент может напрямую разговаривать со всеми силосами, тогда у вас нет способа контролировать, будет ли он разговаривать с новым кластером или старым, когда вы развертываете. – Gigi