(1). 前言
一直以来都比较好奇IM的设计,特意深入研究了一下,怕自己忘了,简略的写一篇blog出来,在这里,仅只是设计,不涉及代码
(2). IM运维部署架构
- Web提供如下服务
- 注册
- 登录
- 创建群
- 获取好友列表
- 添加好友
- 删除好友
- 管理员通过WEB界面发送消息.
- Kong四层代理
- Connection Service(对外提供服务)
- 监听8080端口,并且,向Nginx注册服务.
- 对token进行鉴权
- 向Route Servie进行元数据的注册,保持socket_id与user_id的关系
- Embed Connection Service(仅内部机器路由信息)
- 监听8081端口,并向Redis注册,同时,并保持与其它Connection Service长连接.
- Store
- 负责消息的存储
(3). IM简略表设计
在这里只是一个简要的表设计,实际还有很多可以扩展的地方.
(4). Route Service
Route Service主要负责user_id与socket_id的关系,在这里暂时用的是Redis,不过,会抽象出接口,具体的实现可以自由切换.
# 注意,在redis集群的模式下,使用lua脚本,时要保存key在同一个分片上,所以才会使用到{},否则,会报错.
# 用户上线/下线/服务器下线都通过MQ来接受消息,进行异步处理.
u_s_{user_id} : 保存user_id在哪个im服务器上,并且对应的socket_id是什么
u_s_{user_id}_time : 保存user_id对应的socket_id,以后首次登录的时间.
server_{ip:port} : 保存im服务器下,有哪些user_id和socket_id,以后,最后心跳活跃时间(主要解决,im关闭时,清除会话)
(5). 总结
还有很多值得完善的地方,比如:消息如何存储,用什么介质存储,后面有时间,再一点点的完善.