IM(即时通讯系统)作为一项基本能力,在各个公司的产品中都处于一个举足轻重的地位。作为IM能力的最重要提供方,长连接网关的设计至关重要。本文以比心聊天室解决方案开源项目SONA为例,解析netty长连接网关在协议层的设计,帮助读者快速了解长连接协议。本文最后附上开源项目地址。


一、长连接网关是什么?

sona-gateway 是比心自研的长连接网关,基于 Netty 开发,同时支持 TCP 和 Websocket,承载了比心几乎所有的业务,提供超高的性能,易扩展,普通的4核8G机器,就能稳定支撑几十万连接。

如果不需要整套 SONA 服务,也可以简单修改其中的房间相关业务代码后,单独剥离出来作为网关使用,即使从来没用过 Netty,对Netty一点都不了解,也能非常方便的扩展自己的业务。使用者不用关心如何实现一个私有协议的细节,直接使用我们内置的通信协议。可以非常简单的启动客户端与服务端,同时注册自定义的请求处理器,即可完成双端通信。同时,像连接管理、心跳等基础功能特性都默认可以使用。

网关中最核心的基础通信、消息协议、请求处理器等设计都是通用的:

1. 基础通信功能

  • 基于 Netty 高效的网络 IO 与线程模型运用
  • 连接管理
  • 基础通信模型
  • 超时控制
  • 心跳与空闲事件处理

2. 协议框架

  • 命令与命令处理器
  • 编解码处理器
  • 心跳触发器

3. 私有协议定制实现

  • 二进制通信协议的设计
  • 灵活的消息压缩、合并控制
  • 请求处理超时FailFast机制
  • 用户请求处理器
  • 双工通信

二、通信协议

消息传输采用定制的二进制协议,基于 request-response 模式设计

1、协议介绍

key 字节数 说明
req/res 1 1表示request , 0表示response
twoWay 1 是否需要回复response ,1 需要, 0 不需要
heartbeat 1 是否心跳 ,1是 , 0 不是
version 1 版本号
id varint 请求或响应的id(从1开始递增,单连接不重复),如果是request请求并且twoWay是false ,设置 0
cmd 1 command 命令,每个command都有对应的请求处理器
length varint 所有 header + body 的大小
headerSize 1 header 的个数
headerType 1 header 的类型
headerLength varint header data 的大小
headerData headerLength header 的数据内容
body length - 所有header的大小 消息体

如果是心跳,只有 req/res,twoWay,heartbeat,version,id

采用 Request-Response 模型,主动发起请求的为 request,request 有2中模式:

  • 一种是 oneway,request发出去之后,不关心结果,不做超时控制,不需要对端返回 response
  • 一种是 twoway,request发出去之后,需要在指定的超时时间内,等到对端返回response。如果超时时间内没有得到结果,那么会抛出超时异常

客户端和服务端都可以主动发起 request

为了防止业务处理耗时过久,每个request都会设置超时检测,超时之后会立即 failfast,返回超时失败

2、Header 扩展

目前开源版本提供了 3种 header,可以自由扩展

headerType description
1 开启body压缩 (body 超过 2048 字节进行压缩, Deflater 算法)
2 房间header ,每个房间相关的command请求都会带上
3 开启批量合并,body中包含多条消息,需要额外解析

可以自行扩展 Header ,在 cn.bixin.sona.gateway.common.HeaderEnum 中添加自定义的Header,并在相应的业务逻辑中使用即可

3、CMD 扩展

cmd description
-1 服务端告知客户端断开连接
1 客户端连接登录认证
2 客户端主动上报消息
10 加入房间
11 离开房间
12 发送房间消息
13 发送房间指令
14 发送群组消息

可以自行扩展 CMD ,在 cn.bixin.sona.gateway.common.CommandEnum 中添加自定义的 command,并新增对应的请求处理器

  1. 在 /META-INF/mercury/cn.bixin.sona.gateway.handler.Handler 文件中添加cmd 和处理器 的映射, key是 cmd (多个可用逗号隔开),value是 处理器的bean name
  2. 新增自定义请求处理器,只需 extends AbstractHandler,并实现相应的业务逻辑处理即可

