微服务可用性-超时控制

超时控制

@2024/07/12

好久不见,甚是想念,今天我们来聊聊保证微服务架构高可用性的另一个手段,超时控制。超时控制的作用可以及时释放资源,提高系统资源的利用率,而且还能保证客户端在预期的时间内可以获得响应。而超时控制在微服务领域存在两种形态,第一种就是我们熟悉的客户端-服务端的超时控制,可以称之为端到端的超时控制,比如服务A需要调用服务B,如果调用服务B的时间超过了预期的时间,那么服务A就不会再管服务B是否完成了,而是释放连接,返回给用户一个超时的响应。第二种也是微服务领域比较常用的一种,链路超时控制,这种类型的超时控制视角变大了,保证的是一个业务的超时控制,比如一个下载订单的业务,需要通过用户服务A获取用户信息,判断他是否有权限查看订单数据,然后通过订单服务B获取订单数据,格式化数据,最后通过文件服务C将订单数据打包成一个文件返回给用户,这个业务经历了三个服务 A→B→C,链路超时控制指的就是这个调用链路的调用时间不能超过预期的值,超过了就必须中断业务,返回超时响应。这就是目前主流的超时控制思路,但是超时控制的时间如何设置才是超时控制中最重要落地的一部分,因为如果时间设置的过长,就会导致系统资源耗尽(线程资源,连接资源等)服务崩溃,设置过短会导致服务一直在频繁重试得不到真正的业务执行。所以合适的超时时间是非常重要的。那么有没有什么方法论可以帮助我们在确定超时时间这件事上有迹可循呢?答案是有的,我们回到超时控制的目标上来,超时控制的目标有两个,一个是保证系统的可用性,即及时释放资源,另一个就是保证客户端在预期的时间内获取反馈。所以我们可以根据用户的体验来设置超时时间。这种事情我们可以循环产品的设计者--产品经理,如果这种方法行不通,我们可以根据被调用服务的响应时间来设置超时时间,基本上以被调用服务响应时间的99线,或者999线为超时时间,这里补充一个点,99线,就是99%请求的响应时间都这这个时间内。999线类似。但是如果你没有被调服务的99线,就只能模拟线上环境,进行压力测试。然而很多公司并没有模拟好的线上环境,所以这个办法也有可能行不通,所以你需要估算被调服务的代码中的耗时操作的时间,比如被调服务A 进行了2次数据库连接,1次Redis访问,那么估算耗时时间为:数据库响应时间 X 2 + Redis响应时间 X 1。稍微小结一下,确定超时时间有四种办法,优先级逐级降低,复杂程度逐步升高

  1. 根据用户体验

  2. 根据被调服务响应时间

  3. 根据模拟线上环境的压力测试

  4. 根据被调服务的代码估算

