Socket Netty 思维脑图
Netty-SocketIO
netty-socketIO Github
netty-socketIO-demo Github
- netty-SocketIO 代码分析图例(建议下载到本地查看,作为代码分析参考,个人源码分析学习图稿)
性能
CentOS,1 个 CPU,4GB RAM 在 VM 上运行:CPU 10%,内存 15%
- 6000个 xhr 长的轮询会话
或 - 15000 个 websockets 会话 每秒 4000 条消息
2014年客户反馈:
同时运行了 3W 个 websocket 客户端, 并设法达到了每秒 14W/s 条消息的峰值, 平均延迟不到 1秒
百万连接需要服务器量估计: 不考虑其它损耗/优化下,4C16G 机器 100台服务器左右
功能
- 1.监听前台事件
- 2.向指定客户端发送事件
- 3.将指定客户端加入指定房间
- 4.向指定房间广播事件
- 5.客户端从指定房间退出
核心功能介绍
1.源码结构
2.核心抽象
1)SocketIOServer
封装 netty 服务,对外提供一个 socket基础服务
2)SocketIOClient
封装每一个与 Server 连接的客户端为一个 SocketIOClient
3)Room 房间概念
- Namespace 命名空间: 包含多个房间、事件监听器、所有SocketIOClient, 以及基本的加入房间、离开房间,获取Clients、增加监听等操作。一般一个 SocketIOServer 一个 Namespace;已有连接监听、断开连接监听、心跳监听、
- SocketIONamespace: 包含了 Namespace 和 相关的操作 BroadcastOperations
- NamespaceHub 配置和命名空间的集线器
Room 房间: 一个网络教室(教室内经常互通信息),一个聊天群(群里经常互通信息) 等经常存在广播、单播操作的整体
- SocketIOClient 客户端连接: 指一个 SocketIOClient, 一个房间内包含多个 SocketIOClient,每个有自己的 session, 一个 SocketIOClient 可以存在于多个 Room 中,如一个学生客户端的 Socket,可以同时在多个 Room,课堂1、课堂2、聊天群1、聊天群2中
- NamespaceClient: 命名空间和Socket集合体,并提供一个 ClientHead 存储 Client 额外信息和操作,本身提供发送事件、发送信息包、监听连接、断开连接等功能
- ClientHead: 提供连接的 命名空间对象 Namespace~NamespaceClient,以及传输对象 Transport~TransportState。
- HandshakeData 握手信息处理
- AckManager Ack管理:注册、触发、缓存,给每个操作存一个 ack 任务, AckEntry 以及 AckCallback。
- CancelableScheduler 超时断开任务处理
- ClientsBox: 提供 session~ClientHead、channel~ClientHead 的映射 缓存
- Transport: 提供一个 Packet 的队列,以及绑定的 处理通道 Channel。 里面会进行 Authorize 认证, ssl 安全, handshake 握手,channel 读取等处理, 底层会使用 netty 的 ChannelInboundHandlerAdapter。
- WebSocketTransport
- PollingTransport
- SocketIOChannelInitializer: 继承 netty ChannelInitializer,进行 ack、packet、handler 等处理,并 start() SocketChannel。
- BoradcastOperations: 房间内操作的抽象:广播、单播、排除自己广播等
- MultiRoomOperations: 多房间操作
- SingleRoomOperations: 单房间操作
4)Store 客户端存储
存储 SocketIOClient信息,采用发布和订阅模式,可以监听不同 SocketIOClient 事件,并可以提供持久化机制,保证高可用。
- PubSubType: 连接、取消连接、加入房间、离开房间、广播事件
- DataListener: 监听事件并做处理
- StoreType: 内存、Redis、Hazelcast 等
5)netty 对接
- Handler Channel 处理
- InPacketHandler: 读取、解码、获取Namespace、执行监听,
- AuthorizeHandler: 认证,一般会在 Handshake 信息里处理认证,然后进行连接、激活通道、缓存、ack准备等系列操作
- JsonSupport JSON序列化处理,包编码解码中使用
总结
基于 netty Socket通信,定制一些 Channel Handler,以房间,连接为核心对象进行一些结构化数据存储,提供基本的 ping、ack、join、leave、dispatch 等业务操作
文档信息
- 本文作者:jiushun.cheng
- 本文链接:https://minipa.github.io/2021/05/03/01-netty-sockitio/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)