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() } }