解决并发情况下,TraceID可能互相覆盖问题

This commit is contained in:
白茶清欢 2021-04-18 20:11:48 +08:00
parent 0ddab40835
commit 47e35b35bd
2 changed files with 25 additions and 2 deletions

View File

@ -160,7 +160,7 @@ func initServer(wsInstance abstract.IWebsocket) {
// TODO : 增加指令回调失败的callback // TODO : 增加指令回调失败的callback
ctxInterface, _ := session.Get("ws_context") ctxInterface, _ := session.Get("ws_context")
ctx := ctxInterface.(*context.WSContext) ctx := ctxInterface.(*context.WSContext)
_ = dispatchCommand(ctx, bytes) _ = dispatchCommand(context.CloneContext(ctx), bytes)
}) })
// 3, 关闭连接的处理函数 // 3, 关闭连接的处理函数
wsServerTable[wsInstance.GetServerPort()][wsInstance.GetModuleFlag()].wsServer.HandleClose(func(session *melody.Session, i int, s string) error { wsServerTable[wsInstance.GetServerPort()][wsInstance.GetModuleFlag()].wsServer.HandleClose(func(session *melody.Session, i int, s string) error {

View File

@ -27,7 +27,8 @@ import (
// //
// Date : 7:03 下午 2021/3/27 // Date : 7:03 下午 2021/3/27
type WSContext struct { type WSContext struct {
ConnectionID string // 请求ID ConnectionID string // 请求ID / 连接ID, 一个生命周期内, 此值不会发生变化
TraceID string // 请求ID,每次指令执行都会发生变化,是针对一次请求有效的
Flag string // 长连接模块 Flag string // 长连接模块
GinCtx *gin.Context // 基于gin实现websocket, gin的上下文 GinCtx *gin.Context // 基于gin实现websocket, gin的上下文
Session *melody.Session // 长连接的会话 Session *melody.Session // 长连接的会话
@ -46,6 +47,7 @@ func NewContext(ginCtx *gin.Context, flag string, session *melody.Session) *WSCo
l, _ := easylock.NewSegment(128) l, _ := easylock.NewSegment(128)
return &WSContext{ return &WSContext{
ConnectionID: generateConnectionID(flag), ConnectionID: generateConnectionID(flag),
TraceID: generateConnectionID(flag),
Flag: flag, Flag: flag,
GinCtx: ginCtx, GinCtx: ginCtx,
Session: session, Session: session,
@ -55,6 +57,27 @@ func NewContext(ginCtx *gin.Context, flag string, session *melody.Session) *WSCo
} }
} }
//CloneContext 克隆上下文信息
//
// Author : go_developer@163.com<张德满>
//
// Date : 8:07 下午 2021/4/18
func CloneContext(ctx *WSContext) *WSContext {
if nil == ctx {
return nil
}
return &WSContext{
ConnectionID: ctx.ConnectionID,
TraceID: generateConnectionID(ctx.Flag),
Flag: ctx.Flag,
GinCtx: ctx.GinCtx,
Session: ctx.Session,
Server: ctx.Server,
Data: ctx.Data,
Lock: ctx.Lock,
}
}
// generateConnectionID 生成connection_id // generateConnectionID 生成connection_id
// //
// Author : go_developer@163.com<张德满> // Author : go_developer@163.com<张德满>