一般远程调用的默认超时时间为 2-5s。但在实际工作中,还是要看具体的业务场景,因为不同的业务场景对超时时间的要求不同。
- 一些查询、验证等较为简单的操作,超时时间可以适当缩短。
- 一些需要长时间处理的业务,比如大数据处理、复杂的查询,可能需要配置较长的超时时间,避免超时过早导致的失败。
除此之外,超时时间应该基于服务的响应能力进行设置,也就是考虑服务端(服务提供者)的处理时间,如果服务端有历史响应时间数据或监控信息,可以参考这些数据进行合理设置,例如参考 TP99 的耗时来设置超时时间, 整体的配置根据当前的上下游服务情况敲定一个合理的超时时间。
一般来说,建议服务端(服务提供者)提供配置超时时间和重试次数等参数,因为作为服务提供方,它比消费方更清楚当前服务、方法的性能。而消费者直接采纳生产者提供的配置即可,
- 远程调用超时时间
在微服务场景,远程调用超时时间,一般指的是生产者(provider)和消费者(consumer)配置的方法调用超时时间。
超时时间无法设置过短。如果时间过短,正常业务流程还未走完,消费者检测到接口超时,直接中断调用,影响正常业务的执行。超时时间无法设置过长。如果时间过长,此时请求量较大,那么就会出现大量长期无响应的请求占用线程池等情况,导致资源被占用无法释放,严重会导致服务崩溃因此超时时间的设置需要比正常业务耗时长,但是又不能长太多,建议根据压测情况。参考TP99 的耗时来设置超时时间。
TP99 指的是满足 99%次数的网络请求所需要的最低耗时。比如调用一个方法,1小时内调用了 10w次,监控显示 TP99 是 300mns,这个意思就是:这个请求强度下,百分之99% 的调用,都可以在 300ms 内返回结果,此时超时时间可以设置为 1s,给一定的冗余又不会太多,此时设置10s就是过长的配置。
- RPC 框架的多粒度超时时间
例如 dubbo 支持多粒度配置 rpc 调用的超时时间:优先级从高到低依次为 方法级别配置>服务级别配置 >全局配置 >默认值。
- 配置全局默认超时时间为5s (不配置的情况下,所有服务的默认超时时间是 1s)
dubbo:
provider:
timeout: 5000
- 在消费端,指定 DemoService 服务调用的超时时间为 5s
@DubboReference(timeout=5000)
private DemoService demoService;
- 在提供端,指定 DemoService 服务调用的超时时间为 5s(可作为所有消费端的默认值,如果消费端有指定则优先级更高)
@DubboService(timeout=5000)
public class DemoServiceImpl implements DemoService{}
- 在消费端,指定 DemoService sayHello 方法调用的超时时间为 5s
@DubboReference(methods = {@Method(name = "sayHello", timeout = 5000)})
private DemoService demoService;
- 在提供端,指定 DemoService sayHello 方法调用的超时时间为 5s(可作为所有消费端的默认值,如果消费端有指定则优先级更高)
@DubboService(methods = {@Method(name = "sayHello", timeout = 5000)})
public class DemoServiceImpl implements DemoService{}