Атрибуты координации зерна
Разработчики могут указывать, когда и как кластеры должны координировать свои каталоги зерна в отношении определенного класса зерна. Это GlobalSingleInstanceAttribute означает, что мы хотим выполнить то же поведение, что и при выполнении Orleans в одном глобальном кластере: то есть перенаправите все вызовы к одной активации зерна. И наоборот, атрибут указывает, [OneInstancePerCluster]
что каждый кластер может иметь свою независимую активацию. Это целесообразно, если обмен данными между кластерами не рекомендуется.
Атрибуты помещаются в реализации зерна. Например:
using Orleans.MultiCluster;
[GlobalSingleInstance]
public class MyGlobalGrain : Orleans.Grain, IMyGrain
{
// ...
}
[OneInstancePerCluster]
public class MyLocalGrain : Orleans.Grain, IMyGrain
{
// ...
}
Если класс зерна не указывает ни один из этих атрибутов, он по умолчанию OneInstancePerClusterAttributeимеет значение , либо GlobalSingleInstanceAttribute если параметр GlobalConfiguration.UseGlobalSingleInstanceByDefault конфигурации имеет значение true
.
Протокол для глобальных одно экземпляров
Когда доступ к зерне глобального экземпляра (GSI) отсутствует, и активация не существует, перед активацией нового экземпляра выполняется специальный протокол активации GSI. В частности, запрос отправляется всем остальным кластерам в текущей конфигурации с несколькими кластерами, чтобы проверка если у них уже есть активация для этого зерна. Если все ответы отрицательны, в этом кластере создается новая активация. В противном случае используется удаленная активация (и ссылка на нее кэшируется в локальном каталоге).
Протокол для одного экземпляра для каждого кластера
Взаимодействие между кластерами для одно экземпляров и кластеров не выполняется. Они просто используют стандартный Orleans механизм независимо в каждом кластере. Orleans Внутри самой платформы следующие классы зерна помечаются следующими OneInstancePerClusterAttributeклассами:
ManagementGrain
SystemTargetBasedMembershipTable
GrainBasedReminderTable
Сомнительные активации
Если протокол GSI не получает исчерпывающие ответы от всех кластеров после 3 повторных попыток (или любого числа, указанного параметром GlobalSingleInstanceNumberRetriesконфигурации), он создает новую локальную "сомнительную" активацию оптимистично, предпочитая доступность по сравнению с согласованностью.
Сомнительные активации могут быть дубликатами (так как некоторые удаленные кластеры, которые не ответили во время активации протокола GSI, могут иметь активацию этого зерна). Таким образом, периодически каждые 30 секунд (или любой интервал, указанный параметром GlobalSingleInstanceRetryIntervalконфигурации), протокол GSI выполняется снова для всех сомнительных активаций. Это гарантирует, что после восстановления связи между кластерами можно обнаружить и удалить повторяющиеся активации.