Размещение зерна
Orleans гарантирует, что при вызове зерна имеется экземпляр этого зерна, доступный в памяти на одном из серверов в кластере для обработки запроса. Если зерно в настоящее время не активно в кластере, Orleans выбирает один из серверов для активации зерна. Это называется размещением зерна. Размещение также является одним из способов балансировки нагрузки: равномерное распределение активных зерен помогает сбалансировать нагрузку в кластере.
Процесс размещения в Orleans полностью настраиваем: разработчики могут выбирать из набора встроенных политик размещения, таких как случайная, предпочитаемая локальная и основанная на нагрузке, или можно настроить собственную логику. Это обеспечивает полную гибкость при выборе того, где создаются зерна. Например, зерна можно поместить на сервер, близкий к ресурсам, с которыми они должны работать или близко к другим зернам, с которыми они взаимодействуют. По умолчанию Orleans выбирает случайный совместимый сервер.
Стратегия размещения, которая используется Orleans, может быть настроена глобально или для каждого класса зерен.
Случайное размещение
Сервер выбирается случайным образом из совместимых серверов в кластере. Эта стратегия размещения настраивается путем добавления RandomPlacementAttribute в зерно.
Локальное размещение
Если локальный сервер совместим, выберите локальный сервер, в противном случае выберите случайный сервер. Эта стратегия размещения настраивается путем добавления PreferLocalPlacementAttribute в зерно.
Размещение на основе хэша
Хэшировать идентификатор зерна в неотрицательное целое число и модулировать его с числом совместимых серверов. Выберите соответствующий сервер из списка совместимых серверов, упорядоченных по адресу сервера. Обратите внимание, что это не гарантирует стабильное состояние по мере изменения членства в кластере. В частности, добавление, удаление или перезапуск серверов может изменить сервер, выбранный для заданного идентификатора зерна. Так как зерна, размещенные с помощью этой стратегии, регистрируются в каталоге зерна, это изменение в решении о размещении, так как изменения членства обычно не имеют заметного эффекта.
Эта стратегия размещения настраивается путем добавления HashBasedPlacementAttribute в зерно.
Размещение на основе количества активаций
Эта стратегия размещения предполагает размещать новые активации зерен на наименее загруженном сервере на основе количества недавно активированных зерен. Он включает механизм, в котором все серверы периодически публикуют общее количество активаций на всех остальных серверах. Затем директор размещения выбирает сервер, который, по прогнозам, имеет наименьшее количество активаций, проверяя последнее число активаций и прогнозируя текущее число активаций на основе недавнего количества активаций, сделанных директором размещения на текущем сервере. Директор выбирает несколько серверов случайным образом при выполнении этого прогноза, чтобы избежать перегрузки нескольких отдельных серверов на одном сервере. По умолчанию два сервера выбираются случайным образом, но это значение можно настроить с помощью ActivationCountBasedPlacementOptions.
Этот алгоритм основан на тезисе "Сила двух вариантов в случайной балансировке нагрузки" Майкла Дэвида Митценмахера, а также используется в NGINX для распределенной балансировки нагрузки, как описано в статье NGINX и "Сила двух вариантов" Load-Balancing алгоритм.
Эта стратегия размещения настраивается путем добавления ActivationCountBasedPlacementAttribute в зерно.
Размещение безсостояного работника
Размещение работник ов без отслеживания состояния — это специальная стратегия размещения, используемая зерна без отслеживания состояния. Это размещение работает почти так же, как PreferLocalPlacement, за исключением того, что каждый сервер может иметь несколько активных экземпляров одного и того же зерна, и это зерно не зарегистрировано в каталоге зерен, поскольку в этом нет необходимости.
Эта стратегия размещения настраивается путем добавления StatelessWorkerAttribute в зерно.
Размещение на основе ролей в Silo
Детерминированная стратегия размещения, при которой зерна помещаются на силосы с определенной ролью. Эта стратегия размещения настраивается путем добавления SiloRoleBasedPlacementAttribute в грейн.
Оптимизированное размещение ресурсов
Стратегия размещения, оптимизированная для ресурсов, пытается улучшить ресурсы кластера путем балансировки активаций зерен в разных хранилищах на основе доступной памяти и использования ЦП. Он назначает веса статистике времени выполнения для установления приоритетов различных ресурсов и вычисляет нормализованную оценку для каждого силоса. Для размещения предстоящей активации выбирается силос с наименьшей оценкой. Нормализация гарантирует, что каждое свойство вносит пропорциональный вклад в общую оценку. Весовые значения можно настроить с помощью ResourceOptimizedPlacementOptions на основе требований и приоритетов пользователей для различных ресурсов.
Кроме того, эта стратегия размещения предоставляет возможность создания более сильного предпочтения локального хранилища (того, который получил запрос на создание новогоразмещения) для выбора в качестве целевого объекта для активации. Это управляется с помощью свойства LocalSiloPreferenceMargin
, которое является частью параметров.
Кроме того, онлайн-, адаптивный алгоритм обеспечивает эффект сглаживания, который позволяет избежать быстрого падения сигнала путем преобразования его в многономический процесс распада. Это особенно важно для использования процессора, а также в целом способствует предотвращению переполнения ресурсов на силосах, особенно недавно присоединившихся.
Этот алгоритм основан на следующем: размещение на основе ресурсов с использованием совместной фильтрации Калмана в двух режимах
Настройка этой стратегии размещения осуществляется путем добавления ResourceOptimizedPlacementAttribute в зерно.
Выбор стратегии размещения
Выбор соответствующей стратегии размещения зерна за пределами значений по умолчанию, которые Orleans предоставляет, требует мониторинга и оценки разработчиков. Выбор стратегии размещения должен зависеть от размера и сложности приложения, характеристик рабочей нагрузки и среды развертывания.
Случайное размещение основывается на законе больших чисел, поэтому это обычно хороший вариант по умолчанию, когда наблюдается непредсказуемое распределение нагрузки по большому количеству гранул (10 000 плюс).
Размещение на основе количества активаций также имеет случайный элемент, основанный на принципе «Сила двух выборов», который широко применяется для алгоритмов распределенной балансировки нагрузки и используется в популярных системах балансировки нагрузки. Силосы часто публикуют данные о производительности для других силосов в кластере, в том числе:
- Доступная память, общая физическая память и использование памяти.
- Использование ЦП.
- Общее число активаций и последнее число активных активаций.
- Скользящее окно активаций, активное в течение последних нескольких секунд, иногда называется рабочим набором активации.
Из этой статистики для определения нагрузки на заданный силон используется только количество активаций.
В конечном счете, следует экспериментировать с различными стратегиями и отслеживать метрики производительности, чтобы определить оптимальное соответствие. Выбрав правильную стратегию размещения зерна, вы можете оптимизировать производительность, масштабируемость и экономичность приложений Orleans.
Настройка стратегии размещения по умолчанию
Orleans будет использовать случайное размещение, если значение по умолчанию не переопределяется. Стратегия размещения по умолчанию может быть переопределена путем регистрации реализации PlacementStrategy во время настройки:
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
Настройка стратегии размещения для зерна
Стратегия размещения для типа зерна настраивается путем добавления соответствующего атрибута в класс зерна. Соответствующие атрибуты указываются в стратегиях размещения разделах.
Пример пользовательской стратегии размещения
Сначала определите класс, реализующий интерфейс IPlacementDirector, требующий одного метода. В этом примере предполагается, что у вас есть функция GetSiloNumber
, которая вернёт номер силоса для заданного Guid зерна, которое будет создано.
public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
public Task<SiloAddress> OnAddActivation(
PlacementStrategy strategy,
PlacementTarget target,
IPlacementContext context)
{
var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);
return Task.FromResult(silos[silo]);
}
}
Затем необходимо определить два класса, чтобы позволить назначать классы зерна стратегии.
[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
public SamplePlacementStrategyAttribute() :
base(new SamplePlacementStrategy())
{
}
}
Затем просто пометьте атрибутом все классы зерна, с которыми вы хотите использовать эту стратегию.
[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Наконец, при создании SiloHostзарегистрируйте стратегию:
private static async Task<ISiloHost> StartSilo()
{
var builder = new HostBuilder(c =>
{
// normal configuration methods omitted for brevity
c.ConfigureServices(ConfigureServices);
});
var host = builder.Build();
await host.StartAsync();
return host;
}
private static void ConfigureServices(IServiceCollection services)
{
services.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}
Второй простой пример, показывающий дальнейшее использование контекста размещения, см. в PreferLocalPlacementDirector
в Orleans исходном репозитории.