support ws health check config

This commit is contained in:
liuzhihang1
2025-02-16 00:18:47 +08:00
parent f37a350adf
commit 9bc0a15c0d
2 changed files with 31 additions and 21 deletions

View File

@@ -28,6 +28,7 @@ type configuration struct {
KillWaitTime int `default:"5" describe:"kill信号等待时间"` KillWaitTime int `default:"5" describe:"kill信号等待时间"`
TaskTimeout int `default:"60" describe:"任务执行超时时间(秒)"` TaskTimeout int `default:"60" describe:"任务执行超时时间(秒)"`
TokenExpirationTime int64 `default:"720" describe:"token过期时间小时"` TokenExpirationTime int64 `default:"720" describe:"token过期时间小时"`
WsProactiveHealthCheck bool `default:"false" describe:"ws主动健康检查"`
CgroupPeriod int64 `default:"100000" describe:"CgroupPeriod"` CgroupPeriod int64 `default:"100000" describe:"CgroupPeriod"`
CgroupSwapLimit bool `default:"false" describe:"cgroup swap限制"` CgroupSwapLimit bool `default:"false" describe:"cgroup swap限制"`
CondWaitTime int `default:"30" describe:"长轮询等待时间(秒)"` CondWaitTime int `default:"30" describe:"长轮询等待时间(秒)"`

View File

@@ -64,7 +64,7 @@ func (w *wsApi) WebsocketHandle(ctx *gin.Context) {
CancelFunc: cancel, CancelFunc: cancel,
} }
proc.ReadCache(wci) proc.ReadCache(wci)
w.startWsConnect(conn, proc, hasOprPermission(ctx, uuid, constants.OPERATION_TERMINAL_WRITE)) w.startWsConnect(conn, cancel, proc, hasOprPermission(ctx, uuid, constants.OPERATION_TERMINAL_WRITE))
proc.AddConn(reqUser, wci) proc.AddConn(reqUser, wci)
defer proc.DeleteConn(reqUser) defer proc.DeleteConn(reqUser)
conn.SetCloseHandler(func(_ int, _ string) error { conn.SetCloseHandler(func(_ int, _ string) error {
@@ -84,14 +84,14 @@ func (w *wsApi) WebsocketHandle(ctx *gin.Context) {
conn.Close() conn.Close()
} }
func (w *wsApi) startWsConnect(conn *websocket.Conn, proc logic.Process, write bool) { func (w *wsApi) startWsConnect(conn *websocket.Conn, cancel context.CancelFunc, proc logic.Process, write bool) {
log.Logger.Debugw("ws读取线程已启动") log.Logger.Debugw("ws读取线程已启动")
go func() { go func() {
for { for {
_, b, err := conn.ReadMessage() _, b, err := conn.ReadMessage()
if err != nil { if err != nil {
log.Logger.Debugw("ws读取线程已退出", "info", err) log.Logger.Debugw("ws读取线程已退出", "info", err)
conn.Close() cancel()
return return
} }
if write { if write {
@@ -100,22 +100,31 @@ func (w *wsApi) startWsConnect(conn *websocket.Conn, proc logic.Process, write b
} }
} }
}() }()
// // health check if config.CF.WsProactiveHealthCheck {
// pongChan := make(chan struct{}) w.proactiveHealthCheck(conn, cancel)
// conn.SetPongHandler(func(appData string) error { }
// pongChan <- struct{}{} }
// return nil
// }) func (w *wsApi) proactiveHealthCheck(conn *websocket.Conn, cancel context.CancelFunc) {
// timer := time.NewTicker(time.Second) pongChan := make(chan struct{})
// go func() { conn.SetPongHandler(func(appData string) error {
// for { pongChan <- struct{}{}
// conn.WriteMessage(websocket.PingMessage, nil) return nil
// select { })
// case <-pongChan: timer := time.NewTimer(time.Second)
// timer.Reset(time.Second) go func() {
// case <-timer.C: defer timer.Stop()
// conn.Close() for {
// } conn.WriteMessage(websocket.PingMessage, nil)
// } select {
// }() case <-pongChan:
timer.Reset(time.Second)
case <-timer.C:
log.Logger.Debugw("pong报文超时,结束ws连接")
cancel()
return
}
time.Sleep(time.Second * 3)
}
}()
} }