apache / apache/dubbo

heeratbeat配置bug,导致连接异常关闭

Open
#6,630 0 comments 0 reactions 0 assignees View on GitHub
type/need-triage
Dominant language
Java
Stars
41.6k
Forks
26.4k
Avg merge
15h 13m
Merged PRs (30d)
4

Description

- version:2.7.8

![image](https://user-images.githubusercontent.com/20626345/90871877-59591580-e3ce-11ea-9542-6ccb9b693383.png)

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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.