【发布时间】:2016-09-25 15:20:55
【问题描述】:
我在 Service Fabric 中创建了一个无状态服务。它有一个 SingletonPartition,但有多个实例(在我的例子中,InstanceCount 是 -1)。
我想与此服务的特定副本通信。要查找我使用的所有副本:
var fabricClient = new FabricClient();
var serviceUri = new Uri(SERVICENAME);
Partition partition = (await fabricClient.QueryManager.GetPartitionListAsync(serviceUri)).First();
foreach(Replica replica in await fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id))
{
// communicate with this replica, but how to construct the proxy?
//var eventHandlerServiceClient = ServiceProxy.Create<IService>(new Uri(replica.ReplicaAddress));
}
问题是 ServiceProxy 没有过载来为副本创建一个。是否有其他方式与特定副本进行通信?
编辑
我们正在构建的场景如下。我们有不同的带有计数器信息的移动部分:1 个命名的分区状态服务(有几百个分区)、1 个 int64 分区状态服务和 1 个具有状态的参与者。为了汇总计数器信息,我们需要访问所有服务分区和参与者实例。
我们当然可以逆转它,让每个人都将计数发送到单个(分区)服务。但这会在正常流程中添加网络调用(因此会产生开销)。
相反,我们提出了以下建议。提到的服务和参与者被组合成一个可执行文件和一个服务清单。因此,它们处于相同的过程中。我们将 instancecount -1 的无状态服务添加到提到的服务和参与者中。所有计数器信息都存储在一个静态变量中。无状态服务可以读取此计数器信息。 现在,我们只需要接触到无状态服务(有节点数上限)。
【问题讨论】: