goim 核心组件

goim 是一个基于 Go 语言实现的高性能即时通讯框架,其核心组件包括以下四个部分:
1. Comet(接入层)
- 功能:维护客户端的长连接,负责消息的实时推送。支持 WebSocket、TCP、HTTP 等多种协议,并处理客户端的心跳检测和鉴权验证。
- 特点:横向扩展能力强,可通过服务发现动态扩容。每个连接对应一个
Channel
结构体,管理用户订阅的房间(Room)和消息推送逻辑。
2. Logic(逻辑层)
- 功能:接收客户端通过 HTTP 推送的消息,进行鉴权后将消息分发到 Kafka 消息队列;同时通过 gRPC 为 Comet 提供连接信息存储和验证服务。
- 流程:处理单推、多推、广播等消息类型,并与 Redis 交互存储用户在线状态和连接信息。
3. Job(消息消费层)
- 功能:作为 Kafka 的消费者,从消息队列中获取数据,根据消息类型(如单聊、群聊、广播)分发给对应的 Comet 节点进行推送。
- 扩展性:通过 Kafka 的 Partition 机制实现负载均衡,支持动态扩展以应对高并发场景。
4. Discovery(服务发现)
- 功能:类似 Eureka,负责各组件(Comet、Logic、Job)的注册与发现,确保集群动态扩容时服务可感知。
- 实现:采用 B 站自研的发现机制,但可通过修改配置适配其他服务发现工具(如 etcd)。
组件协作流程
- 客户端通过 Comet 建立连接,Logic 验证身份并将连接信息存储至 Redis。
- 业务方通过 HTTP 接口向 Logic 发送消息,Logic 将消息写入 Kafka。
- Job 消费 Kafka 消息后,通过 gRPC 调用 Comet 的推送接口,最终将消息送达客户端。
- Discovery 监控各节点状态,确保服务动态扩容时的可用性。
补充说明
- 存储依赖:Redis 用于存储在线用户信息,Kafka 作为消息队列解耦各组件,但两者属于基础设施而非核心功能模块。
- 扩展性设计:Comet 和 Job 可通过增加节点实现水平扩展,Logic 作为无状态服务可通过负载均衡(如 Nginx)提升吞吐量。
这些组件的协同工作使 goim 能够支撑高并发、低延迟的即时通讯场景。