相关文章推荐
星星上的铅笔  ·  意大利音乐术语| Musicca·  10 月前    · 
逼格高的花卷  ·  公眾遊樂場- ...·  10 月前    · 
绅士的大白菜  ·  數位錄音筆/配件·  11 月前    · 
愉快的钥匙扣  ·  BSc药物科学·  1 年前    · 

1.调用方耗时长。
在这里插入图片描述

2.调用方发送一次请求,服务提供方收到大量重复请求。如下图
在这里插入图片描述
调查步骤:
1.当请求参数过长时,问题可以重现。注:问题发生时,请求经过的链路为:xxx-tc-tke-prod->腾讯LB
->MK网关->gis
2.查看okhttp源码,重试逻辑在okhttp3.internal.http.RetryAndFollowUpInterceptor类中。
关键逻辑介绍:

  • RetryAndFollowUplnterceptor拦截器会对服务端返回的异常信息做分析。判断异常是否可通过重试解决(代码
    逻辑,okhttp3.internal.http.RetryAndFollowUplnterceptor#reecover)。
  • RetryAndFollowUpInterceptor拦截器收到的异常类为:IOException,异常详细信息:“stream was reset:
    CANCEL”,符合重试逻辑。
    在这里插入图片描述
    3.请求重试后,拦截器再次收到同样的异常,再次重试,并无限循环下去。
  • 问题:
    1.为什么okhttp会不断收到"stream was reset:CANCEL"异常常?

    结论如下:
    a.腾讯云LBHTTP2协议默认最大的HEADER大小为4kb,数据超过最最大值后,LB直接拒绝并发送FIN包给调用方。然
    而,调用方因请求数据并未发送完,所以会继续发送数据,LB4收到额外数据后,发送RESET包给调用方,故,okhttp
    收到"stream was reset: CANCEL"异常。
    b.以上分析与抓包数据吻合

    2.为什么okHttp会无间断的重试?
    经测试,此为okhttp低版本的bug,虽然okhttp也有最大重试次数的判断逻辑,但无法触达。高版本okhttp已修复该问题。详情见解决方案。

    问题复现条件:

    1.使用HTTP2协议。
    2.流量经过腾讯LB网关,且请求头信息超过LB配置的最大值(当前值为4kb)。
    3.使用okHttp的问题版本。

    import okhttp3.*;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    public class TestController {
        private static final String s = "https://api-les-gis-test.nioint.com/v1/fence/batch?fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119898&fenceNos=119
    文章目录HTTP/2 协议- Stream 的状态变迁1. Stream 特性2.Message 特性3.GET 消息发送示意图4.POST 消息发送示意图5. Stream 流的状态6.RST_ STREAM 帧(type=0x3)7.常见的 RST_ STREAM 错误码8.Priority 优先级设置帧9.抓取权重报文 HTTP/2 协议- Stream 的状态变迁 1. Stream 特性 一条 TCP 连接上,可以并发存在多个处于 OPEN 状态的 Stream 客户端或者服务器都可以创建新的 Stream
    Thorium-Win是基于Chromium开发的Windows浏览器优化版本,专为提升性能而设计。其中AVX2构建版本通过先进的CPU指令集优化,实现了比标准Chromium浏览器高达30%的性能提升,为用户带来更流畅的网页浏览体验。 ## 什么是AVX2指令集? AVX2(Advanced Vector Extensions 2)是Intel和AMD处理器支持的SIMD(单指令多数据)指令
    当客户端接收到对冲请求集合中的一个完成时,会取消其他的请求,被取消的请求最终会提交一个 Cancel Client Stream Command,发送一个 RST_STEAM 请求;当服务端接受到这个流后,如果监听器还没有关闭,会执行取消上下文的操作,最终将这个请求取消 当客户端成功接收到响应会,会在 io.grpc.internal.Retriable Stream .Sublistener#close 中将成功的流进行提交 io.grpc.internal.Retriable Stream #commit$
    请求阶段发生了 RouteException 或者 IOException会进行判断是否重新发起请求。 RouteException: catch (RouteException e) { //todo 路由异常,连接未成功,请求还没发出去 if (!recover(e.getLastConnectException(), stream Allocation,
    RetryAndFollowUpInterceptor是 okhttp 自己的第一个拦截器,这个拦截器主要负责请求的重定向和 重试 。下面看代码: 先来分析 重试 部分的代码 @Override public Response intercept(Chain chain) throws IOException { Request request = chain.re... <groupId>com.squareup. okhttp 3</groupId> <artifactId> okhttp </artifactId> <version>3.6.0</version> </dependency> import okhttp 3.Interceptor; import okhttp 3. OkHttp Client;