一、背景引入以及服务超时的概念
在微服务架构下,我们创建一个新订单可能会调用很多其他的微服务,比如要查询用户的地址等等。
此时我们的订单服务就是Consumer服务消费方,查询地址服务就是我们的Provider服务提供方。 这里我是在学习Dubbo时所遇到的服务超时和幂等性的概念。
在配置Dubbo时,我们可以配置消费者的统一规则:
<!-- 配置当前消费者的统一规则:所有的服务都不检查,超时时间为5秒,重试次数为3次 -->
<dubbo:consumer check="false" timeout="5000" retries="3"></dubbo:consumer>
服务超时:服务消费方需要调用服务提供方的方法时,但是有可能因为网络等原因,服务提供方执行一个方法需要很长时间,如果很长时间都没有返回而导致大量线程阻塞,这样就会导致性能的极大下降,而我们为了解决这个问题,就可以指定服务超时这个属性,只要在指定时间内没有返回结果,就立即终止线程。
服务超时的覆盖规则
1、精确优先 (方法级优先,接口级次之,全局配置再次之)
2、消费者设置优先(如果级别一样,则消费方优先,提供方次之)
重试次数:当服务超时报错后,消费方会再次重试调用提供方的服务指定次数。
实际开发中服务超时和重试次数属性经常搭配使用,但是配置重试次数属性有一个前提也就是:重试次数属性只能配置在幂等的方法上。
二、什么是幂等性 / 非幂等性
1、幂等性:所谓的幂等性,是分布式微服务环境下的一个常见问题,一般是指我们在进行多次操作时,所得到的结果是一样的,即多次运算结果相同。
常见的幂等操作:数据库的 删、改、查
以上的删改查方法就是典型的幂等操作,也就是说同样的方法,携带同样的参数,无论执行多少次,所导致的结果都是一样的。
2、非幂等性:与幂等性相反,指执行多次操作时,每次得到的结果是不同的。
常见的非幂等操作:数据库的新增
新增方法就算每次执行的是同样的方法,携带同样的参数,但是执行多少次就如插入多少条数据,所以他是非幂等操作。