

Golang 写的即时通讯服务器 gim
source link: https://github.com/alberliu/gim
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

简要介绍
gim是一个即时通讯服务器,代码全部使用golang完成。主要功能
1.离线消息同步
2.多业务接入
3.单用户多设备同时在线
4.单聊,群聊,以及超大群聊天场景 5.支持服务水平扩展
使用技术:
数据库:Mysql+Redis
组件:grpc+jsoniter+zap
安装部署
1.首先安装MySQL,Redis
2.创建数据库gim,执行sql/create_table.sql,完成初始化表的创建 3.下载代码到你本地 4.修改conf/conf.go配置文件,使之和你本地配置一致
5.分别切换到app的connect和logic目录下,执行go run main.go,启动连接层服务器和逻辑层服务器
6.切换到test目录下,启动测试脚本
7.使用public/util/aes.go的GetToken获取token
8.使用rpc接口发送消息
业务服务器如何接入
1.首先生成私钥和公钥 2.在app表里根据你的私钥添加一条app记录
3.将app_id和公钥保存到业务服务器
4.将用户通过LogicClientExtServer.AddUser接口添加到IM服务器 5.通过LogicClientExtServer.RegisterDevice接口初始化设备,获取设备id(device_id) 6.将app_id,user_id,device_id用公钥通过公钥加密,生成token,相应库的代码在public/util/aes.go
7.接下来使用这个token,app就可以和IM服务器交互
项目目录介绍
├─ app # 服务启动入口 │ ├── conn # 连接层启动入口 │ └── logic # 逻辑层启动入口 ├─ conf # 配置 ├─ conn # 连接层服务代码 ├─ ligic # 逻辑层服务代码 ├─ public # 连接层和逻辑层公共代码 ├─ sql # 数据库建表语句 ├─ test # 测试脚本 ├─ docs # 项目文档
TCP拆包粘包
遵循TLV的协议格式,一个消息包分为三部分,消息类型(两个字节),消息包内容长度(两个字节),消息内容。
这里为了减少内存分配,拆出来的包的内存复用读缓存区内存。
拆包流程:
1.首先从系统缓存区读取字节流到buffer
2.根据包头的length字段,检查报的value字段的长度是否大于等于length
3.如果大于,返回一个完整包(此包内存复用),重复步骤2
4.如果小于,将buffer的有效字节前移,重复步骤1
服务简介
1.connect
维持与客户端的TCP长连接,心跳,以及TCP拆包粘包,消息编解码 2.logic
消息转发逻辑,设备信息,用户信息,群组信息的操作
离线消息同步
用户的消息维护一个自增的序列号,当客户端TCP连接断开重新建立连接时,首先要做TCP长连接的登录,然后用客户端本地已经同步的最大的序列号做消息同步,这样就可以保证离线消息的不丢失。
单用户多设备支持
当用户发送消息时,除了将消息发送目的用户
在DB中,每个用户只维护一个自己的消息列表,但是用户的每个设备各自维护自己的同步序列号,设备使用自己的同步序列号在消息列表中做消息同步
消息转发逻辑
单聊和普通群组采用写扩散,超级大群使用读扩散。
读扩散和写扩散的选型。
首先解释一下,什么是读扩散,什么是写扩散
读扩散
简介:群组成员发送消息时,也是先建立一个会话,都将这个消息写入这个会话中,同步离线消息时,需要同步这个会话的未同步消息
优点:每个消息只需要写入数据库一次就行,减少数据库访问次数,节省数据库空间
缺点:一个用户有n个群组,客户端每次同步消息时,要上传n个序列号,服务器要对这n个群组分别做消息同步
写扩散
简介:就是每个用户维持一个消息列表,当有其他用户给这个用户发送消息时,给这个用户的消息列表插入一条消息即可
优点:每个用户只需要维护一个序列号和消息列表
缺点:一个群组有多少人,就要插入多少条消息,当群组成员很多时,DB的压力会增大
群组简介
普通群组:
1.支持离线消息同步
2.群组成员越多,DB压力越大
超大群组:
1.DB压力不会随着群组成员的人数的增加而增加
2.不支持离线消息同步
核心流程时序图
长连接登录
离线消息同步
心跳
消息单发
消息群发
github
Recommend
-
55
前言 本文翻译自Real-Time Communication with Streams Tutorial for iOS 翻译的不对的地方还请多多包涵指正,谢谢~ iOS流式即时通讯教程 从时间初始,人们就已开始梦想着更好地跟遥远的兄弟通讯的方式。从信鸽到无线电波,我们一直在努力将通讯变得更清晰更高效...
-
33
即时通讯安全篇(七):如果这样来理解HTTPS,一篇就够了
-
53
58即时通讯(以下简称微聊,亦或简称IM SDK)作为58集团即时通讯的解决方案,承载了58同城、赶集网、安居客、移动经纪人、招才猫等商业产品线的用户在线沟通能力。目前支持iOS、Android、Web、H5等所有平台。为了满足58集团不断增长的业务...
-
53
本文引用了“蔷薇Nina”的“Nginx 相关介绍(Nginx是什么?能干嘛?)”一文部分内容,感谢作者的无私分享。 1、引言
-
54
程序员 - @imndx - 我们搞了一套开源的 IM,随着时间的推移,开始有人找我们定制开发,故有此疑问,希望大神能解答。另外,如何能规避?如果有人对我们的 IM 感兴趣,可以在这儿围观:http
-
39
2019 年,微信月活账号数量达 11.12 亿,每天发送 450 亿次信息,成功连接 4.1 亿次音视频通讯。据中国互联网协会发布的《中国互联网发展报告 (2019)》,截至 2018 年底,我国网民规模达到 8. 29 亿。从一个线上的即时通讯(IM)软件到逐...
-
18
作者: “Lightning 上的即时通讯软件有出现杀手级应用程序的潜力吗?” 当 Lightning Labs 开发者 Joost Jager 首次展示他的...
-
11
本文来自微信公众号: 零售威观察(ID:onRetailing)
-
28
简要介绍 im是一个即时通讯服务器,代码全部使用golang完成。主要功能 1.支持tcp,websocket接入 2.离线消息同步 3.单用户多设备同时在线 4.单聊,群聊,以及超大群聊天场景 5....
-
7
云音乐大前端专栏互动直播中的前端技术 -- 即时通讯2020-06-08...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK