【问题标题】:How to get service fabric nodes that run my stateless service in c#?如何获取在 C# 中运行我的无状态服务的服务结构节点?
【发布时间】:2019-06-26 16:05:27
【问题描述】:

在 c# 中,我想获取运行无状态服务的服务结构节点信息列表。这将在测试中很有用。我知道如何使用 FabricClient 类和 ActorServiceProxy 类为有状态服务执行此操作,但是对于无状态服务,我找不到方法。你有什么想法吗?

谢谢,

【问题讨论】:

    标签: azure-service-fabric service-fabric-stateless


    【解决方案1】:

    您仍然可以使用 FabricClient 获取此信息。使用 QueryManager 来检查您需要的信息

    这是我用来快速查询最新版本的 TenantApp 服务的一些快速代码,然后我检查它们是否都在正常运行或已正确升级。

    var currentAppTypes = await fabricClient.QueryManager.GetApplicationTypeListAsync();
    var tenantAppTypes = currentAppTypes.Where(x => x.ApplicationTypeName.Equals("TenantAppsType"));
    var latestTenantAppType = currentAppTypes.Where(x => x.ApplicationTypeName.Equals("TenantAppsType"))?
    .OrderByDescending(x =>
    {
        var versions = x.ApplicationTypeVersion.Split('.');
        if (versions.Length == 3)
        {
             return (int.Parse(versions[0]) * 1000000) +
                    (int.Parse(versions[1]) * 1000) +
                     int.Parse(versions[2]);
         }
         return 0;
    })?.FirstOrDefault();
    if (latestTenantAppType != null)
    {
           var currentSvcTypes = await fabricClient.QueryManager.GetServiceTypeListAsync(latestTenantAppType.ApplicationTypeName, latestTenantAppType.ApplicationTypeVersion);
          // etc
    }
    

    或者,如果您只想让所有应用程序运行

    var currentApps = await fabricClient.QueryManager.GetApplicationListAsync();
    

    获得服务信息后,您可以检查其所在的节点,也可以直接自己检查节点

    var currentNodes = fabricClient.QueryManager.GetNodeListAsync();
    var nodeInfo = await fabricClient.QueryManager.GetNodeLoadInformationAsync("nodeName");
    

    希望对你有帮助

    【讨论】:

    • 彼得,感谢您的回复。假设我的无状态 web api 规模数是 2。集群总共有 5 个节点。如何找出运行我的 web api 的两个节点?我查看了您发布的代码,但找不到提供此信息的位置。
    【解决方案2】:

    对于仍在尝试执行此操作的任何人,我有一个计时器要求,要求我计算出有多少节点正在运行我的应用程序。这是我使用的大致代码:

    string currentNodeName = ServiceContext.NodeContext.NodeName;
    var fabricClient = new FabricClient();
    var nodeList = (await fabricClient.QueryManager.GetNodeListAsync()).ToList();
    
    var serviceName = ServiceContext.ServiceName.LocalPath.Split('/')[1];
    var nodesRunningApplication = new List<Node>();
    foreach (var node in nodeList)
    {
        var nodeApplicationList = await fabricClient.QueryManager.GetDeployedApplicationListAsync(node.NodeName);
        var nodeApplication = nodeApplicationList.FirstOrDefault(p => 
            p.ApplicationName.LocalPath.Split('/')[1] == serviceName);
    
        if (nodeApplication != null)
        {
            nodesRunningApplication.Add(node);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 1970-01-01
      • 2023-03-03
      • 2016-08-04
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多