- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序将向我的 tomcat 服务器(启用了 http/2)发送大约 1000 个 POST 请求/分钟,这将轮询给定的 url 并返回 html 和响应时间,我想实现真正的 http/2 多路复用在我的应用程序和 tomcat 服务器之间重用 tcp 连接。我的客户端使用 okhttp,我可以成功建立连接并长时间重用它,但是当请求计数增加时(例如,排队:50,运行:50),响应时间也会增加(它达到 2000 毫秒 - 15000ms 甚至更糟,通常需要 300ms-500ms)。我可以理解这是因为 tcp 连接因请求过多而过载,因此我决定打开多个 tcp 连接并允许它在 tcp 连接之间分配请求负载。我强制客户端使用
打开多个连接Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(100);
dispatcher.setMaxRequestsPerHost(5);
ConnectionPool cp = new ConnectionPool(5, 5, TimeUnit.MINUTES);
在 wireshark 的帮助下,我可以看到打开了 5 个连接,还看到在第一次握手成功后立即关闭了 4 个请求,我不知道这是否是 http/2 多路复用的预期行为。
如果这是预期的行为,我该如何优化它以减少峰值加载时间每个请求的响应时间?
或者是否可以在高峰负载时间使用多个连接来分配负载?
我的示例程序如下,
Security.insertProviderAt(Conscrypt.newProvider(), 1);
sslContext = SSLContext.getInstance("TLSv1.3");
sslContext.init(null, new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
}, new java.security.SecureRandom());
sslSocketFactory = sslContext.getSocketFactory();
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(100);
dispatcher.setMaxRequestsPerHost(5);
ConnectionPool cp = new ConnectionPool(5, 1, TimeUnit.DAYS);
okHttpClient = new OkHttpClient().newBuilder()
.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustManager[0])
.dispatcher(dispatcher)
.connectionPool(cp)
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})
.build();
我们使用 conscryt 在 jdk8 本身中启用 ALPN,
try {
String url = "https://localhost:8081/myAent/getOutput?1000000004286_1520339351002_"+System.currentTimeMillis();
String json = "<?xml version=\"1.0\" standalone=\"no\"?><UC mid=\"1000000005011\" pollNow=\"true\" use_ipv6=\"false\" rca=\"0\" rcaFN=\"P|TA|D|J|M\" pFtct=\"\" sFtct=\"\" issecondarydc=\"false\" ssDc=\"false\" nocache=\"1\" storeHtmlResp=\"true\" storeTroubleScrnSht=\"false\" moConfig=\"false\" xconlen=\"8265\" noScreenshotRecheckForSSLErrors=\"true\" avgDnsTime=\"null\" isProxyRequired=\"false\" userroles=\"EVAL_USER\" uid=\"102030230293029021\" retryDelay=\"2\" retry=\"true\" idcLocUrl=\"http://localhost:8080/app/receivemultipartdata\" isRemoteAgent=\"true\" sendHeaders=\"false\" api=\"ab_345nnn4l4lj4lk23nl4k23342lk4l23j4\" ut=\""+(System.currentTimeMillis()+"")+"\" mt=\"URL\" dctimeout=\"70\" pollinterval=\"1440\" locid=\"48\" log=\"1\" currentstatus=\"1\" postUrl=\"https://example.com\"><Url acc=\"\" forced_ips=\"\" use_ipv6=\"false\" client_cert=\"\" mid=\"1000000005011\" sotimeout=\"60\" ua=\"\" ds=\"117.20.43.94\" ucc=\"\" md=\"false\" client_cert_pass=\"\" context=\"default\" unavail_alert=\"\" ssl_protocol=\"\" avail_alert=\"\" enabledns=\"false\" enableBouncyCastle=\"false\" cc=\"false\" a=\"https://www.example.com/tools.html\" upStatusCodes=\"\" regex_alert=\"\" probeproxy=\"false\" m=\"G\" keyword_case=\"0\" regex=\"\" rbc=\"\" t=\"30\" lc=\"English\"><PD></PD><CH hn=\"\" hd=\"_sep_\" hv=\"\"/><AI ps=\"\" un=\"\"/></Url></UC>";
RequestBody body = RequestBody.create(MediaType.get("application/json; charset=utf-8"), json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
long nanoStartTime = System.nanoTime();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println("okhttp3:: Request failed"+ e);
}
@Override
public void onResponse(Call call, okhttp3.Response responseObj) throws IOException {
try (ResponseBody body = responseObj.body()) {
long nanoEndTime = System.nanoTime();
long nanoDiffTime = TimeUnit.NANOSECONDS.toMillis(nanoEndTime - nanoStartTime);
System.out.println("okhttp3:: Succeded response ***"+body+"$$$");
System.out.println("okhttp3:: Request Succeded protocol ***"+responseObj.protocol()+"$$$, time is "+nanoDiffTime);
}
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
如何优化 okhttpclient 以使用多个 tcp 套接字/连接来实现 http/2 多路复用以分配请求负载。
客户:Tomcat Apache - 9.0.x,JDK-8,Http 库 - Okhttp3,操作系统-Ubuntu/Centos,安全提供程序 - Conscrypt(用于在 jdk 8 中支持 ALPN)。
服务器:Tomcat Apache - 9.0.16,JDK -10.0.1,操作系统-Ubuntu/Centos,OpenSSL - 1.1.1a 用于 TLSv1.3 支持
最佳答案
您看到的是 OkHttp 中连接合并的结果。 OkHttp 事先不知道是否会建立 HTTP/2 连接(与 HTTP/1.1 相比),因此允许连接的 setMaxRequestsPerHost 值继续进行。目前* 没有客户端负载平衡,因此它们会快速合并到一个连接,这就是您所看到的。
目前,您可以通过多个客户端或仔细管理完全不同的主机和连接来实现这一点。 n.b OkHttp 将在这里对你不利,并针对单个连接优于多个连接的典型情况进行优化,例如SSL 证书指定了重叠的主题备用名称
* 关注此问题以获得支持https://github.com/square/okhttp/issues/4530
关于java - Okhttp3、http2多路复用POST请求在负载高峰期响应时间高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54849941/
我有一些关于 Volley 的问题 如何获得与 volley 库的连接响应时间? 有解决方案吗? 我可以使用计时器来获取响应时间吗?如何使用? 还有在 volley 连接前执行的方法吗? 我的代码是这
我管理一个使用 symfony2 创建的网站,我需要“稳定”它的响应时间。 响应时间从 100 毫秒(下限) float 到 1200 毫秒,并且随机改进(我已经排除了访问依赖性)。 配置如下: Ce
我正在使用门牌号数据查询简单的 Elasticsearch 索引。 ".house-numbers": { "mappings": { "house-number": {
本文分享自华为云社区《【高并发】性能优化有哪些衡量指标?需要注意什么?》,作者:冰河 。 最近,很多小伙伴都在说,我没做过性能优化的工作,在公司只是做些CRUD的工作,接触不到性能优化相关的工作。现在
目前,我正在尝试开发用于即时消息传递的 Android 应用程序。我想在 Ubuntu 服务器上为此使用 ejabberd。只有一个问题。当我首先尝试使用此 xml 行连接到我的 ejabberd 时
好吧,我做了这个很长的查询。它工作完美,但需要 15-30 秒才能给我结果...我不是 SQL 专家,所以我想问是否有办法提高 MySQL 响应时间...也许需要超过1 个查询或类似的内容。 PS:它
我有一个标准用例,用于监控到达我的 Tomcat 服务器的请求的响应时间。我已启用访问日志并将响应时间 (%D) 添加到模式。 现在我想监控我的服务器的响应时间。例如: 过去一小时的平均响应时间是多少
我希望减少 Web 服务器针对给定查询从 API 服务器请求/接收数据的完整时间。 假设 MySQL 是瓶颈,我将 API 服务器数据库更新到 Cassandra,但完成时间仍然相同。可能是其他东西是
我是一个 java 初学者,我正在尝试编写一个机器人来填写一个对我来说非常烦人的表格。 为什么这种形式令人烦恼?想象一下,我必须在该表单中插入一千个不同的值,但它一次只允许我插入一个值。每次插入每个值
有 C++ 桌面应用程序,我需要测量 UI 滞后,因为用户说它有时会滞后。我该如何实现?尝试在操作后将 pywinauto 与计时器启动-停止一起使用,但它单击元素的速度非常慢。另一方面,尝试使用 S
我正在构建一个服务器监控系统,我想向 Web API 发送请求,并在 JSON 对象中获取服务器的健康状况、数据库连接是否正常、响应时间等。 如何实现响应时间,即 Web API 需要多长时间来响应请
我正在尝试加快测试 jetty (将其与使用 apache 进行比较)以提供动态内容。 我正在使用三个客户端线程对此进行测试,一旦响应返回就会再次请求。它们在本地盒子(OSX 10.5.8 mac b
我正在构建一个带有 API 的 PHP 应用程序,该应用程序能够非常快速地(在 100 毫秒内)响应所有请求,并且必须能够每秒处理多达 200 个查询(请求以 JSON 格式,响应需要数据库查找+每次
在 AWS 实例上抛出 Node.JS 并测试请求时间,得到了一些有趣的结果。 我在服务器上使用了以下内容: var http = require('http'); http.createServer
我有一个 API,它登录一个帐户,然后对我想通过 CFHTTP 请求出价的项目执行搜索,如下所示。 搜索.cfm: 登录.cfm:
这些响应时间是来自 JMeter TTFB 还是 TTLB? 最佳答案 响应时间是“到最后一个字节的时间” http://jmeter.512774.n5.nabble.com/JMeter-resu
我知道 LoadRunner 用于系统响应,但我想知道它是否也可以测量,例如渲染时间(大型列表中的数千个项目等)。我想这可以通过验证特定对象出现在 UI 中来完成,但我认为 LoadRunner 不运
我正在制作一个元素(网站),我需要一些建议。我的计划是将 NodeJS 与 express webframework 一起使用。我想让这个网站真正用户友好和友好,就像每个人都希望他们的网站一样。问题是
抱歉我的英语不好,但我尽力了:)我有一些问题,希望我能在这里找到答案。我想在 html/css/js 中创建一个离线聊天机器人并使用 Intel XDK 程序。 我不知道,如何给聊天机器人一个特殊的命
我正在使用 java 脚本/Jquery 从我的客户端代码使用 Microsoft Face api。这是代码。我使用相机捕获图像,然后将该图像转换为 blob 并将其发送到 api。我正在得到结果。
我是一名优秀的程序员,十分优秀!