默认提供的3个Handler 处理器

1=loginAuth
2=clientPush
10,11,12=chatRoom

总结

本文仅仅简单介绍了SONA中的长连接网关,在后续的系列文章中会对网关中的技术细节进行详细的介绍。

目前sona已经在比心的github仓库上开源,仓库地址:

https://github.com/BixinTech/sona

欢迎你访问我们的项目,有任何想交流的想法可以留言联系我们。

从0到1快速了解netty长连接网关协议相关推荐

  1. Java Netty长连接实现Android推送

    罗嗦几句: 1.轮询(Pull)客户端定时的去询问服务器是否有新消息需要下发:确点很明显Android后台不停的访问网络费电还浪费流量.2.推送(Push)服务端有新消息立即发送给客户端,这就没有时间 ...

  2. 知乎技术分享:知乎千万级并发的高性能长连接网关技术实践

    本文来自知乎官方技术团队的"知乎技术专栏",感谢原作者faceair的无私分享. 1.引言 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你 ...

  3. 图文:千万级高性能长连接网关是如何搭建的?

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  4. 知乎千万级高性能长连接网关是如何搭建的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:https://www.xttblog.com/?p=487 ...

  5. 知乎千万级高性能长连接网关揭秘

    https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它 ...

  6. 图文:知乎千万级高性能长连接网关是如何搭建的?

    实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背后都离不开长连接技术的加持. 每个互联网公司里几乎都有一套长连接系统, ...

  7. plsql保持长连接_知乎千万级高性能长连接网关是如何搭建的

    作者:@faceair @安江泽原文:https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如 ...

  8. 案例精选 | 知乎千万级高性能长连接网关揭秘

    实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背后都离不开长连接技术的加持. 每个互联网公司里几乎都有一套长连接系统, ...

  9. 亿级流量架构演进实战 | 架构演进构建TCP长连接网关 04

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

最新文章

  1. java感谢_这三天看完Java入门第一季和第二季的成果!纪念一下!感谢Java入门的作者!...
  2. PHP中include()与require()的区别说明
  3. wxWidgets:wxMultiChoiceDialog类用法
  4. Command ‘ifconfig‘ not found
  5. kotlin读取sd卡里的文件_Kotlin 读取文件
  6. vi/vim多行注释和取消注释
  7. Mate 30 不预装任何谷歌应用;阿里巴巴发布新“六脉神剑”;VS Code 1.38 发布 | 极客头条...
  8. 命运由我们自己抉择!
  9. 每日三道前端面试题--vue 第二弹
  10. 智能优化算法:原子搜索优化算法 -附代码
  11. jquery插件实现分页
  12. python爬虫之cookie
  13. 从图形界面到会话界面
  14. java dns缓存清理_清除DNS缓存信息方法
  15. html语言加号点一下变成减号6,CSS3 linear-gradient线性渐变生成加号和减号的方法...
  16. 边云协同的优点_探析云边协同的九大应用场景
  17. DNSPod十问侯家文:如何为中小企业的网络安全保驾护航?
  18. 杰里之BQB认证出现的一些问题分析篇
  19. 在一个已经EXIT的docker容器中,修改配置文件
  20. 《计算机应用》期刊投稿经验

热门文章

  1. win7 64位虚拟机安装
  2. django+javascrpt+python实现私有云盘代码
  3. 名帖43 梁启超 隶书《临张迁碑》
  4. 【每日早报】2019/12/09
  5. 恭贺经纬恒润参股企业“挚途科技”实现L3级自动驾驶重卡商业化落地
  6. 北大计算机直博第五年,我选择退学,没有硕士学位...
  7. 解决VMware下安装Ubuntu 16.04 不支持1920X1080分辨率的问题
  8. 2411681-90-6,Thalidomide-O-amido-PEG4-propargyl它结合了基于沙利度胺的cereblon配体和用于PROTAC技术的PEG4连接剂
  9. 【操作系统】CSAPP学习笔记
  10. turtle画奥运五环图