简要介绍

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

linux im 服务器,GitHub - baidulinux/gim: golang写的IM服务器相关推荐

  1. goim Java_GitHub - alberliu/gim: golang写的IM服务器(服务组件形式)

    简要介绍 im是一个即时通讯服务器,代码全部使用golang完成.主要功能 1.支持tcp,websocket接入 2.离线消息同步 3.单用户多设备同时在线 4.单聊,群聊,以及超大群聊天场景 5. ...

  2. 自己写一个Web服务器(1)

    自己写一个Web服务器(1) 2016-04-13    分类:操作系统.编程开发.首页精华1人评论 分享到:更多15 本文由码农网 – 王坚原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿 ...

  3. GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器

    Golang具有运行效率高.内存安全等优良特性,因此是非常适合用来进行服务器开发.使用Golang开发游戏服务器有如下的优点: 运行效率远高于各种脚本语言,大幅度提升服务器承载能力 内存安全,不会像C ...

  4. 【Linux服务器开发系列】手写一个用户态网络协议栈,瞬间提升你网络功底丨netmap/dpdk的实现

    手写一个用户态网络协议栈,瞬间提升你网络功底 1. 网卡基础架构 2. netmap/dpdk的实现 3. 网络协议栈实战 [Linux服务器开发系列]手写一个用户态网络协议栈,瞬间提升你网络功底丨n ...

  5. 【Linux服务器开发系列】手写用户态协议栈,udpipeth数据包的封装,零拷贝的实现,柔性数组

    视频教你手写网络协议栈,保证大家能学会,耐心看 1. 用户态协议栈 2. udp/ip/eth数据包的封装 3. 零拷贝的实现 4. 零长数组(柔性数组) [Linux服务器开发系列]手写用户态协议栈 ...

  6. 微信作为一种提供即时通讯服务器,Golang 写的即时通讯服务器 im(服务组件形式)...

    简要介绍 im是一个即时通讯服务器,代码全部使用golang完成.主要功能 1.支持tcp,websocket接入 2.离线消息同步 3.单用户多设备同时在线 4.单聊,群聊,以及超大群聊天场景 5. ...

  7. Golang编写简单图片服务器

    Golang编写简单图片服务器 图片服务器 最近的开发过程中,遇到一个问题,就是大量零碎图片的存储,最后我决定研究一个简单的图像服务器,以解决图像文件存储的性能问题.在此,写一篇博文记录我经历的思想过 ...

  8. 使用Golang开发手游服务器的感想

    从最初决定使用Golang开发游戏服务器(参考这里),到服务器基本成型,经过了两个多礼拜的时间.这里记录一下感想和心得.具体Golang的使用经验将来有时间会再开篇文章来写. 两个礼拜的时间,完成了G ...

  9. linux下最简单多线程单文件socks5代理proxy服务器程序(仅一个c文件,带详细注解)

    2020.9.11 网上看的都比较复杂,GITHUB找了一个多线程的相对简单的MicroSocks项目,花了几周时间(没办法,菜鸟一个)改了一下,改成单文件,测试OK. /* wxl_socks5_p ...

最新文章

  1. python英文文献_python英文文献
  2. oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...
  3. 【springboot异常处理】用异常信息枚举类处理异常,使用自定义异常封装异常对象,返回统一异常处理结果
  4. 用maven搭建 testNG+PowerMock+Mockito测试框架
  5. 物联网通信协议介绍对比
  6. js json转xml(可自定义属性,区分大小写)
  7. java定时器报错,定时器设置报错
  8. REVERSE-PRACTICE-BUUCTF-20
  9. C++ 深拷贝和浅拷贝
  10. [VSTO系列]二、简单的UI设计/QQ联系人导出(上)
  11. spring listener监听器
  12. WCF开发实战系列四:使用Windows服务发布WCF服务
  13. 测试 JavaScript 函数的性能
  14. 常见的深度学习面试题及解答(一)
  15. SaaSpace:11 款最佳免费备份软件工具
  16. 小米扫地机器人一直提示安装尘盒_忘记放回小米扫地机器人的尘盒 居然打开新彩蛋...
  17. 在Ubuntu 20.04上面搭建嵌入式开发环境
  18. ThinkPHP5.0.11Day01: composer 、助手函数、配置文件
  19. 七大排序----SevenSort(希尔排序)
  20. 网站登录密码忘记后,通过向手机发送验证码实现找回密码的实现方法

热门文章

  1. 如何用ChatGPT使开发效率提高50%以上?
  2. PS临摹站酷赛事主题网站的设计总结
  3. c语言flip用法,C++ bitset::flip()用法及代码示例
  4. 酷比魔方i7 安装android x86 无线调试
  5. hr提的工资可以商量么_但是我可以商量
  6. 小米手机如何升级Android版本,MIUI官方公布小米手机升级Android Q计划
  7. 苹果手机计算机软件不见了怎么办,iphone4手机的设置图标不见了怎么解决
  8. 北漂的程序猿何去何从
  9. linux 重启服务器脚本,linux下服务器重启shell脚本
  10. antd去掉表格边框