From 66aea48fb7322728d0f665e37b2dd818f441c26f Mon Sep 17 00:00:00 2001 From: mountain Date: Sun, 16 Jul 2023 18:39:11 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B1=84=EB=84=90=EA=B0=84=20publish=20marshal?= =?UTF-8?q?ling=EC=9D=84=20gob=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wshandler/wshandler.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/wshandler/wshandler.go b/wshandler/wshandler.go index 5408313..9a4880f 100644 --- a/wshandler/wshandler.go +++ b/wshandler/wshandler.go @@ -1,7 +1,9 @@ package wshandler import ( + "bytes" "context" + "encoding/gob" "encoding/hex" "encoding/json" "fmt" @@ -263,16 +265,19 @@ func (sh *subhandler) mainLoop(ctx context.Context) { raw, err := pubsub.ReceiveMessage(ctx) if err == nil { + buffer := bytes.NewBuffer([]byte(raw.Payload)) + dec := gob.NewDecoder(buffer) + if raw.Channel == sh.redisMsgChanName { var msg UpstreamMessage - if err := json.Unmarshal([]byte(raw.Payload), &msg); err == nil { + if err := dec.Decode(&msg); err == nil { sh.deliveryChan <- &msg } else { logger.Println("decode UpstreamMessage failed :", err) } } else if raw.Channel == sh.redisCmdChanName { var cmd commandMessage - if err := json.Unmarshal([]byte(raw.Payload), &cmd); err == nil { + if err := dec.Decode(&cmd); err == nil { sh.deliveryChan <- &cmd } else { logger.Println("decode UpstreamMessage failed :", err) @@ -305,6 +310,9 @@ func (sh *subhandler) mainLoop(ctx context.Context) { // 유저에게서 온 메세지, 소켓 연결/해체 처리 for { + buffer := bytes.NewBuffer(make([]byte, 0, 1024)) + buffer.Reset() + select { case destroyedRoom := <-roomDestroyChan: delete(rooms, destroyedRoom) @@ -330,8 +338,10 @@ func (sh *subhandler) mainLoop(ctx context.Context) { break } } - if bt, err := json.Marshal(usermsg); err == nil { - sh.redisSync.Publish(context.Background(), sh.redisMsgChanName, bt).Result() + + enc := gob.NewEncoder(buffer) + if err := enc.Encode(usermsg); err == nil { + sh.redisSync.Publish(context.Background(), sh.redisMsgChanName, buffer).Result() } case *commandMessage: @@ -358,8 +368,9 @@ func (sh *subhandler) mainLoop(ctx context.Context) { } // 위에서 break 안걸리면 나한테 없으므로 publish를 해야 함. 그러면 다른 호스트가 deliveryChan으로 받는다 - if bt, err := json.Marshal(usermsg); err == nil { - sh.redisSync.Publish(context.Background(), sh.redisCmdChanName, bt).Result() + enc := gob.NewEncoder(buffer) + if err := enc.Encode(usermsg); err == nil { + sh.redisSync.Publish(context.Background(), sh.redisCmdChanName, buffer).Result() } }