为什么我的Service Fabric跨应用程序服务RPC需要2分钟?

时间:2019-02-07 22:51:47

标签: azure azure-service-fabric

我的集群中有两个应用程序(例如app1和app2)。这两个应用程序都将无状态服务作为连接到内部有状态服务的网关。我正在尝试在这两个应用程序之间进行调用。我已经完成了从app1到app2的反向代理服务通信。

从app1到app2的网址:http://localhost:19081/app2/stateless_app2_service/api/values

以上方案在本地群集中运行良好。但是,当部署到Azure群集上时,需要2分钟才能到达app2。

有人可以帮助我指出导致此延迟的我在做错什么吗?这与任何群集配置有关吗?创建群集时,我已经在ARM中为反向代理启用了端口19081。

下面是我的事件记录器,用于通过Azure群集上的服务进行的呼叫。 2分钟后接听电话。在涉及Azure群集中的应用程序间通信的每个调用中都会发生这种情况。

enter image description here

代码:

Stateless_app1_service

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
        {
            return new ServiceInstanceListener[]
            {
                new ServiceInstanceListener(serviceContext =>
                    new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
                    {
                        ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

                        return new WebHostBuilder()
                                    .UseKestrel()
                                    .ConfigureAppConfiguration((builderContext, config) =>
                                    {
                                       config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
                                    })
                                    .ConfigureServices(
                                        services => services
                                            .AddSingleton<HttpClient>(new HttpClient())
                                            .AddSingleton<StatelessServiceContext>(serviceContext)
                                            .AddSingleton<ILogger>(GenerateLogger()))                                        
                                    .UseContentRoot(Directory.GetCurrentDirectory())                                    
                                    .UseStartup<Startup>()
                                    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                                    .UseUrls(url)
                                    .Build();
                    }))
            };
        }

拨打电话:

_logger.TrackEvent("SF - Call made to other application");                
var response2 = await _httpClient.GetAsync($"{_reverseProxy}/{_appNameConnectors}/{_apiNameConnectors}/api/Values");
_logger.TrackEvent("SF- RPC - Call successfully finished!");

1 个答案:

答案 0 :(得分:0)

如果没有在网络级别上进行跟踪,将很难猜出该问题。

我建议您使用http://service1.application1的服务dns名称(如果启用)来测试与服务的直接连接

即:

Uri uri = new Uri("http://service1.application1:8080/api/values");
HttpClient client = new HttpClient();
var response = await client.GetAsync(uri);

如果这可以解决问题,我们可以确定与代理相关的问题,如果不能解决,则需要调查网络通信,或者:

  • 同时将它们放在相同的节点上并测试通信
  • 检查防火墙规则
  • 防病毒
  • 检查问题是否不在接收呼叫的端点上