接口超时需要怎么处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口超时需要怎么处理相关的知识,希望对你有一定的参考价值。
1/6程序的超时有两种,首先是webservice连接本身建立通讯了,但是一直没有返回数据,所以上面的代码中定义了webservice的连接超时时间为13s,这是定义在php.ini中的,如果webservice连接超过13s,程序就抛出连接超时的异常。
2/6
另外一种是脚本执行超时,有时候可能是浏览器,网络等各种原因,webservice还没有连接,脚本就陷入了假死状态,所以定义脚本超时时间,系统默认脚本执行时间为30s。
3/6
当调用set_time_limit时,计时器会从0开始计时,前面各种元素加载的时间并不计算在内。此处结合上面的webservice连接超时时间,如果webservice连接上了后产生阻塞。
4/6
13s内便会抛出异常,所以不会引起15s才触发的脚本中断。所以,如果脚本中断基本可以认定webservice没有连接成功。当然,我们查看过webservice连接情况,正常情况下,2s内连接的建立,数据的返回都完成了。
5/6
webservice连接成功后没有及时返回数据,也没有达到13s的连接超时,但是由于前面建立连接时花了不止2s,脚本执行到15s时,中断了脚本,再重建连接返回了非预期的数据。所以,如果愿意等待的话,这两者之间的时间最好可以相差大点。
6/6
脚本中断后系统会报错,所以,这边还有个处理技巧,先记下当前的报错级别,然后重置为0,即不报任何错误,不自动抛出异常,然后脚本超时后,调用register_shutdown_function注册一个自定义函数,超时后会自动调用这个函数,显示自定义的信息。当然,如果webservice连接成功的话,还是需要回复先前的错误级别,不然,webservice连接超时后的异常将无法捕获。 参考技术A 回答
1/6程序的超时有两种,首先是webservice连接本身建立通讯了,但是一直没有返回数据,所以上面的代码中定义了webservice的连接超时时间为13s,这是定义在php.ini中的,如果webservice连接超过13s,程序就抛出连接超时的异常。
2/6另外一种是脚本执行超时,有时候可能是浏览器,网络等各种原因,webservice还没有连接,脚本就陷入了假死状态,所以定义脚本超时时间,系统默认脚本执行时间为30s。3/6当调用set_time_limit时,计时器会从0开始计时,前面各种元素加载的时间并不计算在内。此处结合上面的webservice连接超时时间,如果webservice连接上了后产生阻塞。4/613s内便会抛出异常,所以不会引起15s才触发的脚本中断。所以,如果脚本中断基本可以认定webservice没有连接成功。当然,我们查看过webservice连接情况,正常情况下,2s内连接的建立,数据的返回都完成了。
5/6webservice连接成功后没有及时返回数据,也没有达到13s的连接超时,但是由于前面建立连接时花了不止2s,脚本执行到15s时,中断了脚本,再重建连接返回了非预期的数据。所以,如果愿意等待的话,这两者之间的时间最好可以相差大点。6/6脚本中断后系统会报错,所以,这边还有个处理技巧,先记下当前的报错级别,然后重置为0,即不报任何错误,不自动抛出异常,然后脚本超时后,调用register_shutdown_function注册一个自定义函数,超时后会自动调用这个函数,显示自定义的信息。当然,如果webservice连接成功的话,还是需要回复先前的错误级别,不然,webservice连接超时后的异常将无法捕获。
希望对你有帮助,亲
接口超时
参考技术A 当设计的业务流程或者功能需要调用其他接口实现请求与响应的时候,可能由于网络等原因导致的接口超时导致业务中断或者功能反馈有误等。所以,对接口超时的知识做一个积累。1、接口资源(Mysql、Redis、Memcached、HTTP 接口)具备这样一些特点:
(1)都是网络接口:网络会成为影响因素
(2)这些资源的可用性,连接速度、读取速度不可控
(3)分层模式,对于调用方来说,只明确是否能够读取数据、数据是否正确;对于资源提供方来说负责具体的数据逻辑。
2、所以涉及到接口开发时,需要注意(产品更多的关注点)
(1)超时机制:对于资源可能会很慢,对于应用程序来说,一个 HTTP 接口,假如返回数据需要十秒,本身是不可接受的那么,所以需要一个超时机制,结束这个资源调配的进程
(2)重试机制:假如一个资源特别重要,可以采取失败重试。比如下单跟第三方接口确认订单时,出现中断等原因导致接口返回有误,可以进行重试请求
(3)异常处理机制:当请求或者返回出现问题,导致功能无法正确发挥效果的时候,不应该仅是简单处理为返回空值,最好能明确产生异常的原因。同时,告知用户该操作失败的原因,和操作补偿,怎么样才让用户将该流程继续。
3、与用户的交互 (产品更多的关注点)
http://naotu.baidu.com/file/51ee300b0b53b79a9a8e52ecd9a40e69?token=fa42fb62487d60fb
4、研发技术上可能可以尝试的解决方案:
(1)增加超时时间
假设A系统有个方法methodA,会调用B系统的methodB这个http接口,如果mehodA不追求超快的 响应速度 ,那么你在调用methodB这个http接口时,可以增长超时时间,例如10秒超时。因为经常在某些时刻,由于网络原因或者系统原因,调用method会超时的。
(2)尝试多调用一次
如果第一次调用methodB超时了,那么你可以尝试多调用一次。当然前提是,methodA不追求超快的响应时间。
(3)使用待处理队列
如果methodA需要很快的响应速度,那么当调用methodB接口超时时,可以使用一个队列存储本次失败的记录,然后使用一个job每隔一段时间去扫这个队列,看看是否有待处理的数据。
备注:如果对方系统挂掉了,使用待处理队列的方式,比较合适。
(4)回滚数据
catch这个超时异常,然后记录日志后,抛出这个异常,并把之前的数据回滚。让对方的系统重新调用。
备注:宁愿没有数据,也不要存储脏数据。
(5)使用异步机制
如果你的业务方法中,需要调用对方的http接口,如果这个http接口不影响主流程的,那么可以使用一个线程,异步调用对方的http接口,并把超时时间设置长一些。由于使用了异步,主流程会立刻继续走的。
(6)问题:调用第三方支付接口响应时间超过10秒,导致大量线上订单因为超时失败,该接口是实时返回结果的,而且不是一直都慢,是偶尔慢。
解决方法:调用接口时设置超时时间,当接口超过9秒未返回结果, 自动将改订单设置为处理中 ,然后后由定时任务调用查询接口。
这样就把,一个实时返回结果的接口,当成一个异步的接口来用了,总比一大堆失败订单等着财务来找好。
可查看链接:
http://wulijun.github.io/2012/08/08/php-timeout-summary.html
http://www.jianshu.com/p/8555ce285375
以上是关于接口超时需要怎么处理的主要内容,如果未能解决你的问题,请参考以下文章
前端调用后端接口 超时处理 Promise.race() 应用