最近跟朋友探讨一种支持大量在线用户的推送服务架构,有点心得。
涉及到的Actor包含:
User A,UserB
Conn Server
Real Server 1,Real Server 2,Real Server 3(可以是mosquitto)
Memcached(MongoDB,这里是指Key-Value DB)
Logic Server 1,Logic Server 2.
通过以上的Actor架构可以实现一套动态集群系统,当系统需要扩容的时候,简单的增加某组Actor服务器即可(点击看大图)。
上图中几个重要细节:
1 User A同Conn Server之间是短连接,只获取最小负载的MosQuitto Server的地址及端口,返回给User A或者User B,然后User A或者User B开始同所得到的MosQuitto Server i开始长连接。
2 Conn Server和 MosQuitto Server保持着长连接,这样可以实时得到任意一台MosQuitto Server的当前连接用户,也就可以将最小压力的MosQuitto Server服务器给当前请求用户。
3 假设情形User A连接了MosQuitto Server 1,User B连接了MosQuitto Server 2,这时候,User A要发送消息给User B,系统的工作流程如下图:
点击看大图:
4 当发现连接的移动终端数量大的时候,增加一台或者多台Misquitto Server。
5 当发现数据操作压力增大,扩展Memcached或者MongoDB类的Key-Value DB。
6 当发现系统吞吐量处理不过来的时候,可以增加Logic Server。
补充说明:
1 Misquitto的主Socket线程采用的是select模型,该模型未能发挥出来网络IO的性能,如果重构,可以考虑使用IOCP或者epoll进行修正。提高单台服务器的实时连接数,当用户量多的时候,可以减少一半的Misquitto服务器数量。
2 当需要对未在线用户进行数据转发的时候,需要考虑将数据进行半存储半内存化,具体的逻辑还需要按照需求来设计定义。可以考虑Redis进行部署。
3 如果要考虑给第三方提供接口的时候,需要设计鉴权系统,可以通过OAuth 2.0进行鉴权处理。
参考文章:
1 http://blog.nosqlfan.com/html/1329.html
2 http://blog.nosqlfan.com/html/3086.html
3 http://www.mysqlab.net/blog/tag/nosql-2/
4 http://code.google.com/p/spcached/wiki/benchmarktool
5 http://www.cnblogs.com/chinacloud/archive/2010/11/08/1871592.html
6 http://blog.nosqlfan.com/html/3729.html
7 http://blog.nosqlfan.com/html/3346.html
8 http://blog.hesey.net/2011/04/introduction-to-nosql.html
9 http://blog.csdn.net/captain_gbt/article/details/6936590
10 http://www.iteye.com/topic/77560
11 http://database.51cto.com/art/201010/231410.htm
-END-