确定了超时时间,接下来我们来思考一个问题,那就是在服务端执行业务的过程中超时了,我们是中断业务的执行呢?还是继续执行业务呢?按照我们认知的来说确实应该中断业务,因为毕竟这个响应超时了,但是如果要实现这一目标,尤其是在端到端的超时控制中,你不得不在业务手动判断当前这个请求是否处理超时了,据此来判断业务是否继续执行。而在链路超时控制中,由于业务被分为了几个步骤,我们可以在这几步中,进行超时校验来中断业务。链路超时控制中,最重要的事情就是传递超时时间,是传递过期时间段,还是传递过期的具体时间呢?比如超时时间是1s,现在是9:30:58,那么传递的过程中是传递timeout:1000,还是timeout: 9:30:59呢?两者都有利弊,先来说说传递时间段,传递时间段的问题在于,网络传输时间的不确定性,比如服务A调用服务B,在调用服务B之前,已经消耗了300ms,那么交给服务B的超时时间就只能为700ms了,当服务B接受到服务A的请求时,拿到的超时时间也不过是协议头中设置的700ms,没有了传输时间,所以我们需要根据大量的测试,来估算出这段传输时间。当然你也可以结合时间戳,比如在协议头中记录了调用服务B时的时间戳,然后当服务B接收到的时候,根据自己的时间减去协议头中记录的时间就可以得出传输耗费的时间,但是这个策略多此一举,与其这样,不如直接使用超时时间戳,还是这个例子,服务A调用服务B,当服务A接收到用户的请求时,根据这个业务的超时时间,记录超时时间戳,比如当前时间为9:30:40,这个业务的超时时间为1s,那么超时时间戳为9:30:41,将这个时间戳传递给服务B,服务B在执行业务的时候判断当前时间是否超过了这个时间戳就可以了。但是使用时间戳是存在问题的,即时钟回拨问题,简单而言就是两个服务之间的时间不一致,就会发生一种情况,明明超时了,服务B觉得没有超时,明明没超时,服务B觉得超时了。这就是我所知道的超时控制的全部内容,下一期我们讲远程调用。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
pandaer
作者分享
你是否也只把 MySQL 当作一个“只会存取数据”的黑盒?前端发请求,你查数据库,看似简单,但当查询变慢、死锁频发时,你是否因为不懂内部原理而无从下手? 本文不讲晦涩的源码,而是像拆解玩具一样,带你钻进 MySQL 内部:从连接器到存储引擎,看清一条 SQL 到底经历了什么;从 Redo Log 到两阶段提交,搞懂数据是如何被安全写入的。别再只做“CRUD”工程师了,今天带你真正看透 MySQL 的本质! 原文如下:https://mp.weixin.qq.com/s/f6loMKH25VWPfkJYl2yAxg
5
  不知道你有没有想过,计算机是如何从一个想法不断演进到今天的呢?   在起初有这样一个想法,“计算”这件事能不能用机器来实现,让机器来帮我们干活呢?这个想法诞生之后,就不断的有人还在开始尝试实现这个想法,其中图灵提出了自己的一个实现思路,也就是现在大名鼎鼎的「图灵机」,但是图灵机仍然无法落地,因为它有一个「无限长纸带」的假设。于是后人在图灵机这个理想的模型上继续演进,其中冯洛伊曼提出的计算机体系结构成为了主流。   在冯洛伊曼体系结构中,计算机所有的一切都由01组成,无论是文本,图片,声音,还是指令;有5大基础组件,运算器,控制器,存储器,输入输出。后人基于冯洛伊曼提出的计算机体系结构,结合数学和物理相关的知识,就制造出了那些我们耳熟能详的计算机硬件,比如CPU,内存,硬盘,各种外设。基于这些计算机硬件我们就可以组装出一台可以运行的计算机了。值得一提的是,在制造计算机硬件的过程中,数学与物理电学相关的部分,衍生出了一个新的学科「数字逻辑」。   到此,一个可运行的计算机就被制造出来了。
5
  MySQL数据页笔记 这种底层数据结构的设计,基本上都有两部分组成,一部分是真实的数据,一部分是描述这些数据的信息,也叫做元信息。   数据页的组成分为这么几个部分   1. file header 校验和 页号 前一条页号 下一条页号   2. page header 下一条记录 删除标识   3. 最大最小记录   4. record data   5. free space   6. page directory slot 二分查找   7. file tail 校验和 与file header一起用作刷盘时数据的完整性校验。
2
  精力拥有四大来源,这四大来源组成了精力金字塔,从底往上分别是体能,情绪,专注,目标意义感。   体能是基础,体能好,尤其是心肺能力好的人,更加不容易疲劳。所以有规律的运动很重要。   情绪,消极的情绪会不断消耗自己的精力,相信你一定深有感受,遇到消极情绪,需要及时走出来,我的做法就是不纠结,不去想。所以保持一个正面的,积极的心情也很重要   专注,指的是专注的思维,是我们常说的专注力,人脑天生对有难度复杂的事情有抗拒感,而且我们一段时间就只能做一件事情   目标意义感,就是要有清晰的目标,明确的计划。
3
  精力是什么? 如果把人比做手机,那么精力就是「电池」,精力决定了你一天可以做多少事情,效率又有多高。精力充沛的人效率高,做事又好又快,而精力低的人不仅效率低,而且完成的事情的质量也不高。所以让我们做一个高精力的人吧!   那么怎样才算是高精力的人?我将精力划分为4个等级,「不堪重负」「积极应对」「全力以赴」「游刃有余」   1. 不堪重负:不仅自己有挫败感,而且还终日疲惫不堪   2. 积极应对:白天的工作可以认真完成,但是一下班,就想睡觉,甚至连娱乐都不想   3. 全力以赴:白天可以认真工作,下班后至少不会只想躺在床上   4. 游刃有余:白天不仅可以认真工作,下班后也可以积极享受生活,或者充电学习   精力除了有这4个等级之外,精力在一天也是波动的,某个时间段精力高,某个时间段精力低。一个可以落地的方法是**在精力高的时候做有难度高专注的事情,做重要的事情**,那如何判断自己的那个时间段精力高呢?自测,将一天分为几个时间段   1. 醒来后两个小时   2. 8~11点   3. 11~13点   4. 13点~15点   5. 15点~18点   6. 18点~20点   7. 20点~23点   在你认为精力最好的时间段打10分,然后再给其他时间段基于此打分,得到一个曲线图。然后在这个曲线图的高点做重要的事情,低点做一些不费脑子的事情。
5
下载 APP