heeratbeat配置bug,导致连接异常关闭
- Dominant language
- Java
- Stars
- 41.6k
- Forks
- 26.4k
- Avg merge
- 15h 13m
- Merged PRs (30d)
- 4
Description
- version:2.7.8

dubbo现在的机制是如果consumer没有配置心跳时间,但是provider配置了心跳则在consmer合并url的时候以provider为准。
默认使用Netty4的idle-handler进行空闲检测,
## 场景一:不开启简化注册中心url,且consumer配置心跳间隔大于provider的3倍,且`send.reconect`属性为缺省值fasle
ServiceB(provider)配置heartbeat时间为2s,此时ServiceB将在2s*3=6s后断开长连接。
ServiceA(consumer)配置heartbeat时间为30s,此时ServiceA将在30s后发送第一次跳。
所以在实际上此时连接已经断开,并且根据idle-handler的机制,当连接关闭后已经不会再发送跳,并且在调用时不会重新建立连接,导致异常。
## 场景二:启简化注册中心url,配置porvider的heartbeat,consumer使用缺省值,且`send.reconect`属性为缺省值fasle
ServiceB(provider)配置heartbeat时间为2s,此时ServiceB将在2s*3=6s后断开长连接。
ServiceA(consumer)使用缺省heartbeat值60s,按consumer合并url策略,应该使用2s为心跳间隔,但是简化注册中心后heartbeat属性被忽略掉了。
导致场景一异常再次出现。
## 改进方案
1. 简化注册中心url,加上heartbeat。
2. consumer合并url时和provider的heartbeat进行比较,如果consumer.heartbeat >= provider.heartbeat * 3。则需要以provider.heartbeat为准,保证不出现连接关闭的情况。
3. 目前consumer不支持全局配置heartbeat和protocol,不能全局配置心跳间隔,应该支持使用protocol全局配置。
Contributor guide
Assessment
This issue has not been assessed yet.