设为首页 加入收藏

TOP

Gobelieve 架构(转载)(一)
2019-09-17 16:47:20 】 浏览:46
Tags:Gobelieve 架构 转载

Gobelieve 架构

Gobelieve github地址

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
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2018-01-19 Xtext试用: 快速实现.. 下一篇2018-11-21 手工翻译Vue.js源码第..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目