goim 文章系列(共6篇):前端
[简述] goim.io 是 很是成功的 IM (Instance Message) 即时消息平台 , 本文汇总在 go夜读 组织的 goim 交流分享会后的小结java
goim 交流分享会的视频, 第一次用视频会议, 一堆问题, 请包容一下 :(c++
视频地址在 youtube www.youtube.com/watch?v=bFn…git
下面画出 goim 定制扩展, 或优化的一个可行方式github
goim 客户端, 或叫 goim 终端, 在与 goim 交互前, 应该与 AAA 或相似网元进行交互:golang
如下代码取自 /examples/goim-web/public/client.jsweb
function auth() { var token = '{"mid":123, "room_id":"live://1000", "platform":"web", "accepts":[1000,1001,1002]}' # 参见 /api/comet/grpc/prototol.go # 参见 func (p *Proto) WriteTo(b *xbytes.Writer) var headerBuf = new ArrayBuffer(rawHeaderLen); var headerView = new DataView(headerBuf, 0); var bodyBuf = textEncoder.encode(token); headerView.setInt32(packetOffset, rawHeaderLen + bodyBuf.byteLength); headerView.setInt16(headerOffset, rawHeaderLen); headerView.setInt16(verOffset, 1); headerView.setInt32(opOffset, 7); headerView.setInt32(seqOffset, 1); ws.send(mergeArrayBuffer(headerBuf, bodyBuf)); .... } 复制代码
可见 goim 进行 websocket 链接时, 上报了 token, 以下redis
{ "mid": 123, ## memberID, 便是当前 goim 会员ID "room_id": "live://1000", ## goim 会员进入的房间号, 聊天室号, 群号 "platform": "web", ## goim 终端类型 "accepts": [ ## goim 终端用户可接受哪些 room 的 im 消息 1000, ## goim 用户切换 room, 也就在这里处理啦 1001, 1002 ] } 复制代码
认证的集成处理有两处json
im 消息处理, 包括如下后端
comet 【计】:基于 HTTP长链接的“服务器推”技术,是一种新的 Web 应用架构
基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不须要客户端显式的发出请求。Comet 架构很是适合事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用,如股票交易行情分析、聊天室和 Web 版在线游戏等。
服务器推送技术(Server Push)是最近Web技术中最热门的一个流行术语,它的别名叫Comet(彗星)。它是继AJAX以后又一个倍受追捧的Web技术。服务器推送技术与最近的流行与AJAX有着密切的关系。 ------------百度百科
我我的也挺喜欢用 comet 这个名词, B格不错, 哈哈, 在个人电信相关解决方案, 这词用来取代 adapter / gateway 这两个比较常见的词 , 来表明后端服务与终端的交互链接点, 通常是部署在 proxy 或 load balance 后面, 面向终端/客户端提供接口服务的"后端的前端", 呵呵
在 goim, 默认的 MQ 采用 kafka, 这是 java实现, 有众多成功的大规模大部署长期运做商用案例的一款重量级 MQ 消息队列
新起之秀是 palsar (java 实现) , 看技术白皮书, 很是不错, 是比肩 kafka 的重量级做品, 但我没用过
activeMQ 评估比较过, 在个人评估报告中,是不推荐
rabbitMQ 用过, MQ 消息中转效率不是特别高, 也比较稳定
nsq c++ 实现, 比较低层, 效率高但不少 mq 相关业务代码得本身写, nsq 做者还用纯c 重写了 nsq , 叫 nano
nats 是 go 实现, 轻量级, 效率极好, 缺乏消息持久化, 是我我的挺喜欢的一款, 部署方便
选择 MQ , 我认为除了业务功能以外, 主要仍是看运维支持状况, 尤为是在超大规模部署状况下的运维与调优, MQ 与业务的集成,反而是比重很轻的考虑因素. 因此, 个人建议是, 选择本身运维团队/技术团队最熟悉的 MQ , 选择成功商用案例最多, 生态活跃的 MQ .
在 goim , 正如 B 站选择 kafka 同样, 应该是比较平衡的.
至于本身业务中使用哪一个 MQ , 建议就是, 让运维优先选择吧, 在运维支持下, 能稳定长期运行, 这点更为重要.
是的, 能够换掉. 对于 go , 更换成 RPCX 应该不错,能够选择 TCP / KCP 甚至是 udp 这样的底层通信协议,也能够更换 protobuf / flatbuffers / JSON 或者自定义的 RPC 数据序列化/反序列化........
但通常来讲, 不太建议更换 gRPC.
RPC 或其余通信中间件, 更换掉 gRPC 很容易, 建议开发团队综合考虑, 使用本身最熟悉最擅长的 rpc 中间件. 若是没有本身最擅长的中间件, 那就保留 gRPC 吧.
比较主流的 RPC 框架, gRPC 不是最优秀的选择, 好比 gRPC 缺乏自带的服务注册/发现, 负载均衡与调度这些商用 RPC 必要的部件, 但胜在有 google 背书, 社区还算活跃,自2018到如今, 进步还
是的, 理论上是能够的
但不太推荐这么玩
技术选型是很复杂, 但也很简单的事儿: 那就是充分考虑当前/未来的业务场景(包括业务运行的各个环境......) , 以及运维/运营/研发支撑这些业务的综合成本
虽然 goim 有长链接, 也有不错的部署架构, 但毕竟是一个消息发送/弹幕业务场景积累下来的技术模型, 而不是在游戏开发, 或通讯中间件的业务/技术积累下的最优选择
在游戏开发领域, 我是个小白. 但游戏开发有两点我认为比较重要:
- 各类游戏中会话状态数据, 以及游戏角色之间共享甚至是相互影响的生命值, 角色在场景(好比地图) 中的位置数据.........这些数据会在游戏逻辑中须要同步而且快速处理, 是一大关键
- 游戏终端与服务端之间的高效通信, 好比有名的 16ms 原则, 通信慢了, 游戏会卡顿
goim 之于游戏开发, 两个地方是能够借鉴, 一是分布式架构, 二是通信交互中数据(对于 goim 来讲是弹幕消息) 的自定义的序列化/反序列化, 以及多发消息的合并传输, 这很精巧有效啊... _
_
_
goim 系列小文章, 这一篇是终结了.
得益于喜欢开源的朋友们, 一个多月来 360度花式询问与交流, 在闲着的时间, 写了这些小文章.
2019/05/30晚上, 与70多位朋友以视频会议方式就 goim 及周边技术聊了一个半小时, 也是颇有趣的经历: 视频中的我, 特别像一个面对着屏幕的客服男, 哈.
再一次, 感谢 www.bilibili.com 的开源 & 毛剑 大神, 及众多开源社区的前辈们,朋友们
网名 tsingson (三明智, 江湖人称3爷)
原 ustarcom IPTV/OTT 事业部播控产品线技术架构湿/解决方案工程湿角色(8年), 自由职业者,
喜欢音乐(口琴,是第三/四/五届广东国际口琴嘉年华的主策划人之一), 摄影与越野,
喜欢 golang 语言 (商用项目中主要用 postgres + golang )
_
_
tsingson 写于中国深圳 小罗号口琴音乐中心, 2019/05/30, 最后更新于 2020/01/06