azure-service-fabric - 如何访问无状态服务的特定副本

标签 azure-service-fabric

我在 Service Fabric 中创建了一个无状态服务。它有一个 SingletonPartition,但有多个实例(在我的例子中 InstanceCount 是 -1)。

我想与此服务的特定副本进行通信。要查找我使用的所有副本:

var fabricClient = new FabricClient();
var serviceUri = new Uri(SERVICENAME);

Partition partition = (await fabricClient.QueryManager.GetPartitionListAsync(serviceUri)).First();
foreach(Replica replica in await fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id))
{
  // communicate with this replica, but how to construct the proxy?
  //var eventHandlerServiceClient = ServiceProxy.Create<IService>(new Uri(replica.ReplicaAddress));
}

问题是 ServiceProxy 没有过载来为副本创建一个。是否有另一种方式与特定副本进行通信?

编辑

我们正在构建的场景如下。我们有不同的带有计数器信息的移动部分:1 个命名的分区有状态服务(有几百个分区)、1 个 int64 分区有状态服务和 1 个带状态的参与者。为了聚合计数器信息,我们需要联系所有服务分区和参与者实例。

我们当然可以逆转它,让每个人都将计数发送到单个(分区)服务。但这会在正常流中添加网络调用(从而增加开销)。

相反,我们提出了以下建议。提到的服务和参与者被组合成一个可执行文件和一个服务 list 。因此,它们处于相同的过程中。我们将实例计数为 -1 的无状态服务添加到上述服务和参与者中。所有计数器信息都存储在一个静态变量中。无状态服务可以读取此计数器信息。
现在,我们只需要接触无状态服务(它有节点数量的上限)。

最佳答案

只是为了先了解一些术语,“副本”仅适用于有状态服务,其中您为服务的每个分区拥有唯一的副本集,并在它们之间复制状态以实现 HA。无状态服务只有实例,所有实例都是相同的。

现在回答您的实际问题:ServiceProxy 没有连接到已部署无状态服务的特定实例的选项。您有以下选择:

  • 主副本:连接到有状态服务分区的主副本。
  • 随机实例:连接到无状态服务的随机实例。
  • 随机副本:连接到有状态服务分区的随机副本 - 无论其角色如何。
  • 随机辅助副本 - 连接到有状态服务分区的随机辅助副本。

  • 例如。:
    ServiceProxy.Create<IMyService>(serviceUri, partitionKey, TargetReplicaSelector.RandomInstance)
    

    那么为什么没有连接到特定无状态服务实例的选项呢?

    好吧,我会反过来问这个问题,你为什么要连接到特定的无状态服务实例?根据定义,每个无状态实例应该是相同的。如果你在那里保持一些状态——比如用户 session ——那么现在你是有状态的并且应该使用有状态的服务。

    您可能会考虑智能地决定连接到哪个实例以进行负载平衡,但同样,由于它是无状态的,只要请求均匀分布,任何实例都不应该比其他任何实例做更多的工作。为此,服务代理具有随机分发选项。

    考虑到这一点,如果您仍然有理由寻找特定的无状态服务实例,您始终可以使用不同的通信堆栈(如 HTTP)并执行您想要的任何操作。

    关于azure-service-fabric - 如何访问无状态服务的特定副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37480872/

    相关文章:

    azure - 在非 Azure 云上运行 Service Fabric

    azure-devops - 生成依赖片段文件任务失败

    java - 在 Windows 集群上部署 Java Service Fabric 应用程序失败 - 无 jFabricRuntime

    azure - 将 Azure Web 应用程序连接到 Service Fabric

    azure-service-fabric - 部署的无状态服务数量大于集群节点数量

    azure - 无法找到 Service Fabric 应用程序 Visual Studio 2017 中的新项目选项

    azure - 找不到方法 : 'IntPtr System. Fabric.SecurityCredentialExtension.ToNative

    azure - 如何向 Azure 服务应用程序上运行的 docker 添加其他选项

    azure - Service Fabric (ASP.NET Core) 中的应用程序设置

    azure - AADSTS50001 : The application named X was not found in the tenant named Y while authenticating Postman in Azure AD