Closed yx2387 closed 5 years ago
这里可以优化写法可能比较清晰,之前主要是考虑在job进行消息marshal好进行直接推送raw对comet不用再进行writeProto,其实对broadcast、room的消息效果会比较好一些,push user其实直接推送也可以。
依照上述的解释可以理解在以下程式码有做这件事 https://github.com/Terry-Mao/goim/blob/master/api/comet/grpc/protocol.go#L102 确实在job只做一次marshal,之后comet就不必在推送给每一个user时都做一次writeProto
那WriteWebsocket是不是也应该有这个逻辑? https://github.com/Terry-Mao/goim/blob/master/api/comet/grpc/protocol.go#L185
是不是应该在
if buf, err = ws.Peek(_rawHeaderSize); err != nil {
return
}
上面寫如下
if p.Op == OpRaw {
err = ws.WriteBody(p.Body)
return
}
后来看了examples/client.js发现我的理解有错,不用增加我上述的判断 因为job会做房间消息聚合,所以需要做WriteWebsocket逻辑让header可以说明body内总长度 再用for批次拿出每一条消息
websocket这边确实需要多处理一次 batch body,而tcp那边倒是不用直接raw stream
新年好,
https://github.com/Terry-Mao/goim/blob/master/internal/job/room.go#L60-L95 在pushproc里, channel中的Proto被encode成byte array传到broadcastRoomRawBytes中
https://github.com/Terry-Mao/goim/blob/master/internal/job/push.go#L80-L88 在broadcastRoomRawBytes里, 又被放在另一个Proto的body里
请问这是一个bug吗? 谢谢!