Orleans Каталог зерн
Зерна имеют стабильные логические удостоверения и могут быть активированы (экземпляры) и деактивированы много раз в течение жизни приложения, но по крайней мере одна активация зерна существует в любой момент времени. Каждый раз при активации зерна он может быть помещен в другой узел в кластере. При активации зерна в кластере он регистрируется в глобальном реестре, каталог зерна. Это гарантирует, что последующие вызовы этого зерна будут доставлены в эту активацию зерна и что никакие другие активации (экземпляры) этого зерна не будут созданы. Каталог зерна отвечает за сохранение сопоставления между удостоверением зерна и местом (который silo) находится в текущем состоянии активации.
По умолчанию Orleans используется встроенный распределенный каталог в памяти. Этот каталог в конечном итоге согласован и секционирован по всем оси в кластере в виде распределенной хэш-таблицы.
Начиная с версии 3.2.0, Orleans также поддерживает подключаемые реализации каталога зерна.
Два таких подключаемых модуля включены в выпуск 3.2.0:
- Реализация таблицы Azure: Microsoft.Orleans. GrainDirectory.AzureStorage
- Реализация магазина Redis: Microsoft.Orleans. GrainDirectory.Redis
Вы можете настроить реализацию каталога зерна для использования на основе каждого типа, и вы можете даже внедрить реализацию.
Какой каталог зерна следует использовать?
Мы рекомендуем всегда начинать с стандартного (встроенного распределенного каталога в памяти). Несмотря на то, что он в конечном итоге согласован и позволяет иногда повторять активацию при нестабильном кластере, встроенный каталог самодостаточен без внешних зависимостей, не требует какой-либо конфигурации и использовался в рабочей среде в течение всего времени.
Если у вас есть опыт Orleans работы с каталогом зерна с более сильной гарантией одноактивной активации и /или хотите свести к минимуму количество зерна, которое деактивируется при завершении работы с сило в кластере, рассмотрите возможность использования реализации каталога на основе хранилища, например реализации Redis. Сначала попробуйте использовать его для одного или нескольких типов зерна, начиная с тех, которые являются длительными и имеют значительное количество состояния или дорогостоящий процесс инициализации.
Настройка
По умолчанию вам не нужно ничего делать; Каталог в памяти будет автоматически использоваться и секционироваться по всему кластеру. Если вы хотите использовать конфигурацию каталога, отличной от уровня по умолчанию, необходимо указать имя подключаемого модуля каталога для использования. Это можно сделать с помощью атрибута класса grain и внедрения зависимостей и подключаемого модуля каталога с таким именем во время конфигурации silo.
Конфигурация зерна
Указание имени подключаемого GrainDirectoryAttributeмодуля каталога grain с помощью :
[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Конфигурация Silo
Здесь мы настраиваем реализацию каталога Redis.
siloBuilder.AddRedisGrainDirectory(
"my-grain-directory",
options => options.ConfigurationOptions = redisConfiguration);
Каталог azure grain настроен следующим образом:
siloBuilder.AddAzureTableGrainDirectory(
"my-grain-directory",
options => options.ConnectionString = azureConnectionString);
Можно настроить несколько каталогов с различными именами для различных классов зерна:
siloBuilder
.AddRedisGrainDirectory(
"redis-directory-1",
options => options.ConfigurationOptions = redisConfiguration1)
.AddRedisGrainDirectory(
"redis-directory-2",
options => options.ConfigurationOptions = redisConfiguration2)
.AddAzureTableGrainDirectory(
"azure-directory",
options => options.ConnectionString = azureConnectionString);