2017-02-08 7 views
0

Для службы с сохранением состояния существует ли способ, с помощью которого реплика может определить из своего идентификатора раздела (значение GUID) ключ раздела (строка или номер/номер диапазона)? Глядя на .NET API, можно получить идентификатор реплики только с ServicePartitionKey, но не наоборот.Определить ключ раздела (имя или диапазон номеров) из раздела ID

ответ

3

Нет, вы не можете получить его непосредственно из идентификатора раздела (guid). В зависимости от типа разбиения (Singleton, Int64Range или Named), который вы используете, и как он настраивается, возможно, вывести его, но нет возможности сделать это непосредственно из службы.

Имеет смысл, что это так, рассмотрим сценарий, в котором у вас есть служба с схемой секционирования Int64 с low key = 0 и high key = 9 и 2 разделами. Любой ключ раздела от 0 до 4 попадет в раздел no. 1 и клавиши 5 - 9 в разделе №. 2. Но поскольку любой вызов с ключом от 0 до 4 заканчивается на тем же экземпляром этой услуги, тогда ключ действительно будет за звонок, а не за услугу, поэтому с точки зрения обслуживания, как бы он знал, к какому ключу относится этот раздел, если только это не было вызвано вызовом клиента службе, и вы могли бы сказать «для этого вызова раздел XXX ключ 123». В настоящее время нет такой информации, запеченной в тканевой транспортной связи, раздел разрешается на стороне клиента и никогда не переходит к сервису.

Что вы можете сделать, это выяснить диапазон, в котором находится идентификатор раздела. Для схемы разделов Singleton, вы находитесь на «разделе», а не на том, чтобы обсуждать там. Для Названных и Int64 можно перечислить разделы с помощью FabricClient.QueryManager:

var fabricClient = new FabricClient(); 
var partitionList = await fabricClient.QueryManager.GetPartitionListAsync(serviceName); 

foreach (var partition in partitionList) 
{ 
    // Partition Guid 
    var partitionId = partition.PartitionInformation.Id; 

    // Int 64 Range 
    var int64PartitionInfo = partition.PartitionInformation as Int64RangePartitionInformation; 
    var lowKey = int64PartitionInfo?.LowKey; 
    var highKey = int64PartitionInfo?.HighKey; 

    // Named Range 
    var namedPartitionInfo = partition.PartitionInformation as NamedPartitionInformation; 
    var name = namedPartitionInfo.Name; 
} 

именованного диапазона, если на самом деле дает вам ключ раздела, так как это отображение один к одному, но для Int64 диапазон вы только получите span ints для этого раздела.

Вышеупомянутый код также является тем, что вы, вероятно, не хотите запускать каждый раз, когда хотите найти ключ раздела, поскольку FabricClient.QueryManager относительно медленный.

Другой вариант, который у вас есть, если вам важно знать ключ раздела в каждом служебном вызове, - это просто добавить его в качестве параметра сообщения или заголовка сообщения в своих вызовах клиенту (аналогично это Passing user and auditing information in calls to Reliable Services in Service Fabric transport)

+0

спасибо. Идти с именем или HighKey - именно то, что мне нужно. –