谁应该拥有 Service Fabric 有状态服务中的服务解析逻辑?
Who should own the logic for service resolution in Service Fabric Stateful Services?
我正在使用 Service Fabric 有状态服务来存储系统中用户的状态。我的分区策略是使用规范化的国际字符串格式 phone 数字来寻址命名服务实例,并使用 phone 数字的散列来解析该服务的分区。例如:fabric:/myapp/users/1/718(国际 phone 号码为 +1718xxxxxxx)这允许我根据他们的国家(并进一步在 US/Canada 市场按区号定位服务) .
我的问题有点理论性,但也很实际。 谁拥有服务解析的逻辑?一个简单的方法是只要求依赖此服务的任何人都知道它是如何分区的,但对我来说这感觉像是一个漏洞百出的抽象。此外,我想为与 phone 数字概念分离的用户分配一个 Id 。
- 我原来的做法是把Id做成一个byte[],里面包含了服务名,分区id,用户本地id。我放弃了这个想法,因为 ID 的大小非常大,并且会随着时间的推移而增加。 (这是有问题的,因为 Reliable Dictionary 中的所有键都需要放入内存中,我不想在 id 上占用大量内存)此外,它仍然带有每个使用 id 的人都知道如何解释 id 的包袱并相应地使用它。
- 我的下一个想法是为使用该服务的任何人提供一个客户端库。这也有消费服务的二进制依赖性的缺点。如果我以后要改变策略,我必须跳过一堆箍来处理失败才能正确解析实体。
- 我能想到的最后一个选择是在处理所有服务的解析的有状态服务前面有一个无状态代理。从设计的角度来看,这是最吸引人的,但也涉及管理,构建另一个服务来解决问题。不反对,但这是一个额外的考虑。如果我走这条路,我应该将此服务作为一个单独的服务结构应用程序,还是建议将所有内容都作为一个应用程序。
我也愿意接受以这种方式划分用户是个坏主意的想法。但是,出于多种原因,建议使用 phone。
如果可能的话,我建议不要让您的服务使用者知道任何关于分区的知识。通过这种方式,您可以在不更改消费者端任何内容的情况下更改服务内部结构。
这导致选项 3,结合内置的反向代理服务。
在该额外服务中,您可以查找经过身份验证的用户并使用其位置来确定服务分区。
如果你把它变成一个新的应用程序,它可以成为多个限界上下文的入口点(/代理)
我正在使用 Service Fabric 有状态服务来存储系统中用户的状态。我的分区策略是使用规范化的国际字符串格式 phone 数字来寻址命名服务实例,并使用 phone 数字的散列来解析该服务的分区。例如:fabric:/myapp/users/1/718(国际 phone 号码为 +1718xxxxxxx)这允许我根据他们的国家(并进一步在 US/Canada 市场按区号定位服务) .
我的问题有点理论性,但也很实际。 谁拥有服务解析的逻辑?一个简单的方法是只要求依赖此服务的任何人都知道它是如何分区的,但对我来说这感觉像是一个漏洞百出的抽象。此外,我想为与 phone 数字概念分离的用户分配一个 Id 。
- 我原来的做法是把Id做成一个byte[],里面包含了服务名,分区id,用户本地id。我放弃了这个想法,因为 ID 的大小非常大,并且会随着时间的推移而增加。 (这是有问题的,因为 Reliable Dictionary 中的所有键都需要放入内存中,我不想在 id 上占用大量内存)此外,它仍然带有每个使用 id 的人都知道如何解释 id 的包袱并相应地使用它。
- 我的下一个想法是为使用该服务的任何人提供一个客户端库。这也有消费服务的二进制依赖性的缺点。如果我以后要改变策略,我必须跳过一堆箍来处理失败才能正确解析实体。
- 我能想到的最后一个选择是在处理所有服务的解析的有状态服务前面有一个无状态代理。从设计的角度来看,这是最吸引人的,但也涉及管理,构建另一个服务来解决问题。不反对,但这是一个额外的考虑。如果我走这条路,我应该将此服务作为一个单独的服务结构应用程序,还是建议将所有内容都作为一个应用程序。
我也愿意接受以这种方式划分用户是个坏主意的想法。但是,出于多种原因,建议使用 phone。
如果可能的话,我建议不要让您的服务使用者知道任何关于分区的知识。通过这种方式,您可以在不更改消费者端任何内容的情况下更改服务内部结构。
这导致选项 3,结合内置的反向代理服务。 在该额外服务中,您可以查找经过身份验证的用户并使用其位置来确定服务分区。
如果你把它变成一个新的应用程序,它可以成为多个限界上下文的入口点(/代理)