.net核心api和nginx作为反向代理的性能问题

问题描述

说明: 我们使用Nginx作为反向代理,它将负载分配给使用HotChocolate(.net core 3.1)运行Graphql接口的多个后端服务器。然后,Graphql接口会触发一个ElasticSearch调用(使用官方的nesT库)。

问题: 我们使用4个后端服务器和一个Nginx反向代理启动系统,并使用JMeter对其进行负载测试。那绝对很棒。当我们杀死第四个吊舱时,它的表现也很好。 当我们剩下两个(或一个)豆荚时,问题才跳进来。 Nginx开始仅返回错误,不再将负载分配给其余两个服务器。

我们尝试了什么:

  1. 我们认为弹性搜索查询性能不佳,从而可能会阻塞后端。当直接针对弹性搜索执行查询时,我们具有更高的性能。所以那应该不是问题。

  2. 我们的第二种方法graphql.net库是伪造的,因此我们将其替换为HotChocolate,这完全没有效果

  3. 当我们用REST API接口替换graphql接口时,它突然起作用了吗?!

  4. 我们使用了Nginx配置,但是找不到实际修复它的设置。

  5. 我们用traefik替换了Nginx,但是结果也一样。

  6. 我们发现,一旦我们将Pod设置为3,反向代理上的ESTABLISH Connections数量就会突然翻倍(没有任何额外的传入)。 =>也许它正在等待这些连接的超时并阻止任何其他传入的连接?!

我们非常感谢您的帮助。 非常感谢。

如果您想/需要了解其他信息,请告诉我!

更新:我对代码做了一些更改。现在效果更好,但是当从一个Pod扩展到两个Pod时,性能下降约20-30秒。这是为什么?我们该如何改善呢?

我们从Nginx收到此错误

[warn] 21#21: *9717 upstream server temporarily disabled while reading response header from upstream,client: 172.20.0.1,server: dummy.prod.com,request: "POST /graphql HTTP/1.1",upstream: "http://172.20.0.5:5009/graphql",host: "dummy.prod.com:81"
Nginx_1   | 2020/09/14 06:01:24 [error] 21#21: *9717 upstream timed out (110: Connection timed out) while reading response header from upstream,host: "dummy.prod.com:81"
Nginx_1   | 172.20.0.1 - - [14/Sep/2020:06:01:24 +0000] "POST /graphql HTTP/1.1" 504 167 "-" "Apache-HttpClient/4.5.12 (Java/14)" "-"

Nginx配置:

upstream dummy {
    server dummy0:5009 max_fails=3 fail_timeout=30s;
    server dummy1:5009 max_fails=3 fail_timeout=30s;
    server dummy3:5009 max_fails=3 fail_timeout=30s;
    server dummy2:5009 max_fails=3 fail_timeout=30s;
}

server {
  listen       80;

  location / {

    proxy_connect_timeout                   180s;
    proxy_send_timeout                      60s;
    proxy_read_timeout                      60s;

    proxy_buffering                         off;
    proxy_buffer_size                       128k;
    proxy_buffers                           4 128k;

    proxy_max_temp_file_size                1024m;

    proxy_request_buffering                 off;
    proxy_http_version                      1.1;

    proxy_cookie_domain                     off;
    proxy_cookie_path                       off;

    # In case of errors try the next upstream server before returning an error
    proxy_next_upstream                     error timeout;
    proxy_next_upstream_timeout             0;
    proxy_next_upstream_tries               3;
    proxy_pass http://dummy;
  }
  server_name  dummy.prod.com;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...