我正在尝试消化Service Fabric架构模式及其最佳实践。
用例:
我定义了一个有26个分区的有状态服务,并且在每个分区中我存储的是具有相同第一个字母的单词。
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)是错误的 - 有状态服务可能会调用其内部存储而没有某人(服务客户端)将其称为外部并为精确分区提供信息。 但是,上面的代码如何决定将数据放入哪个分区?最重要的是,如何通过服务客户端查询该数据应该提供一个确切的分区ID?
答案 0 :(得分:3)
有状态服务&#39;实例&#39;实际上是复制品。您可以为每个分区配置多少副本(用于性能,扩展,高可用性和灾难恢复)。只有一个副本(主要)写入。所有复制品(次要和初级)可用于读取。副本包含数据集的分片。 分区1中的数据不与分区2共享。
调用有状态服务的客户端需要自己决定要与哪个分区通信。服务只能在自己的分区中直接读/写。
更多信息here。