【问题标题】:Why does my Service Fabric Inter application service RPC take 2 minutes?为什么我的 Service Fabric 间应用程序服务 RPC 需要 2 分钟?
【发布时间】:2019-02-08 23:04:41
【问题描述】:

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

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

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

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

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

代码:

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!");

【问题讨论】:

    标签: azure azure-service-fabric


    【解决方案1】:

    如果不进行网络级别的跟踪,将有点难以猜测问题。

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

    即:

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

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

    • 将两者放在同一节点上并测试通信
    • 检查防火墙规则
    • 杀毒
    • 检查问题是否不在接收呼叫的端点上

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 2020-03-30
      • 1970-01-01
      • 2018-10-17
      • 2011-05-08
      • 2020-01-29
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多