Gobelieve 架构
im 客户连接服务器 (可分布式部署,暂无负载均衡模块)
imr 路由查询服务器(主要解决im分布式部署的问题)
ims 存储服务器 (主从部署)
基础模块
1.数据包协议
包:header(12)|body header:len(4),seq(4),cmd(1),version(1),空(2)
2.数据收发流程
accept收到一个连接
开启写线程和读线程
写线程:监听client.wt阻塞队列,一有数据就写入conn
读线程:按照数据包协议从conn读出数据包,由client.HandleMessage处理
3.几个方法
PushMessage 通过route_channel 发送 MSG_PUBLISH 给IMR PushGroupMessage 通过route_channel 发送 MSG_PUBLISH_GROUP 给IMR SaveMessage 通过IMS RPC服务 调用SavePeerMessage SaveGroupMessage 通过IMS RPC服务 调用SaveGroupMessage im_client.SendMessage 1.PushMessage 2.本地路由查询 并EnqueueMessage im_client.SendGroupMessage 1.PushGroupMessage 2.group_manager查询group 3.由group得到所有menber,对每个menber查询路由表,并EnqueueMessage im_client.EnqueueMessage 将数据写入client.wt,供发送出去
IM 模块
IM模块初始化
1.redis_pool
2.storage_pools 连接ims:3333
http服务器读取最近消息时调用
3.rpc_clients ims:13333
SyncMessage
SyncGroupMessage
SavePeerMessage
SaveGroupMessage
4.group_rpc_clients (可选)
5.route_channels 连接imr:4444
开启读写线程
写:从channel.wt管道取值并发送给imr
读:从imr接受消息,并分发给当前im节点连接用户
6.group_manager
1.load: 从mysql加载group,保存至 group_manager.groups 2.run: reids订阅 case group_create、 group_disband、 group_member_add、 group_member_remove、 group_upgrade、 回调处理 增删改查group_manager.groups case ping 脏数据检测 3.ping: 每个五分钟发送ping
7.group_message_deliver:普通群消息分发
1.init:创建本地存储文件 2.run: 监听wt管道,有数据表示有新消息写入文件 读取文件并发送
8.ListenRedis 禁言
redis订阅 speak_forbidden
接受事件推送,从本地路由查询到对应client,修改forbidden字段。
9.SyncKeyService
从 group_sync_c 和 sync_c 管道取值,保存至redis
( 客户端发送的 MSG_GROUP_SYNC_KEY 和 MSG_SYNC_KEY 消息会将消息内同步key写入对应的管道 group_sync_c 和 sync_c)
10.StartHttpServer :6666
web服务器
11.StartSocketIO :websocket
12.ListenClient :23000 处理客户端连接
ListenClient 处理流程
1.登录认证 cmd:MSG_AUTH_TOKEN
客户端将uid与token传给服务器,由redis_pool查询认证 认证成功: 1.由EnqueueMessage发送消息{cmd:MSG_AUTH_STATUS,status:0} 2.client.AddClient() 缓存本连接到本机路由表 3.client.IMClient.Login() 缓存本链接到IMR路由表 认证失败: 由EnqueueMessage发送消息{cmd:MSG_AUTH_STATUS,status:1}
2.IMClient 处理消息类型
MSG_IM: 处理IM 同步消息
MSG_GROUP_IM: 处理Group 同步消息
MSG_INPUTING: 处理Inputing消息
MSG_RT: 处理实时消息
MSG_UNREAD_COUNT: 设置未读消息数
MSG_SYNC: 客户端请求同步最新消息
MSG_SYNC_KEY: 客户端将SYNC_KEY 传至服务端
MSG_SYNC_GROUP: 客户端请求同步最新群消息
MSG_GROUP_SYNC_KEY: 客户端将GROUP_SYNC_KEY 传至服务端
RoomClient 消息类型
MSG_ENTER_ROOM:进入聊天室
MSG_LEAVE_ROOM:离开聊天室
MSG_ROOM_IM:聊天室IM消息
VOIPClient消息类型
MSG_VOIP_CONTROL: VOIP命令
CustomerClient消息类型
MSG_CUSTOMER: 顾客->客服
MSG_CUSTOMER_SUPPORT:客服->顾客
3.MSG_IM处理流程:
用户A -> B
1.SaveMessage:保存消息到目标用户B存储队列 (rpc->SavePeerMessage) 2.SaveMessage:保存消息到发送用户A存储队列(供多点登录同步消息) 3.PushMessage:外部推送消息给目标用户B(由IMR寻路由)MSG_IM 4.SendMessage:发送同步消息给目标用户B (外部推送+本地寻址发送) MSG_SYNC_NOTIFY 5.SendMessage:发送同步消息给发送用户A(多点登录)MSG_SYNC_NOTIFY 6.EnqueueMessage:给本连接回复MSG_ACK消息
4.MSG_GROUP_IM处理流程
1.由group_manager查询到指定group 2.根据Group类型: 1.HandleSuperGroupMessage: SaveGroupMessage:保存MSG_GROUP_IM消息 (rpc->SaveGroupMessage) PushGroupMessage:外部推送群消息 MSG_GROUP_IM SendGroupMessage:发送群同步通知消息(外部推送+本地寻址推送) MSG_SYNC_GROUP_NOTIFY 2.HandleGroupMessage: group_message_deliver: saveMessage:本地保存消息 MSG_PENDING_G