Azure 服务结构有状态服务分区-良好分布

Azure 服务结构有状态服务分区-良好分布,azure,azure-service-fabric,Azure,Azure Service Fabric,假设我们希望有一个按点范围划分的有状态服务, 目标是按点对每个分区进行排序(通常,我们希望在分区之间划分排序任务)。我们希望用户在分区之间分布良好。 理想的做法是在用户点改变时改变每个分区的范围。但是这是不可能的,因为我们不能动态地改变分区的范围 一个想法是使用一个单一的有状态服务来管理点的范围,并使用映射告诉其他服务应该为特定点请求哪个分区。但是这可能意味着对这个新服务的大量访问,这可能会使服务过载 还有更好的主意吗 编辑1: 目标1:通过排序块(分区)对排名进行排序,这将由另一个服务聚合 目

假设我们希望有一个按点范围划分的有状态服务, 目标是按点对每个分区进行排序(通常,我们希望在分区之间划分排序任务)。我们希望用户在分区之间分布良好。 理想的做法是在用户点改变时改变每个分区的范围。但是这是不可能的,因为我们不能动态地改变分区的范围

一个想法是使用一个单一的有状态服务来管理点的范围,并使用映射告诉其他服务应该为特定点请求哪个分区。但是这可能意味着对这个新服务的大量访问,这可能会使服务过载

还有更好的主意吗

编辑1:

目标1:通过排序块(分区)对排名进行排序,这将由另一个服务聚合


目标2:为给定数量的积分提供一个临时位置。

我建议您按用户ID划分服务。例如,采用userid的modulo partitioncount来确定分区索引。 这样,用户总是可以在一个可预测的分区中找到,并且您的用户分布良好(前提是您的用户比分区多)


您可以使用将更改的分数发布到其他(无状态)服务,以保存当前高分的视图。

这与游戏中赢得的分数类似吗?你想在一个分区中得到最高点吗?我不确定这是否有效,因为最高点的用户也可能是最高的用户,所以将它们组合在一起似乎会在负载方面产生反作用balancing@EricLizotte是的,这就像在一场比赛中赢得分数一样。高分不是直接从这项服务获得的。完整的评分表(不仅是排名靠前的用户)将使用此分区服务进行计算,但以另一种方式提供。分区服务将仅在以下情况下被访问:(1)保存更新的用户点数;(2)获取特定点数的临时位置。我知道您现在得到的是什么,您希望分区按分数范围排列,以便更容易查询。更合理的做法是将分数持久化到一个sql表中,该表将用户id+分数作为两个索引的唯一列,并让服务器查询+更新该表。分区的主要用途是负载分布和扩展,而不是分组。我不认为分区基于分数有任何架构上的好处。尝试按分数划分实际上会降低性能,因为用户将永远从一个分区移动到另一个分区。另一种方法是,如果您决定这样做,则预先确定分区的数量,而不是按实际分数,而是按最大分数的百分比。因此,如果有10个分区,则最高得分将达到91%,90%将达到81,等等。随着分区的变化,将用户移动到另一个分区的计算成本将很高。否则,您只能将您认为合理的分数分组,使您的初始设置具有足够宽的分区带,并使分数更新通过另一个服务,该服务将添加下一个更高的分数组作为新分区。我仍然认为这是一种反分区模式。我只是用最终目标更新了这个问题。按用户ID对服务进行分区不适合我的解决方案。