2016-06-12 48 views
1

我试图消化服务结构体系结构模式及其最佳实践。服务结构 - 是每个分区的有状态服务单实例

用例:

我定义有状态服务26个分区,并且在每个分区中,我存储与相同的第一字母的词。

  • 1)这是否意味着我实际上有26个有状态服务实例?
  • 2)当有状态服务之外,即在调用者中 - 我正在为我的服务结构客户端构造一个URI,指定我希望客户端运行的分区ID。这是否意味着,一旦我处于有状态服务(即服务客户端实例化并称为有状态服务)的环境中 - 我无法引用其他分区?
  • 3)难道说一个状态服务是工作单位,它需求知道操作哪个分区上,并不能做出了自己的决定?在这里我指的是哪里有状态服务的RunAsync方法里面,有底层可靠店电话例子很多,例如,代码采取from this post

    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); 
        } 
    } 
    

所以,也许我的发言3)是错误的 - 有状态的服务可能在没有人(服务客户端)的情况下调用其内部存储来将其称为externaly并为确切的分区提供信息。 但是,上面的代码如何决定将数据放入哪个分区?最重要的是,如何以后通过服务客户端查询数据,该服务客户端应该提供确切的分区ID?

+0

a)不是专家,但我认为分区(在这种情况下)涉及如何在同一分区中的实例(技术上称为副本)之间共享数据(通过IReliableStateManager)。每个分区可以有两个副本,因此副本A_1(在节点1上)和副本A_2(在节点2上)可以在彼此之间共享数据。但A_1无法与B_1分享数据b)我认为您的问题可能有太多问题:) –

回答

2

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

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

更多信息here

相关问题