/goku-im

IM采用netty4开发的聊天后台服务,采用redis,mq,mysql,spring架构。

Primary LanguageJava

MM-IM


IM项目具体模块如下:
1、connector集群,主要实现底层通讯框架(netty4)、通讯协议制定(二进制json)、消息分发逻辑和接口实现(登录,发消息等)。
2、logic集群,主要实现离线消息存储。
3、dispatcher,主要实现connector活跃机制(keepalive)和负载均衡服务。
4、pushservice,主要实现内部接口协议和消息分发逻辑。
5、持久化及缓存,主要实现register store结构设计、msg queue及push queue 设计和消息缓存设计(redis)。

================================================================
Quick Start
================================================================

![系统架构图](http://xiangce.baidu.com/picture/detail/c05745190831956ac72ce9fb35e7bcbcc77765d0)

dispatcher service : 负责为客户端分配connector集群的服务器IP, 实现负载均衡
register store : 负责存储客户端对应的connector集群中服务器IP以及用户token
connector 集群 : 负责和客户端保持长连接, 不负责具体业务细节, 将接收到的消息添加到msg queue 队列供logic集群处理,并且从push queue中获取数据推送至客户端 
Auth : 用户验证服务, 负责提供用户身份校验
msg queue : 消息队列, 负责承载客户端发送的消息, 采用redis List结构实现
push queue : 推送队列, 由logic集群进行填充,负责消息转发
logic 集群 :  负责处理具体业务逻辑,并将消息存储到redid、mysql和push queue中
mysql : 永久存储用户的消息
redis :  缓存用户的私聊,群组的消息索引以及离线消息等
push service : 负责推送外部消息, 如加好友,系统消息等


准备:
1. 启动dispatcher 服务
2. 启动connector集群服务, 并向dispatcher注册, dispatcher负责和connector保持   keepalive来实时监测connector存活状态

流程:
1: 客户端通过http请求向dispatcher服务申请一个可用的connector

2-4: dispatcher服务访问register store来获取每个connector的连接情况, 并通过负载均衡算法(待定), 选择一个最优的connector返回给客户端(包括重连)

5-8: 客户端通过dispatcher返回的connector进行长连接请求, 如果为登录请求,connector请求auth服务来验证用户,如果验证成功,则connector本机存储用户的连接通道(channel),并将用户和connector的对应关系以及用户的token存储到register store中供logic查询.如果验证失败,则connector返回错误信息并断开连接.如果为普通消息,则将消息分发至后端的msg queue中

9-12: logic集群从msg queue中获取待处理的消息,经过业务处理, logic集群通过访问register store 获取到目标用户对应的connector, 如果未能获取到用户的connector,证明用户已掉线,将消息保存至redis中(离线消息),如果成功获取到用户的connector,证明用户在线,将推送的消息分发至connector 对应的push queue中,connector集群从自己对应的push queue中获取要发送的数据,查找本地保存的用户连接通道,如果可以找到,证明用户在线, 将消息推送至客户端,如果没找到,则证明客户已掉线,将消息保存至redis中(离线消息)
			
13-14: logic集群将消息异步存储到mysql和redis中

================================================================
Source Building
================================================================