Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure service fabric 服务结构ServicePartitionResolver.ResolveAsync似乎忽略负载平衡器_Azure Service Fabric_Service Fabric Stateless - Fatal编程技术网

Azure service fabric 服务结构ServicePartitionResolver.ResolveAsync似乎忽略负载平衡器

Azure service fabric 服务结构ServicePartitionResolver.ResolveAsync似乎忽略负载平衡器,azure-service-fabric,service-fabric-stateless,Azure Service Fabric,Service Fabric Stateless,我有一个无状态服务,它充当进入我的5节点集群的所有请求的网关 此服务将请求转发到群集中的服务上 protected virtual async Task<ResolvedServicePartition> FindPartitionAsync(long key = 0) { var resolver = ServicePartitionResolver.GetDefault(); var result = await resolver.

我有一个无状态服务,它充当进入我的5节点集群的所有请求的网关

此服务将请求转发到群集中的服务上

    protected virtual async Task<ResolvedServicePartition> FindPartitionAsync(long key = 0)
    {
        var resolver = ServicePartitionResolver.GetDefault();
        var result = await resolver.ResolveAsync(FullServiceName, ServicePartitionKey.Singleton, CancellationToken.None).ConfigureAwait(false);
        return result;
    }

    private async Task<string> EstablishProxyUrlAsync(string method, long key = 0)
    {
        var partition = await FindPartitionAsync(key).ConfigureAwait(false);

        if (key != 0)
        {
            Log.Information($"{this.GetType().Name} method {method} request resolved by partition {partition.Info.Id}");
        }

        var endpoints = JObject.Parse(partition.GetEndpoint().Address)["Endpoints"];
        var address = endpoints[""].ToString().TrimEnd('/');

        var proxyUrl = $"{address}/api/{Area}/{method}";

        return proxyUrl;
    }
受保护的虚拟异步任务FindPartitionAsync(长键=0)
{
var resolver=ServicePartitionResolver.GetDefault();
var result=await resolver.ResolveAsync(FullServiceName、ServicePartitionKey.Singleton、CancellationToken.None);
返回结果;
}
专用异步任务EstablishProxyUrlAsync(字符串方法,长键=0)
{
var partition=await FindPartitionAsync(key).ConfigureAwait(false);
如果(键!=0)
{
Log.Information($“{this.GetType().Name}方法{method}请求由分区{partition.Info.Id}解析”);
}
var endpoints=JObject.Parse(partition.GetEndpoint().Address)[“endpoints”];
var address=endpoints[“”].ToString().TrimEnd('/');
var proxyUrl=$“{address}/api/{Area}/{method}”;
返回代理URL;
}
我怀疑,如果集群的所有5个节点上都有一个service-TestService,那么上面的代码会忽略负载平衡器,因此请求只会转到接收请求的节点上的实例

有办法解决这个问题吗

那么我需要实现自己的负载平衡器吗?所有来自外部的呼叫都会进入网关,因为这似乎是推荐的方式,即单点进入。然而,由于没有负载平衡器来选择最佳节点,这一概念现在似乎会减慢速度,并在特定节点上增加负载。例如,如果我有一个网关方法GetCars,它在跨越所有5个节点的无状态服务上调用GetCars,那么我需要一种对其中一个节点进行负载平衡的方法,而不是将所有请求都转到本地实例


Paul

我希望解析的端点地址包含承载TestService主副本的节点的内部IP地址及其侦听器使用的端口

  • 对于有状态服务,它只能是一个单一端点

  • 对于单例服务,您将从
    ServicePartitionResolver
    获得缓存结果

您可以使用
resolver.ResolveAsync()
强制刷新,该文件的重载采用了早期的
ResolvedServicePartition

此外,由于内部调用不是通过internet进行的,因此调用将不会通过(Azure)负载平衡器


添加更多信息:

您可能会在所有节点上运行网关。如果没有,一定要这样做。由于每个网关都有自己的解析程序,可以解析为“随机”实例,因此您应该看到负载将自动分布在下游服务中

请注意,它可以帮助您解决此问题,而无需构建可靠的反向代理


更多信息和

对不起,我错过了。添加了一些额外信息。请查看对问题的更改添加了更多信息