Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Orleans гарантирует, что при вызове зерна его экземпляр доступен в памяти на одном из серверов кластера для обработки запроса. Если зерно в настоящее время не активно в кластере, Orleans выбирает сервер для активации зерна. Этот процесс называется размещением зерна. Размещение также является одним из способов Orleans балансировки нагрузки: равномерное размещение занятого зерна помогает распределять рабочую нагрузку по кластеру.
Процесс размещения в Orleans полностью настраивается. Выберите из встроенных политик размещения, таких как случайное, предпочтительное локальное и основанное на нагрузке, или настройте пользовательскую логику. Это позволяет полностью гибко решать, где создаются зерна. Например, разместите зерна на сервере близко к ресурсам, с которыми они должны работать или близко к другим зернам, с которыми они взаимодействуют. По умолчанию Orleans выбирает случайный совместимый сервер.
Настройте стратегию размещения Orleans, используемую глобально или для каждого типа зерна.
Случайное размещение
Orleans случайным образом выбирает сервер из совместимых серверов в кластере. Чтобы настроить эту стратегию размещения, добавьте RandomPlacementAttribute в класс grain.
Локальное размещение
Если локальный сервер совместим, Orleans выбирает локальный сервер. В противном случае он выбирает случайный сервер. Настройте эту стратегию размещения, добавив PreferLocalPlacementAttribute в класс зерна.
Размещение на основе хэша
Orleans хэширует идентификатор зерна к неотрицательному целому числу и применяет операцию с модулем с числом совместимых серверов. Затем он выбирает соответствующий сервер из списка совместимых серверов, упорядоченных по адресу сервера. Обратите внимание, что это размещение не гарантировано как стабильное при изменениях членства в кластере. В частности, добавление, удаление или перезапуск серверов может изменить сервер, выбранный для заданного идентификатора зерна. Поскольку зерна, размещенные с помощью этой стратегии, регистрируются в каталоге зерен, изменения в решениях о размещении при изменении членства обычно не имеют заметного эффекта.
Настройте эту стратегию размещения, добавив HashBasedPlacementAttribute в класс зерна.
Размещение на основе количества активаций
Эта стратегия размещения пытается разместить новые активации зерен на наименее загруженном сервере на основе числа недавно обработанных зерен. Он включает механизм, в котором все серверы периодически публикуют общее количество активаций на всех остальных серверах. Затем директор размещения выбирает сервер, прогнозируемый, чтобы иметь наименьшие активации, проверяя последнее число активаций и прогнозируя текущее количество на основе недавних активаций, сделанных директором размещения на текущем сервере. Директор выбирает несколько серверов случайным образом при выполнении этого прогноза, чтобы избежать перегрузки нескольких отдельных серверов на одном сервере. По умолчанию два сервера выбираются случайным образом, но это значение можно настроить с помощью ActivationCountBasedPlacementOptions.
Этот алгоритм основан на принципе " Сила двух вариантов в случайной балансировке нагрузки " Майкла Дэвида Митценмахера. Он также используется в Nginx для распределенной балансировки нагрузки, как описано в статье NGINX и "Power of Two Choices" Load-Balancing Algorithm.
Настройте эту стратегию размещения, добавив 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
{
// ...
}
Наконец, зарегистрируйте стратегию при создании ISiloHost
:
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 исходного кода.