diff --git a/internal/msggateway/client.go b/internal/msggateway/client.go index caba9c729..b32130c9a 100644 --- a/internal/msggateway/client.go +++ b/internal/msggateway/client.go @@ -172,8 +172,11 @@ func (c *Client) handleMessage(message []byte) error { return utils.Wrap(err, "") } } - var binaryReq Req - err := c.longConnServer.Decode(message, &binaryReq) + + var binaryReq = getReq() + defer freeReq(binaryReq) + + err := c.longConnServer.Decode(message, binaryReq) if err != nil { return utils.Wrap(err, "") } @@ -219,10 +222,10 @@ func (c *Client) handleMessage(message []byte) error { ) } - return c.replyMessage(ctx, &binaryReq, messageErr, resp) + return c.replyMessage(ctx, binaryReq, messageErr, resp) } -func (c *Client) setAppBackgroundStatus(ctx context.Context, req Req) ([]byte, error) { +func (c *Client) setAppBackgroundStatus(ctx context.Context, req *Req) ([]byte, error) { resp, isBackground, messageErr := c.longConnServer.SetUserDeviceBackground(ctx, req) if messageErr != nil { return nil, messageErr diff --git a/internal/msggateway/message_handler.go b/internal/msggateway/message_handler.go index a8de5e0b5..dd5e00f18 100644 --- a/internal/msggateway/message_handler.go +++ b/internal/msggateway/message_handler.go @@ -16,6 +16,7 @@ package msggateway import ( "context" + "sync" "github.com/OpenIMSDK/protocol/push" "github.com/OpenIMSDK/tools/discoveryregistry" @@ -49,6 +50,27 @@ func (r *Req) String() string { return utils.StructToJsonString(tReq) } +var reqPool = sync.Pool{ + New: func() any { + return new(Req) + }, +} + +func getReq() *Req { + req := reqPool.Get().(*Req) + req.Data = nil + req.MsgIncr = "" + req.OperationID = "" + req.ReqIdentifier = 0 + req.SendID = "" + req.Token = "" + return req +} + +func freeReq(req *Req) { + reqPool.Put(req) +} + type Resp struct { ReqIdentifier int32 `json:"reqIdentifier"` MsgIncr string `json:"msgIncr"` @@ -69,12 +91,12 @@ func (r *Resp) String() string { } type MessageHandler interface { - GetSeq(context context.Context, data Req) ([]byte, error) - SendMessage(context context.Context, data Req) ([]byte, error) - SendSignalMessage(context context.Context, data Req) ([]byte, error) - PullMessageBySeqList(context context.Context, data Req) ([]byte, error) - UserLogout(context context.Context, data Req) ([]byte, error) - SetUserDeviceBackground(context context.Context, data Req) ([]byte, bool, error) + GetSeq(context context.Context, data *Req) ([]byte, error) + SendMessage(context context.Context, data *Req) ([]byte, error) + SendSignalMessage(context context.Context, data *Req) ([]byte, error) + PullMessageBySeqList(context context.Context, data *Req) ([]byte, error) + UserLogout(context context.Context, data *Req) ([]byte, error) + SetUserDeviceBackground(context context.Context, data *Req) ([]byte, bool, error) } var _ MessageHandler = (*GrpcHandler)(nil) @@ -94,7 +116,7 @@ func NewGrpcHandler(validate *validator.Validate, client discoveryregistry.SvcDi } } -func (g GrpcHandler) GetSeq(context context.Context, data Req) ([]byte, error) { +func (g GrpcHandler) GetSeq(context context.Context, data *Req) ([]byte, error) { req := sdkws.GetMaxSeqReq{} if err := proto.Unmarshal(data.Data, &req); err != nil { return nil, err @@ -113,7 +135,7 @@ func (g GrpcHandler) GetSeq(context context.Context, data Req) ([]byte, error) { return c, nil } -func (g GrpcHandler) SendMessage(context context.Context, data Req) ([]byte, error) { +func (g GrpcHandler) SendMessage(context context.Context, data *Req) ([]byte, error) { msgData := sdkws.MsgData{} if err := proto.Unmarshal(data.Data, &msgData); err != nil { return nil, err @@ -133,7 +155,7 @@ func (g GrpcHandler) SendMessage(context context.Context, data Req) ([]byte, err return c, nil } -func (g GrpcHandler) SendSignalMessage(context context.Context, data Req) ([]byte, error) { +func (g GrpcHandler) SendSignalMessage(context context.Context, data *Req) ([]byte, error) { resp, err := g.msgRpcClient.SendMsg(context, nil) if err != nil { return nil, err @@ -145,7 +167,7 @@ func (g GrpcHandler) SendSignalMessage(context context.Context, data Req) ([]byt return c, nil } -func (g GrpcHandler) PullMessageBySeqList(context context.Context, data Req) ([]byte, error) { +func (g GrpcHandler) PullMessageBySeqList(context context.Context, data *Req) ([]byte, error) { req := sdkws.PullMessageBySeqsReq{} if err := proto.Unmarshal(data.Data, &req); err != nil { return nil, err @@ -164,7 +186,7 @@ func (g GrpcHandler) PullMessageBySeqList(context context.Context, data Req) ([] return c, nil } -func (g GrpcHandler) UserLogout(context context.Context, data Req) ([]byte, error) { +func (g GrpcHandler) UserLogout(context context.Context, data *Req) ([]byte, error) { req := push.DelUserPushTokenReq{} if err := proto.Unmarshal(data.Data, &req); err != nil { return nil, err @@ -180,7 +202,7 @@ func (g GrpcHandler) UserLogout(context context.Context, data Req) ([]byte, erro return c, nil } -func (g GrpcHandler) SetUserDeviceBackground(_ context.Context, data Req) ([]byte, bool, error) { +func (g GrpcHandler) SetUserDeviceBackground(_ context.Context, data *Req) ([]byte, bool, error) { req := sdkws.SetAppBackgroundStatusReq{} if err := proto.Unmarshal(data.Data, &req); err != nil { return nil, false, err