将元数据发布到 Service Fabric
Publishing metadata to Service Fabric
因此,我有一个正在研究的想法,其中一些节点上的服务需要根据它们可能发布的元数据在 运行 时间动态地发现其他服务。我正在尝试找出解决此问题的最佳方法。
某些元数据将在 运行 时从本地计算机中发现,但随后必须将其发布到 Fabric,以便其他服务可以对其做出决策。
我在 ServiceManifests 中看到了扩展内容。这是一个好的开始。但似乎您无法在 运行 时更改或添加扩展名。那就太好了!
想象一下我的用例。我在 Fabric 上有很多机器,上面部署了很多服务。我要宣传的是给定机器可能支持的音频编解码器。一些节点有 DirectShow。因此,他们会发布可用的本地编解码器。有些机器 运行 宁 32 位服务,并发布他们拥有的 32 位 DirectShow 编解码器(这实际上是我需要的,因为我有一些专有的 ACM 编解码器,只有 运行 32 位)。有些机器是 Linux 台机器,并希望提供其 GStreamer 编解码器。
这些中的每一个都需要发布关于它们可以做什么的相关元数据,以便其他服务可以从该元数据中串起一个关于如何处理给定媒体文件的图表。
然后每个人都会很好地报告它们的运行状况和负载信息,因此结构可以确定如何扩展。
这些服务中的每一个都将支持相同的 IService 接口,但每个服务仅供根据已发布的元数据决定使用它们的客户端使用。
在Service Fabric中,思考这类问题的方式是从服务的角度,而不是机器的角度。也就是说,集群中每个service支持什么,而不是每个machine支持什么。通过这种方式,您可以使用很多 Service Fabric 的 built-in 服务发现和查询内容,因为平台提供的抽象实际上是关于服务而不是关于机器。
实现此目的的一种方法是使用放置约束和服务实例来表示集群作为一个整体支持的每个编解码器。这意味着您将拥有一个表示编解码器的服务实例,该编解码器仅在支持该编解码器的机器上运行。这是一个简化的例子:
假设我有一个名为 "AudioProcessor" 的服务类型,它使用任何可用的编解码器进行一些音频处理。
让我在集群中有 5 个节点,其中每个节点都支持编解码器 A、B、C、D 和 E 之一。我将使用与编解码器对应的节点 属性 标记每个节点它支持(节点 属性 可以是我想要的任何字符串)。请注意,这是假设我,集群的所有者,知道每台机器支持的编解码器。
现在我可以创建 5 个 AudioProcessor 服务类型实例,每个编解码器一个。因为每个实例都有一个 URI 格式的唯一服务名称,所以我可以创建一个层次结构,其中包含编解码器名称,以便通过 Service Fabric 的 built-in 命名服务和查询工具进行发现,例如 "fabric:/AudioApp/Processor/A" for codec A. 然后我为每个实例使用一个放置约束,该约束对应于我在每个节点上设置的节点属性,以确保服务实例表示的编解码器在节点上可用。
这是部署完所有内容后的样子:
节点 1 - 编解码器:一个实例:fabric/AudioApp/Processor/A
节点 2 - 编解码器:B 实例:fabric/AudioApp/Processor/B
节点 3 - 编解码器:C 实例:fabric/AudioApp/Processor/C
节点 4 - 编解码器:D 实例:fabric/AudioApp/Processor/D
节点 5 - 编解码器:E 实例:fabric/AudioApp/Processor/E
所以现在我可以做如下事情:
- 通过查询 AudioProcessor 服务实例列表并检查它们的名称(类似于获取 HTTP API 中的 URI 列表)来查找集群支持的所有编解码器。
- 通过解析fabric向支持编解码器B的服务发送处理请求:/AudioApp/AudioProcessor/B
- 通过添加更多支持编解码器 C 的机器来扩展编解码器 C 的处理能力 - Service Fabric 将自动在新节点上放置一个新的 "C" AudioProcessor 实例。
- 添加支持多种编解码器的机器。在其上使用多个节点属性,Service Fabric 将自动在其上放置正确的服务实例。
消费者现在对这个应用程序的看法是 "is there a service that support codec E?" 或 "I need to talk to service A, C, and D to process this file because they have the codecs I need."
因此,我有一个正在研究的想法,其中一些节点上的服务需要根据它们可能发布的元数据在 运行 时间动态地发现其他服务。我正在尝试找出解决此问题的最佳方法。
某些元数据将在 运行 时从本地计算机中发现,但随后必须将其发布到 Fabric,以便其他服务可以对其做出决策。
我在 ServiceManifests 中看到了扩展内容。这是一个好的开始。但似乎您无法在 运行 时更改或添加扩展名。那就太好了!
想象一下我的用例。我在 Fabric 上有很多机器,上面部署了很多服务。我要宣传的是给定机器可能支持的音频编解码器。一些节点有 DirectShow。因此,他们会发布可用的本地编解码器。有些机器 运行 宁 32 位服务,并发布他们拥有的 32 位 DirectShow 编解码器(这实际上是我需要的,因为我有一些专有的 ACM 编解码器,只有 运行 32 位)。有些机器是 Linux 台机器,并希望提供其 GStreamer 编解码器。
这些中的每一个都需要发布关于它们可以做什么的相关元数据,以便其他服务可以从该元数据中串起一个关于如何处理给定媒体文件的图表。
然后每个人都会很好地报告它们的运行状况和负载信息,因此结构可以确定如何扩展。
这些服务中的每一个都将支持相同的 IService 接口,但每个服务仅供根据已发布的元数据决定使用它们的客户端使用。
在Service Fabric中,思考这类问题的方式是从服务的角度,而不是机器的角度。也就是说,集群中每个service支持什么,而不是每个machine支持什么。通过这种方式,您可以使用很多 Service Fabric 的 built-in 服务发现和查询内容,因为平台提供的抽象实际上是关于服务而不是关于机器。
实现此目的的一种方法是使用放置约束和服务实例来表示集群作为一个整体支持的每个编解码器。这意味着您将拥有一个表示编解码器的服务实例,该编解码器仅在支持该编解码器的机器上运行。这是一个简化的例子:
假设我有一个名为 "AudioProcessor" 的服务类型,它使用任何可用的编解码器进行一些音频处理。
让我在集群中有 5 个节点,其中每个节点都支持编解码器 A、B、C、D 和 E 之一。我将使用与编解码器对应的节点 属性 标记每个节点它支持(节点 属性 可以是我想要的任何字符串)。请注意,这是假设我,集群的所有者,知道每台机器支持的编解码器。
现在我可以创建 5 个 AudioProcessor 服务类型实例,每个编解码器一个。因为每个实例都有一个 URI 格式的唯一服务名称,所以我可以创建一个层次结构,其中包含编解码器名称,以便通过 Service Fabric 的 built-in 命名服务和查询工具进行发现,例如 "fabric:/AudioApp/Processor/A" for codec A. 然后我为每个实例使用一个放置约束,该约束对应于我在每个节点上设置的节点属性,以确保服务实例表示的编解码器在节点上可用。
这是部署完所有内容后的样子:
节点 1 - 编解码器:一个实例:fabric/AudioApp/Processor/A
节点 2 - 编解码器:B 实例:fabric/AudioApp/Processor/B
节点 3 - 编解码器:C 实例:fabric/AudioApp/Processor/C
节点 4 - 编解码器:D 实例:fabric/AudioApp/Processor/D
节点 5 - 编解码器:E 实例:fabric/AudioApp/Processor/E
所以现在我可以做如下事情:
- 通过查询 AudioProcessor 服务实例列表并检查它们的名称(类似于获取 HTTP API 中的 URI 列表)来查找集群支持的所有编解码器。
- 通过解析fabric向支持编解码器B的服务发送处理请求:/AudioApp/AudioProcessor/B
- 通过添加更多支持编解码器 C 的机器来扩展编解码器 C 的处理能力 - Service Fabric 将自动在新节点上放置一个新的 "C" AudioProcessor 实例。
- 添加支持多种编解码器的机器。在其上使用多个节点属性,Service Fabric 将自动在其上放置正确的服务实例。
消费者现在对这个应用程序的看法是 "is there a service that support codec E?" 或 "I need to talk to service A, C, and D to process this file because they have the codecs I need."