现象:服务消费者调用一次,在服务端会被执行3次,如一个充值100的请求,最后到账300。
充值前的余额
调用充值100后,由于某种原因导致失败,然后重发了3次,如下
再查一下余额,由100.22变成了400.22,重复充值了3次
再看一下服务端的日志,也有3次,每隔1秒一次
2019-12-05 09:51:18.991 INFO 20832 --- [20880-thread-19] o.n.a.service.impl.AccountServiceImpl : 本次调用入参:balance = 100, userId = 1
2019-12-05 09:51:19.118 INFO 20832 --- [20880-thread-20] o.n.a.service.impl.AccountServiceImpl : 本次调用入参:balance = 100, userId = 1
2019-12-05 09:51:20.177 INFO 20832 --- [20880-thread-21] o.n.a.service.impl.AccountServiceImpl : 本次调用入参:balance = 100, userId = 1
原因:dubbo的超时重连机制导致的。dubbo有这样几个机制
1、如果超时,但是最终返回了正确结果,只是warn,依旧按照正常流程走下去。
2、dubbo:provider 可以设置超时时间 timout,以及如果超时允许被重连的次数 retries
3、dubbo:reference可以设置超时时间,以及如果超时 timout,允许重连服务的次数 retries
4、dubbo:reference retries 的默认值和consumer一样,而consumer默认为3次