我的前一篇博客文章"谈谈Facebook的聊天系统架构", 对Facebook的聊天系统架构进行了分析. 其中的有些思想和系统划分, 对即使不是做聊天系统, 如一般的网站系统, 也是很有借鉴意义的. 例如其中的在线状态服务器(Presence).
在线状态服务, 是这样的一个服务, 它维护了网站当前的在线用户列表, 接受其它模块的查询. 是实现统计网站同时在线人数, 维护在线用户列表等功能的基础服务. 在Facebook的聊天系统中, 在线状态是为聊天系统服务的, 所以在线状态是一种"强"在线, 也即用户保持着和Comet服务器的连接, 可随时接受服务器推送(push)的消息.
但在一般的网站应用中, 不要求强在线, 一般的在线即表示用户在最近几分钟刷新了网页. 而且, 网页中还可以用JavaScript启动一个定时器, 定期报告在线状态, 也就是向在线状态服务器发送心跳包.
对于某个同时在线100万人, 每天1亿PV的网站来说, 在线状态服务器一天接收到的心跳包大概是10亿个, 也即每秒10000个请求(10000qps). 要实现这样的在线状态服务器, 也是一个挑战.
最常见的实现方式, 就是 PHP + MySQL 的方法, 服务器在接收到心跳包时往数据库表插入一条用户在线记录, 或者更新这条记录的时间字段, 然后还有一个定时清理超时用户的进程. 这种方式 MySQL 很容易成为瓶颈.
于是, 第二种方法出现了, 就是把 MySQL 换成 Redis. 但是, PHP 本身的损耗也很大, 要单台服务器达到 10000qps 的性能几乎不可能.
再有一种方案就是用 C/C++ 开发专用的 HTTP 服务器, 完全整合逻辑处理(如 PHP)和存储(Redis). 因为这是一个专用的 HTTP 服务器, 可以只需要支持 HTTP 协议的一个精简子集, 可以用现成的库如 libevent 来做. libevent 同时提供了网络框架. 而存储部分, 可以设计一个精巧高速的内存数据结构, 应该可以比 Redis 性能高一些, 因为 Redis 是通用存储, 性能会有一些损耗. 根据 Redis 30000 到 50000 qps 的能力, 这样的一个 C/C++ 内存逻辑服务器应该能轻松达到单台服务器处理速度 10000qps, 也即每天处理 10 亿个请求.
看我博客的同学, 如果你能做出这样的一个服务器, 欢迎把 github 地址发给我, 大家一起交流.
补充: 其实本文是想通过这个例子来招聘人才.
MsgBus负责运送消息,负责将Comet之间连通,Comet和MsgBus之间通过Zookeeper做服务发现和协调,实现伸缩性和高可用,目前我们做的是一个特别小的东西,只是负责内部多服务器之间消息转发,计划服务器内部吞肚量能达到100万QPS+,当然,如果加入更多的业务,这个量会少。
没有看过FB的那套设计,但发现自己的设计跟FB有很多相似的地方。
BTW, 语言用的Golang~ Reply
嘿嘿,你说的东东,我早做过了,上面那BLOG,就是我用C++写的,
完全C++ 和MYSQL实现的BLOG系统,用来做个小站也是没问题的, Reply
这个已经开源了:
https://github.com/0xsky/xblog/ Reply
以及淘宝定制的 Tengine http://tengine.taobao.org/download/taobao_nginx_2012_06.pdf
提到了单机4万 QPS Reply