不合理超时设置带来的“坑”

2023-05-16

 

       在后台服务的实现中,我们通过基于TCP/UDP协议封装起来的RPC机制实现了跟不同系统的通信,进而协同各个系统完成一系列业务流程和功能的执行,在这个过程中,每个参与合作的子系统都有自己的能力描述,如并发能力,响应速度,接口稳定性和安全级别等。并发能力是其中非常关键的一个指标,我们常用TPS等指标进行描述,表示单位时间内能够处理的事务数量。

在多进程模型中:假如系统启用了n个处理进程,处理单个请求的耗时是xms,那么,每个进程在1s内能够处理的请求数:

                                                                    单进程1s内处理数量 = 1000/x

则n个处理进程总的大概并发能力:

                                                                     TPS  =  n * 1000/x             (1)

      从式子(1)可以看到:要提升整体系统的并发能力,要么增加处理进程数量,要么减少单个请求的处理时间。

      一个方法是单机内增加处理进程,在某种程度能够优化或者缓解整体的并发能力。但当单机进程数量大到某个数量后,简单的增加进程数反而会增加不同进程之间的切换成本,如果存在锁竞争,则效果会更打折扣;另外一种办法是scan out,增加更多的机器,这是一个不错的方案,目前很多的架构优化都是基于某种规则进行打散后分布到更多的机器进行处理,但前提是架构能够支持scan out能力。

       另外一个方法是减少单个请求的处理时间。在单机极限性能优化中,这个是关键点,需要深刻挖掘影响处理的各个耗时,对某个具体的用户来说,前面的增加进程数或者scan out并不能很明显的提升单个用户的体验,该用户在某次的请求中的耗时仍然没有优化。在高可用架构和追求极致体验的设计和实现中,我们需要关注每次请求本身的耗时,尽量减少耗时,同时也尽可能的确保服务的稳定性。

       减少耗时比较容易理解,但稳定性怎么说?举一个例子:你打开某个网站,如果你能够打开的话,发现速度很快,基本都是1s以内可以返回,但你在这个网站浏览,总是时不时的出现500或者服务异常,那我们说,虽然速度快,但服务是不稳定的。如何提升单次请求或者服务的稳定性呢?由于每次请求都会对多个系统有依赖,比如支付流程,每次支付都有对应的底层100+次的调用,如果其中只要某个调用超时或者异常,则整体服务也是异常的,那么我们认为某个调用或者依赖是关键路径

       因此,关键原则是:要提升稳定性,就必须要解决好关键路径的设计和实现。

根据可用性乘法原理:假设一条关键路径上有N个节点,每个的故障率为r,则按照乘法原理,整体的路径稳定性:(1-r)的N次方显然优化方法:减少N,减少 r

      一个好的办法就是减少依赖的节点数,即我们常说的弱化关键路径,或者把关键路径变为非关键路径,一旦变为非关键路径,则该节点失败或者异常,对整体服务有一定的降级影响,但不是致命的影响。

     到目前为止,我们目前已经能够得出一个非常重要的可用性价值观:弱化关键路径。通过对业务流程的深入分析,把对下游依赖系统的调用进行分级,根据是否对最终用户体验的影响程度划分为关键路径和非关键路径。

  1. 关键路径:一旦出问题,必定会影响最终用户的体验,因此必须花足够的冗余资源进行设计和实现,确保高可用和高稳定性;
  2. 非关键路径:一旦出问题,对用户没有致命的影响,因此在实现上考虑进行旁路化—即调用该接口一旦出问题,则忽视它,继续执行下面流程。

 

                                                                            图 1-1 非关键路径的实现

        从图1-1可见,对关键接口A的调用,如果失败,则最终结果返回失败,因此,关键接口A需要有足够好的健壮性和稳定性设计;而对非关键接口B的调用,如果失败,只是简单记录Log和上报监控,不影响最终的结果,最终结果还是返回成功给服务调用方。举个例子:在民生应用乘车码中,用户每次是否能够成功拉码非常关键,但如果该用户有欠费行为,则需要先进行还款后才能出码,然而欠费行为的判断需要依赖更多的全局服务,稳定性和全局依赖性更强,为了让拉码流程更短,我们把欠费查询作为非关键路径进行设计,即如果该接口故障,系统会自动绕开,认为用户没有欠费继续给用户先出码,优先保障该用户的本次出行体验。

