微服务调用超时处理

在开发过程中,应用程序通常会和其他的应用进行交互,应用系统之间的交互往往离不开网络通信。然而,网络环境是不稳定的,网络超时是我们需要考虑的问题。

交互模式

  • 同步


    同步调用

    同步调用接口返回两种状态,这两种状态都是终态,成功S或者失败F。同步调用会阻塞等待返回结果,如果长时间没有结果返回则会等待超时。

  • 异步


    异步调用

    异步调用会返回两次结果,一次是同步返回一次异步返回。同步返回告知调用方请求已经受理,异步返回告诉调用方请求成功或失败。

  • 消息队列


    消息队列交互

    为什么要使用消息队列?

  1. 接口异步化;
  2. 服务之间解藕;
  3. 消峰。

超时问题的解决方案

下面来分析在上面提到的三种交互模式中出现调用超时的情况,并提出相应的解决方案。我们将从两个角度:服务调用方(客户端)和服务提供方(服务端),分析出现超时,客户端和服务端应该如何做。

同步超时

超时可能发生的点
同步调用超时发生的点

在同步调用的模式下,超时可能发生的节点有以下三处:

  1. 请求超时,客户端给服务端发送请求时超时,此时服务端没有收到客户端的请求;
  2. 服务端内部超时,服务端可能存在DB操作、IO操作、调用其他服务超时;
  3. 响应超时,服务端给客户端返回响应时超时,此时服务端已经处理了请求。
客户端

无论是何种超时,对于客户端来说都是透明的,即客户端无法知道具体发生超时的点。客户端对于超时的处理,有如下两种常见方法:

  • 查询,通过主动查询去拉取超时请求的状态。这种方法需要服务端提供查询接口,并且是根据客户端生成的请求流水号作为查询的条件,因为同一个服务或者接口可能会存在多个调用方,这就需要服务端能够唯一标识某一个客户端请求。

如何唯一标识客户端请求,有以下两种方案可供参考.

1. 全局流水号(traceId),全局流水号需要在所有调用方之间唯一,这可能需要在全公司层面有分布式发号器的应用。

2. 如果在调用方的应用有不属于公司的应用,那么全局流水号可能就不好控制了,这个时候可以使用:productId+productSeqId的组合形式。productId表示接入方的系统号,productSeqId表示接入方的流水号,productSeqId需要保证在同一个productId内是唯一的。这样服务端就可以通过productId + productSeqId来唯一标识客户端的请求。

  • 重试,需要设置重试梯度(5s,30s,1min...),以及重试次数的阈值(最多重试的次数)。另外,客户端的重试需要服务端支持幂等(多次执行和只执行一次的效果一样)。
服务端

对于①.请求超时③.响应超时服务端是无法感知的,也就没法进行处理。而在②.服务端内部超时时服务端应该快速失败,立即响应客户端。如果是服务端调用其他服务(例如,服务C)超时,服务端除了快速失败之外,还需要调用服务C的冲正操作。

服务端内部调用其他服务超时

服务C的冲正接口需要能够判断之前是否接收过服务端超时的请求,如果接收过请求并做了处理,则应该执行反向的回滚操作,如果没有接收过,则忽略冲正请求。

异步超时

超时可能发生的点
异步调用模式下超时发生的点

在异步调用的模式下,超时可能发生的节点有以下四处:

  1. 请求超时,客户端给服务端发送请求时超时,此时服务端没有收到客户端的请求;
  2. 服务端内部超时,服务端可能存在DB操作、IO操作、调用其他服务超时;
  3. 同步响应超时,服务端同步返回响应给客户端超时,此时服务端已经接收了请求。
  4. 异步响应超时,服务端异步返回响应给客户端超时,此时服务端已经处理完了请求。
客户端

此时客户端的处理方式和同步调用时客户端的方式一样。

服务端

服务端对于请求超时同步响应超时无能为力,不过对于异步响应超时服务端内部超时是可以处理的,具体如下:

对于异步通知超时可以采用最大努力通知,服务端要求客户端在收到异步通知时明确回应服务端接收成功,如果服务端没有收到客户端的回应,服务端重发异步结果。关于异步结果通知超时处理具体可以参考微信支付中的支付结果通知文档

服务端内部超时,我们应该尽最大努力使得用户的请求处理成功。如果是服务端调用其他服务超时,可以通过查询其他服务,根据查询到的结果再进行后续的操作,并将最终的结果通过异步通知反馈给客户端。

消息队列超时

超时可能发生的点
消息队列模式下超时发生的点

在消息队列模式下,超时可能发生的点有两处:

  1. 生产者投递消息超时,对应上图的①,②;
  2. 消费者消费消息超时。
生产者超时

生产者超时一般都采用可靠消息服务来解决,具体请参考后续的文章。

消费者超时

一般在开发过程中,基本上都可以认为只要生产者将消息投递到了MQ中间件的服务端,那么该消息就一定会被消费者所消费,这主要是基于对消息中间件的信赖。一般而言,各大MQ中间件都有一定的机制来保障其到消费者之间的消息不会丢失。
不同MQ中间件的消费者机制有所不同,大概可以概括成以下两类:

  • 一旦消费者从消息中间件取走消息(无论是推模式或者拉模式都一样),不管消费者是否成功处理,消息中间件都会将该条消息删除;
  • 消费者从消息中间件取走消息之后,消息中间件不会立马将该消息删除,必须要等到消费者告知消息中间件已经处理完了该消息后,消息中间件才会将消息进行删除。

所以在使用消息中间件的时候,我们必须得清楚这个消息中间件产品,它消息消费的具体逻辑是怎样的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容