我正在设计一个服务结构无状态服务,它需要每个实例的配置数据。我最初的想法是创建命名分区,并使用PartitionInfo
获取命名键,使用共享只读字典来加载每个实例的设置。问题是,现在在内部(从其他服务)访问此实例需要分区键。由于使用此方法的所有分区将在内部提供相同的数据,因此我连接到哪个分区并不重要(我希望它是随机的)。所以,这给了我很多可能的方法来解决这个问题:
- 使用随机访问分区(在我上面的尝试中)ServiceProxy.Create https://learn.microsoft.com/en-us/dotnet/api/microsoft.servicefabric.services.remoting.client.serviceproxy.create--1?view=servicefabricsvcsremoting-2.5.216#Microsoft_ServiceFabric_Services_Remoting_Client_ServiceProxy_Create__1_System_Uri_Microsoft_ServiceFabric_Services_Client_ServicePartitionKey_Microsoft_ServiceFabric_Services_Communication_Client_TargetReplicaSelector_System_String_.
以下不涉及分区的解决方案:
- 基于每个实例的配置。这个帖子 https://stackoverflow.com/a/36947126/4875631对于提出解决方案没有多大帮助。每个实例唯一的配置部分将是最理想的解决方案。
- 创建命名实例,并使用名称作为用户名(基本上将字符串附加到非分区实例)
- 通过索引获取实例,并使用索引针对共享只读字典来获取用户名。
- 以某种方式使用InitializationData(参见这个帖子 https://feedback.azure.com/forums/293901-service-fabric/suggestions/17287526-allow-service-initializationdata-to-be-set-in-appl)获取用户名字符串(如果 InitializationData 每个实例可以是唯一的)。
以上所有内容都将解决我的问题。这些方法中的任何一个都可能吗?
编辑:我尝试创建的服务示例:
假设我们有一个 stackoverflow 问题服务(简称 SOQS)。在本示例中,假设一个用户可以在任何时候连接到 stackoverflow 的 websocket。 SOQS 内部方法(发布到我的服务结构)有一种方法:GetQuestions()
。每个 SOQS 都需要使用唯一的用户名/密码连接到 stackoverflow,并且当新问题通过 websocket 推送时,它们会添加到内部问题列表中。 SOQS的GetQuestions()
方法(从我的服务结构内部调用),然后会给出相同的问题列表。然后,我可以通过添加更多实例(只要我有更多用户名/密码)来实现负载平衡,然后可以分配结构内部的负载。我可以打电话ServiceProxy.Create<SOQS>()
连接到随机实例以获取我的问题列表。
听起来您正在寻找一种具有多个参与者的服务类型,每个参与者都有自己的配置。它们不会是具有独特配置的同一服务的多个副本,而是作为单例的服务的一个实例(当然还有副本),以及每个实例的单独参与者。
例如,您可以让用户服务(猜猜它是什么,因为您提到了用户名字符串)从某些外部存储机制读取用户名和长整型列表,例如每个用于内部跟踪的实例 ID。然后,该服务将为每个参与者创建一个具有自己的配置信息的参与者。那么用户服务将成为与各个参与者之间发送消息的路由器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)