上面的实现从原理上看是没有太大问题的,我们进一步的剖析具体实现的细节,这次加入了各个接口调用的超时设置。

                                                                        图1-2,加入超时设置的实现路径

 

图1-2中,我们添加了各个接口的超时设置,假设外面服务调用方设置总体超时是1000ms,

Case 1:在调用第一个关键接口A的时候实际用了300ms,调用非关键接口B的时候,由于该服务挂死无法及时返回,等到超时500ms后才返回,那么总体该流程的耗时是300ms+500ms=800ms < 1000ms,可以正常返回。

Case2:如果在调用关键接口A的时候实际用了600ms,调用非关键接口B的时候需要等到超时500ms才返回,那么总体该流程的耗时是600ms + 500ms = 1100ms > 1000ms,但此时外部调用方已经等不及了,超过1000ms会返回超时,因此此时,该服务的处理对外部服务来说是没有意义的,总体该流程还是失败,虽然A关键接口成功了。

      从case 2 的情况可以看到,如果超时设置不合理,哪怕实现上认为是旁路的非关键路径,但在实际场景中,仍然会对最终的服务造成影响,本质是:服务返回虽然是可旁路的,但该接口调用的时间资源是无法旁路的,每个旁路接口的调用都会耗费一定的时间资源,然而总体的时间资源是有限的(等于外部服务调用方设置的总体超时,表示外部服务能够等待的最大耐心)。

问题是:我们有什么好的优化手段吗?

方案A: 设置更合理的超时时间。

         一个比较简单的手段就是合理设置各个接口的超时,最好的方式是各个接口的超时相加小于等于外部接口设置的总体超时,旁路接口尽量设置更短的超时,如50ms超时,而把更多的时间资源给到关键接口的调用。 当然,我们需要关注此超时下旁路接口能够成功返回的占比;若是多个旁路接口的情况,则需要更加注意上面的超时关系设置,一个优化手段是合并接口,把多个旁路调用聚合成一个旁路调用(其实就是给到总体旁路接口一个总的时间资源,由他们自己内部竞争,避免多个旁路接口跟外部的关键接口进行时间资源的抢夺);

方案B: 从串行调用改成并行调用。

         并行调用的一个好处是时间资源的放大效应,如果我们并行调用各个旁路接口,只要最慢的那个不超过总体超时,则不会对最终结果有挤出影响,当然各个关键接口的调用如果能够并行(考虑前后依赖情况),也遵循同样的时间设置原则,并行关键接口或者串行关键接口超时之和均不超过总体超时,则都是有效的策略,如图1.-3所示。

                                                                                图1-3,并行调用超时设置

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不合理超时设置带来的“坑” 的相关文章

