goim 文章系列(共5篇):html
- goim 架構與定製
- 從goim定製, 淺談 golang 的 interface 解耦合與gRPC
- goim中的 bilibili/discovery (eureka)基本概念及應用
- goim 的 data flow 數據流
- goim的業務集成(分享會小結與QA)
有個 slack 頻道, 很多朋友在交流 goim , 歡迎加入slack #goimgit
[簡述] goim.io 是 很是成功的 IM (Instance Message) 即時消息平臺 , 本文介紹 goim 中的數據定義與 data flow 數據流轉github
看圖golang
數據流轉web
上示意圖標註了 goim 中的關鍵數據結構:redis
發佈 im 信息定義( 在 protobuf 中的定義)json
message PushMsg { enum Type { PUSH = 0; ROOM = 1; BROADCAST = 2; } Type type = 1; int32 operation = 2; int32 speed = 3; string server = 4; string room = 5; repeated string keys = 6; bytes msg = 7; } 複製代碼
當 tcp client 或 websocket client 鏈接 comet server 時, comet 以 gRPC 向 logic 進行內部通信, 生成會話數據, 存在 redis 中, 具體細節不展開, 看代碼api
當 http client 向 logic 發送 im 消息時, logic 向 redis 查詢會話數據, 對於已經存在的 room--> server / mid ( memberID) --> server 即發送消息到 MQ , 該部分代碼比較清楚, 也再也不加說明緩存
推送 im 信息, 對象名稱爲 proto, 在 protobuf 中定義bash
message Proto { int32 ver = 1 [(gogoproto.jsontag) = "ver"]; int32 op = 2 [(gogoproto.jsontag) = "op"]; int32 seq = 3 [(gogoproto.jsontag) = "seq"]; bytes body = 4 [(gogoproto.jsontag) = "body"]; } 複製代碼
protobuf 文件 github.com/Terry-Mao/g… 中第12行
tcp / websocket 數據包組包/折包操做在 /api/comet/grpc/protocol.go
由上圖可見, goim 在 tcp /websocket 數據包的數據包定義, 與 go 中 proto 定義, 多了, 數據包總長度 / 包頭長度兩個字段
簡化數據流轉, 從發送端數據到 接收端數據, 能夠看到, serverID / roomID / channel ( 用 mid 或 key 來指示) 的主要做用做爲分流/分發用, 在最後推送數據包中, 就不在包含這三個字段了.
同時, comet 中使用了 ring buffer 來緩存一個 channel 送達的多條信息並推送到終端, 這裏, 並無看到對推送下發的信息做更多處理.
_
_
看代碼, 補充細節
// Channel used by message pusher send msg to write goroutine. type Channel struct { c *conf.CometConfig Room *Room CliProto Ring signal chan *grpc.Proto Writer xbufio.Writer Reader xbufio.Reader Next *Channel Prev *Channel Mid int64 // ######### memberID Key string IP string watchOps map[int32]struct{} mutex sync.RWMutex } 複製代碼
這裏:
_
_
從 logic 自 http 的 post 請求中, 獲取發佈 im 信息後, 序列化發到 MQ, 在 job 中拆包反序列化, 再組包, 這一步驟對性能是否有影響, 需發測試數據來定位, 但我的感受, 這幾回拆包組包, 有點重複.
以上, 應開源社區的朋友要求, 對內部數據結構做了一個簡化分析, 花時很少,水平有限, 或有考慮不周或分析不當, 歡迎批評指點.
最後, goim.io 在網絡上相關文章很多, 好文很多, 給我啓迪, 一併感謝.
推薦如下文章:
再一次, 感謝 www.bilibili.com 的開源 & 毛劍 及衆多開源社區的前輩們,朋友們
_
網名 tsingson (三明智, 江湖人稱3爺)
原 ustarcom IPTV/OTT 事業部播控產品線技術架構溼/解決方案工程溼角色(8年), 自由職業者,
喜歡音樂(口琴,是第三/四/五屆廣東國際口琴嘉年華的主策劃人之一), 攝影與越野,
喜歡 golang 語言 (商用項目中主要用 postgres + golang )
_