(1). 前言

一直以来都比较好奇IM的设计,特意深入研究了一下,怕自己忘了,简略的写一篇blog出来,在这里,仅只是设计,不涉及代码

(2). IM运维部署架构

"IM运维部署架构图"

(3). IM简略表设计

在这里只是一个简要的表设计,实际还有很多可以扩展的地方.

"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关闭时,清除会话)

"Route Service"

(5). 总结

还有很多值得完善的地方,比如:消息如何存储,用什么介质存储,后面有时间,再一点点的完善.