我现在有一个问题要解决,似乎我在SF框架中找不到合适的解决方案。问题很简单,包括:
我有一个Int64RangePartition,它允许我通过以下方式查找服务的所有分区:
_fabricClient.QueryManager.GetPartitionListAsync(_globalStatsSvcUri)
这样可以正常工作,但与NamedPartitions方案不同,似乎无法在不提供Int密钥的情况下创建服务代理(使用远程处理)来使用服务。
IGlobalStatsSvc globalStatsSvc = ServiceProxy.Create(_globalStatsSvcUri,partitionKey);
我的具体情况是我希望能够扩展并行统计计算服务,但希望能够与配置文件ID保持连接。因此,我想选择Int64RangePartition方案。
但是当我需要查询系统的全局统计信息时,我需要并行调用所有分区,然后将Avg,Variance和Std与Chan'算法
为了做到这一点,我需要能够在不知道哪个Int键映射到分区的情况下创建代理。我只需要分区密钥ID。
可悲的是,SF似乎只允许在NamedPartition方案中执行后者而不是RangedPartition。
有没有人为这个特殊情况提供解决方案?选择NamedPartition方案可以工作,但在修改统计信息的情况下更复杂(至少需要确保随机分区名称在统计上是兼容的)。另一个解决方案是"手动"创建服务的代理,因为我应该能够使用我解析的分区ID构建URL。但这是更多的工作,并通过SF提供的强类型客户端。
将两个行为与RangedPartition方案混合起来要简单得多,因为我能够知道在编辑时要修改哪个分区,然后在需要进行聚合时在读取时查询所有分区。
答案 0 :(得分:0)
找到问题的解决方案,我仍然是SF Framework的新手,但是当查询服务的分区列表时,会给出有关特定分区的低和高键的信息
因此,只需要在通过代理调用服务之前传递这些ID。
足够简单:
var partitionInformation = partition.PartitionInformation as Int64RangePartitionInformation;
var partitionKey = new ServicePartitionKey(partitionInformation.LowKey);