随机推荐

  • 知识库AI机器人客服(基于ChatGPT3.5)对接-唯一客服系统文档中心

    此功能是利用chatgpt训练企业知识开发个性化客服系统 xff0c 可以上传自有数据 xff0c 基于向量数据库与OpenAI Embedding xff0c 以及OpenAI chat completions接口 xff0c 实现的基于
  • AX7A200教程(6): 串口接收图片数据,通过hdmi接口输出显示

    本章节主要使用uart接收图片数据 xff0c 然后通过ddr3缓存 xff0c 最后通过hdmi接口显示输出 xff0c 功能框图如下图所示 uart接收的图片数据位1024 768 3分辨率大小的数据 xff0c 一共2359296个字
  • ROS 程序初读一(gps_driver)

    先来看到 launch 文件夹 xff0c 有三个 launch 文件 xff0c 也不知道从哪看起 xff0c 就从第一个看看先 第一个文件为 gps data get launch xff0c 内容如下 lt launch gt lt
  • 什么是SLO?

    Short term Liquidity Operation即短期流动性调节工具 SLO以7天期以内短期回购为主 xff0c 遇节假日可适当延长操作期限 xff0c 采用市场化利率招标方式开展操作 SLO原则上在公开市场常规操作的间歇期使用
  • 21.6.7爬虫日志

    一 爬虫的目的 采集数据 xff0c 为软件服务 xff01 xff01 那么数据从那儿来 xff1f 都是从生活中来的 xff01 xff01 1 手工采集 可以采集数据 xff0c 但是操作效率低下 2 内部数据 公司内部数据 xff0
  • 什么是自贸区?什么是离岸债券?

    1 自由贸易区 中国自由贸易区是指在国境内关外设立的 xff0c 以优惠税收和海关特殊监管政策 为主要手段 xff0c 以贸易自由化便利化为主要目的的多功能经济性特区 自由贸易区有两个本质上存在差异很大的概念 xff1a 一个是FTA xf
  • 什么是SLO?

    SLO xff1a 短期流动性调节工具 xff08 Short termLiquidityOperations xff09 每周二 周四 xff0c 央行一般都会进行公开市场操作 xff0c 目前最主要的是回购操作 回购操作又分成两种 xf
  • strcpy、strncpy与memcpy的区别与使用方法

    strcpy strncpy 与memcpy 的区别与使用方法 strcpy strncpy memcpy这三个C语言函数我们在主机代码编写中会很频繁的使用到 xff0c 但是三个函数的区别 使用时该注意什么还是有必要说下的 本文参考 C
  • C语言:存取结构体成员的点运算符(.)和箭头运算符(->)的区别

    一直以为这两个是没有什么区别的 xff0c 可以相互替换 xff0c 今天又翻了一下 C语言核心技术 xff0c 明白了其中的奥妙 相同点 xff1a 两个都是二元操作符 xff0c 其右操作符是成员的名称 不同点 xff1a 点操作符左边
  • DB2 命令行中如何执行sql脚本

    原文链接 xff1a http space itpub net 8231934 viewspace 584635 db2 61 gt connect to dbName user xxx using password db2 61 gt s
  • 性能测试知多少 --并发用户数与TPS之间的关系

    1 背景 在做性能测试的时候 xff0c 很多人都用并发用户数来衡量系统的性能 xff0c 觉得系统能支撑的并发用户数越多 xff0c 系统的性能就越好 xff1b 对TPS不是非常理解 xff0c 也根本不知道它们之间的关系 xff0c
  • ubuntu编译 opencv undefined referece to `cv::imread()`

    Ubuntu下编译一个C 43 43 文件 xff0c C 43 43 源程序中使用了opencv xff0c opencv的安装没有问题 xff0c 但是在编译的过程中出现如下错误 xff1a undefined reference to
  • 基于深度学习的3D pose estimation总结(包括几篇2D pose estimation)

    一 任务描述 给定一幅图或者是一段视频 xff0c 人体姿态估计就是恢复出其中的人体关节点位置的过程 二 挑战和难点 1 人体肢体运动较为灵活 xff1b 2 视角的变化 xff1b 3 附着物的变化 xff08 比如遮挡 xff0c 衣物
  • STM32的空闲中断

    最近发现了STM32的USART的空闲中断非常的舒爽 xff0c 但是在前期配置的时候会出现一些小问题导致没有办法进入终中断或者是一直空闲中断 xff0c 现将它记下来 xff0c 给各位和自己留一个参考 xff1a 1 不进入中断 我是这
  • Github上最受欢迎的7个开源AI机器学习框架

    在过去的几年中 xff0c 人工智能正在占领技术的许多领域 来自不同背景的开发人员最终意识到了AI为他们带来的机遇 xff0c 而不管他们的需求如何 在今天的文章中 xff0c 我们列出了7种最佳的开源AI 机器学习系统和框架 1 Tens
  • ubuntu更换shell

    ubuntu更换shell zsh配置 span class token comment 安装zsh span span class token function sudo span span class token function ap
  • 网络调试助手NetAssist的使用

    一 使用场景 xff1a 项目定制需求 xff1a 前端的车载终端把gps 报警信息 报警图片 其他检测数据发往约定的第三方服务器 xff0c 车载终端通过公网 xff08 SIM拨号或者有线网 xff09 以udp或者tcp连接服务器 x
  • vlc代码分析(4)——mpgv的demux

    Mpgv c 是对mpeg vedio的解码部分 xff0c 从demux开始 xff0c 到sample到输出 其中 xff0c 核心部分是函数ParseMPEGBlock 两种数据格式 xff1a video format 是video
  • 关于使用CMT2300A FIFO缓存区间设置为64Byte的问题

    首先请看 xff0c CMT2300A 是什么产品 xff0c 或者说是 模组吗 xff1f 请看介绍 xff1a https blog csdn net sishuihuahua article details 105095994 以及R
  • 不合理超时设置带来的“坑”

    在后台服务的实现中 xff0c 我们通过基于TCP UDP协议封装起来的RPC机制实现了跟不同系统的通信 xff0c 进而协同各个系统完成一系列业务流程和功能的执行 xff0c 在这个过程中 xff0c 每个参与合作的子系统都有自己的能力描