goim 文章系列(共5篇):前端
有个 slack 频道, 很多朋友在交流 goim , 欢迎加入slack #goimjava
[简述] goim.io 是 很是成功的 IM (Instance Message) 即时消息平台 , 本文汇总在 go夜读 组织的 goim 交流分享会后的小结c++
goim 交流分享会的视频, 第一次用视频会议, 一堆问题, 请包容一下 :(git
视频地址在 youtube www.youtube.com/watch?v=bFn…github
下面画出 goim 定制扩展, 或优化的一个可行方式golang
goim 客户端, 或叫 goim 终端, 在与 goim 交互前, 应该与 AAA 或相似网元进行交互:web
如下代码取自 /examples/goim-web/public/client.jsredis
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, 以下json
{
"mid": 123, ## memberID, 便是当前 goim 会员ID
"room_id": "live://1000", ## goim 会员进入的房间号, 聊天室号, 群号
"platform": "web", ## goim 终端类型
"accepts": [ ## goim 终端用户可接受哪些 room 的 im 消息
1000, ## goim 用户切换 room, 也就在这里处理啦
1001,
1002
]
}
复制代码
认证的集成处理有两处后端
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 , 建议就是, 让运维优先选择吧, 在运维支持下, 能稳定长期运行, 这点更为重要.
是的, 能够换掉.
但不太建议.
RPC 或其余通信中间件, 更换掉 gRPC 很容易, 建议开发团队综合考虑, 使用本身最熟悉最擅长的 rpc 中间件. 若是没有本身最擅长的中间件, 那就保留 gRPC 吧.
是的, 理论上是能够的
但不太推荐这么玩
技术选型是很复杂, 但也很简单的事儿: 那就是充分考虑当前/未来的业务场景(包括业务运行的各个环境......) , 以及运维/运营/研发支撑这些业务的综合成本
虽然 goim 有长链接, 也有不错的部署架构, 但毕竟是一个消息发送/弹幕业务场景积累下来的技术模型, 而不是在游戏开发, 或通讯中间件的业务/技术积累下的最优选择 _
_
_
goim 系列小文章, 这一篇是终结了.
得益于喜欢开源的朋友们, 一个多月来 360度花式询问与交流, 在闲着的时间, 写了这些小文章.
2019/05/30晚上, 与70多位朋友以视频会议方式就 goim 及周边技术聊了一个半小时, 也是颇有趣的经历: 视频中的我, 特别像一个面对着屏幕的客服男, 哈.
再一次, 感谢 www.bilibili.com 的开源 & 毛剑 大神, 及众多开源社区的前辈们,朋友们
网名 tsingson (三明智, 江湖人称3爷)
原 ustarcom IPTV/OTT 事业部播控产品线技术架构湿/解决方案工程湿角色(8年), 自由职业者,
喜欢音乐(口琴,是第三/四/五届广东国际口琴嘉年华的主策划人之一), 摄影与越野,
喜欢 golang 语言 (商用项目中主要用 postgres + golang )
_
_