如何打造一个百万用户的IM后台(1)

如何打造一个百万用户的IM后台(1)

聊天应该是当代人使用频率最高的软件,相信很多java使用者在初学java中socket部分时也会自己写一个聊天软件服务器。那么,如何才能写一个能够提供百万并发能力的IM后台呢?

1

问题分析


要想写一个百万并发的IM后台,首先得知道将要面临什么样的问题,


首先是IO模型,传统的BIO模型是肯定不行的,那么就只能使用NIO了,然后linux分别有selector模型和epoll模型,selector模型虽然是非阻塞的,但是当你有一百万个链接的时候,遍历一百万个链接也是很耗时的,这对于即时性要求极高的IM是不能忍受的,而且selector模型还有很多其他的缺点,所以就采用epoll模型了。(PS:还有一种更加高级的AIO模型,不过这东西模型挺高级,但是具体实现不行,并不是太高效,性能与NIO差距不大,不知道现在发展的如何,有兴趣可以自己看)。


java如何调用epoll?


TCP(加一层就叫socket了,主要为了简化编程难度)粘包


TCP拆包


心跳包的处理。


......................


除了上述问题外,TCP通讯中的问题其实还是多的数不胜数的,而且实际运用与理论还有一定差距(例如连接心跳包发送时间)。



2
解决方案

看到上述的那么多问题,相信你应该大概对一个IM的后台有个初步认识了,不过既然这些问题存在这么久了,那肯定有解决方案啊?是的,目前有很多成熟的解决方案,而其中最优的一个就是netty了,相信大多数接触过socket编程的都会听过他的大名的。



确实,netty是一个高性能的socket框架,同时以netty为基础写一个百万并发的IM后台对于老手来说并不难,但是netty中大量生涩的概念对于新手来说上手并不容易,而且其实netty只是让你不用面向协议编程了,你不用再去处理那些复杂的协议,就像socket对TCP的封装一样,实际项目并不能直接使用,还是偏底层,如果你需要使用他做底层,那么还需要做一大堆适配工作。


那么有没有这样一个框架,能够简单的配置一下,然后就可以直接使用,就像struts、springMVC等MVC框架那样对servlet的封装,使用时直接写接口就行而不用关心路由和session、数据处理等呢?答案是yes,现在github上就有这么一个项目,对netty进行了深度封装,同时提供了MVC能力,用户不用关心底层,直接面向应用层,像写springMVC应用一般写socket,同时提供了http不具备的主动推送功能,github地址:

https://github.com/935237604/socket(更新前是easysocket,更新自带分布式支持)

在项目的test包中 有对这个项目的使用demo,同时后续会基于这个项目做一个简单的后台,带大家一起学会如何使用。


有任何问题都可以加Q1213812243询问,随时欢迎~

附加



如何打造一个百万用户的IM后台(1)_第1张图片        

长按二维码关注我吧

不要错过


你可能感兴趣的:(java,J2EE,J2SE,IM,高并发,分布式)