您的位置:首页 > 其它

IM系统框架

2015-12-30 23:47 218 查看
今天听乔斌讲了公司IM系统的整体框架以及各部分的特点,还有一歇需要注意的问题,趁着热乎总结纪录一下。

首先分几大模块,也可以理解为几层:Entry,Logic,Router,Das。

Entry是接入层,负责管理成千上万的连接,主要处理高并发,用到了epoll,并将接收到的数据包加入一个任务队列,交给下一层处理(类似于自己完成的web服务器中处理连接及任务的流程)。

Logic是业务层,主要关心各种业务,user msg friend这几方面的业务流程。它直接与Entry和Das直连,只关心业务处理,不关心数据收发,所以数据来了之后放入任务队列,Logic从队列中取出任务后,只对任务进行处理,处理完之后就将数据包传递给Router,由Router判断该传递给哪一台Entry服务器以回发数据包。

Router是路由层,负责对数据包在各层之间进行转发。 纪录了各个用户分别来自哪一台Entry服务器。那Entry是如何得知Router转给的数据包是对那一条消息的处理呢?这里会对每一条消息都有一个消息id,这个id由Entry生成之后,在整个系统的流程中都是存在的可以用来做校验判断是哪条消息的。至于每一个数据包是用来干什么的,那就是logic里面协议的活儿了。

Das是数据层,为业务层Logic提供了一系列操作数据库的接口,业务层只关心业务,同时也会关心数据是如何存储,但是不会关心Das接口是如何实现的,这两层实现了业务和数据的分离。之后如果数据库到达瓶颈,需要切换数据库,那就直接切另一套接口,不会影响其他层次。另外,这一层还听乔斌讲到了redis,这个在内存中存取,KV存储方式的一个东西,之后要好好了解一下。

等会会上图片。

再说一下系统主要解决的几个问题。

1.无状态。logic是无状态的,它不关心用户这一条消息在传输过程中的状态,只负责处理业务。目的是为了便于扩展,当要扩展logic服务器数量时,无状态的话,就不需要同步原始状态到新的服务器上面。 优化前的Router是有状态的,现在也优化为无状态的了,优化方法是将原来的状态直接KV存储到redis中,这样随着用户量增大服务器压力增大,Router扩展也不必同步状态,并且redis可以集群,不必担心内存不足。

2.异步。用户发来的消息,Logic在处理时肯定不能串行处理,这里要异步处理,用到了多线程和任务队列。

3.不丢包。这个问题的解决看图。图片中的疑问,如果b正好离线,服务器是可以通过长连接状态得知的,这时直接将消息存到数据库,b上线时自动拉离线获取离线消息。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: