Azure service fabric 服务结构-是每个分区的有状态服务单个实例

Azure service fabric 服务结构-是每个分区的有状态服务单个实例,azure-service-fabric,Azure Service Fabric,我试图消化服务结构体系结构模式及其最佳实践 用例: 我定义了一个具有26个分区的有状态服务,并且在每个分区中存储具有相同首字母的单词 1) 这是否意味着我实际上有26个有状态服务实例 2) 当在有状态服务之外时,即在调用者中-我正在为我的服务结构客户端构造一个URI,指定我希望客户端操作的分区ID。这是否意味着一旦我在有状态服务的上下文中(即实例化并调用有状态服务的服务客户端),我就不能引用其他分区 3) 有状态服务是一个工作单元,需要知道在哪个分区上操作,并且不能自己做出决定,这是真的吗?这

我试图消化服务结构体系结构模式及其最佳实践

用例:

我定义了一个具有26个分区的有状态服务,并且在每个分区中存储具有相同首字母的单词

  • 1) 这是否意味着我实际上有26个有状态服务实例
  • 2) 当在有状态服务之外时,即在调用者中-我正在为我的服务结构客户端构造一个URI,指定我希望客户端操作的分区ID。这是否意味着一旦我在有状态服务的上下文中(即实例化并调用有状态服务的服务客户端),我就不能引用其他分区
  • 3) 有状态服务是一个工作单元,需要知道在哪个分区上操作,并且不能自己做出决定,这是真的吗?这里我指的是许多示例,其中在有状态服务的RunAsync方法中,有对底层可靠存储的调用,例如,所获取的代码:

    受保护的覆盖异步任务RunAsync(CancellationToken cancelServicePartitionReplica)
    {
    var myDictionary=等待this.StateManager.GetOrAddAsync(“myDictionary”);
    var partition=base.ServicePartition.PartitionInfo.Id;
    byte append=partition.ToByteArray()[0];
    而(!cancelServicePartitionReplica.IsCancellationRequested)
    {
    //创建一个事务以对该分区副本中的数据执行操作。
    使用(var tx=this.StateManager.CreateTransaction())
    {
    var result=await myDictionary.TryGetValueAsync(tx,“A”);
    等待myDictionary.addorUpdateSync(tx,“A”,0,(k,v)=>v+append);
    ServiceEventSource.Current.ServiceMessage(此,
    $“追加{Append}:{(result.HasValue?result.Value:-1)}”);
    wait tx.CommitAsync();
    }
    //暂停1秒,然后继续处理。
    等待任务延迟(TimeSpan.FromSeconds(3),cancelServicePartitionReplica);
    }
    }
    

因此,可能我的语句(3)是错误的——有状态服务可能调用其内部存储,而没有人(服务客户机)从外部调用它并为确切的分区提供信息但是,上面的代码如何决定将其数据放入哪个分区?最重要的是,如何稍后通过服务客户端查询该数据,该客户端应提供准确的分区ID?

有状态服务“实例”实际上是副本。您可以为每个分区配置有多少副本(用于性能、扩展、高可用性和灾难恢复)。只有一个副本(主副本)进行写入。所有副本(辅助副本和主副本)都可用于读取。副本包含数据集的碎片。 分区1中的数据不与分区2共享

调用有状态服务的客户端需要自己决定要与哪个分区通信。服务只能在自己的分区中读/写(直接)

更多信息。

a)不是专家,但我认为分区(在本例中)涉及到如何在同一分区中的实例(技术上称为副本)之间共享数据(通过IReliableStateManager)。每个分区可以有两个副本,这样副本A_1(在节点1上)和副本A_2(在节点2上)可以彼此共享数据。但是A_1无法与B_1共享数据B)我认为您的问题中可能有太多问题:)
protected override async Task RunAsync(CancellationToken cancelServicePartitionReplica)
{
var myDictionary = await   this.StateManager.GetOrAddAsync<IReliableDictionary<string, int>> ("myDictionary");

var partition = base.ServicePartition.PartitionInfo.Id;
byte append = partition.ToByteArray()[0];

while (!cancelServicePartitionReplica.IsCancellationRequested)
{

// Create a transaction to perform operations on data within this partition's replica.
using (var tx = this.StateManager.CreateTransaction())
{
    var result = await myDictionary.TryGetValueAsync(tx, "A");

    await myDictionary.AddOrUpdateAsync(tx, "A", 0, (k, v) => v + append);
    ServiceEventSource.Current.ServiceMessage(this,
        $"Append {append}: {(result.HasValue ? result.Value : -1)}");
    await tx.CommitAsync();
}

// Pause for 1 second before continue processing.
    await Task.Delay(TimeSpan.FromSeconds(3),  cancelServicePartitionReplica);
    }
}