每个服务结构实例的配置

时间:2017-05-17 11:09:09

标签: c# azure azure-service-fabric

我正在设计一种服务结构无状态服务,它需要每个实例的配置数据。我最初的想法是创建命名分区,并使用PartitionInfo获取命名密钥,使用共享只读字典来加载每个实例的设置。问题是,现在在内部访问此实例(来自其他服务)需要一个分区键。由于使用此方法的所有分区都将在内部提供相同的数据,因此我连接到哪个分区并不重要(我希望它是随机的)。所以,这给了我很多方法来解决这个问题:

以下不涉及分区的解决方案:

  • 基于每个实例的配置。 This post在提出解决方案方面没有多大帮助。每个实例独有的配置部分将是最理想的解决方案。
  • 创建命名实例,并使用该名称作为用户名(基本上将字符串附加到非分区实例)
  • 按索引获取实例,并使用索引对共享只读字典获取用户名。
  • 以某种方式使用InitializationData(参见this post)获取用户名字符串(如果每个实例的InitializationData可以是唯一的)。

以上所有内容都将解决我的问题。这些方法有可能吗?

编辑:我正在尝试创建的服务示例:

假设我们有一个stackoverflow问题服务(简称SOQS)。为了这个例子,假设一个用户可以在任何时候连接到stackoverflow的websocket。 SOQS内部方法(发布到我的服务结构)有一种方法:GetQuestions()。每个SOQS都需要使用唯一的用户名/密码连接到stackoverflow,并且当通过websocket推送新问题时,它们会添加到内部问题列表中。 SOQS的GetQuestions()方法(从我的服务结构内部调用)将提供相同的问题列表。然后,我可以通过添加更多实例来加载平衡(只要我有更多的用户名/密码),然后可以分发我的结构内部的负载。我可以调用ServiceProxy.Create<SOQS>()连接到随机实例以获取我的问题列表。

2 个答案:

答案 0 :(得分:2)

听起来你正在寻找拥有多个actor的服务类型,每个actor都有自己的配置。它们不会是具有唯一配置的同一服务的多个副本,它将是一个(当然是副本)服务实例作为单例,以及每个实例的各个actor。

作为一个例子,您可以拥有用户服务(猜测自提及用户名字符串后的内容)从某些外部存储机制读取的用户名列表以及每个用于内部跟踪的实例ID的长度。然后,该服务将为每个创建一个actor,并具有自己的配置信息。然后,用户服务将成为与各个参与者之间进行消息传递的路由器。

答案 1 :(得分:2)

我并不完全确定这是您正在寻找的内容,但另一种方法可能是创建一个额外的配置服务来为每个实例提供唯一的配置。在启动无状态服务时,您只需请求一个随机(或非随机)配置对象(如json字符串),并在初始化期间引导服务。这样,您就不必乱用分区,因为每个无状态实例都会触发它自己的Startup.cs(或等效的)。