@@ -364,6 +364,11 @@ func (m *Manager) listenSSE(ctx context.Context, conn *EndpointConnection) {
364364 connectionTimeout := time .NewTimer (10 * time .Second )
365365 defer connectionTimeout .Stop ()
366366
367+ // 空闲超时检测:定期检查是否长时间未收到事件(防止僵尸连接)
368+ idleCheckTicker := time .NewTicker (60 * time .Second ) // 每60秒检查一次
369+ defer idleCheckTicker .Stop ()
370+ const maxIdleTime = 5 * time .Minute // 最大空闲时间5分钟
371+
367372 for {
368373 select {
369374 case <- ctx .Done ():
@@ -383,6 +388,26 @@ func (m *Manager) listenSSE(ctx context.Context, conn *EndpointConnection) {
383388 }
384389 return
385390 }
391+ case <- idleCheckTicker .C :
392+ // 检查是否长时间未收到事件(仅在连接已建立后检查)
393+ if connectionEstablished {
394+ lastEventTime := conn .GetLastEventTime ()
395+ if ! lastEventTime .IsZero () {
396+ idleDuration := time .Since (lastEventTime )
397+ if idleDuration > maxIdleTime {
398+ log .Warnf ("[Master-%d#SSE]检测到僵尸连接:已%v未收到任何事件,主动断开重连" ,
399+ conn .EndpointID , idleDuration .Round (time .Second ))
400+ conn .SetConnected (false )
401+ if ! conn .IsManuallyDisconnected () {
402+ m .markEndpointFail (conn .EndpointID )
403+ conn .ResetLastConnectAttempt ()
404+ }
405+ return
406+ }
407+ log .Debugf ("[Master-%d#SSE]空闲检查:距离上次事件%v(最大允许%v)" ,
408+ conn .EndpointID , idleDuration .Round (time .Second ), maxIdleTime )
409+ }
410+ }
386411 case ev , ok := <- events :
387412 if ! ok {
388413 // 事件通道关闭,这是真正的连接断开
@@ -411,6 +436,9 @@ func (m *Manager) listenSSE(ctx context.Context, conn *EndpointConnection) {
411436 connectionTimeout .Stop ()
412437 }
413438
439+ // 更新最后事件时间(用于检测僵尸连接)
440+ conn .UpdateLastEventTime ()
441+
414442 log .Debugf ("[Master-%d#SSE]收到SSE消息: %s" , conn .EndpointID , ev .Data )
415443
416444 // 投递到全局 worker pool 异步处理
0 commit comments