这次beta沙龙请了高春辉的团队来讲他们的经验。本来我是希望老高讲,不过他说最近的系统主要是许超前在带人开发,所以实际的演讲人是许超前。
国内最早让大家意识到网站的发展阶段的文档大概就是于敦德翻译的LiveJournal发展历程的ppt。这次许超前的演讲非常类似LiveJournal的那篇。
手机之家用了7年时间,发展到1000万以上用户,3000万以上帖子,1.1TB附件,每天780万以上的PV这个规模。这个数字虽然比不上大型互联网公司,但是对一个只有几个人的技术团队,已经是一个很令人骄傲的数字了。
LiveJournal在发展中一边用着开源软件,一边造轮子,最后造出来了memcached这个简单而强大的工具,最终成了这一代网站开发离不开的东西。
这次演讲有意思的部分就是从memcached相关的事情开始的。
一 关于memcached的应用和管理。
memcached确实是个简单,好用,见效快的东西。不过简单也有简单的问题,程序员各有各的习惯,结果导致key很不规范,用什么方式的都有。这个问题恐怕用过memcached的人都深有体会。当然,用开发规范来限制程序员的行为是一个办法,但这不是技术的方法。技术的方法,是增加一个层。于是手机之家开发了一个cache管理器,把程序员和memcached隔离开,由这个层来统一管理缓存。
这是个不错的思想。当key被一个中间层接管了之后,事实上就可以给被缓存的对象实现更复杂的结构了。memcached是扁平的,只有一层。数据保存的方法仍然可以保持一层,但是通过对key的结构设计,就可以实现多层的结构,甚至在层和层之间实现继承关系,或是树结构。手机之家称之为namespace。通过这种方式,可以批量的管理和控制缓存对象。
换言之,索引结构可以复杂,但存放对象本身的地方是个key-value型的。friendfeed关于mysql应用的文档也提到了这种方法。用这种方法,可以在一个比较小的索引库中进行各种操作,无论是遍历还是查找,甚至处理一个节点下所有的值。最终得到key-value库的key。这个思路应该可以用于很多地方。
手机之家在cache上下的功夫很多,演讲稿中很多页是在讲cache系统的演变。对他们的应用方式来说,如果cache被击穿了,所有的压力到达了数据库,那么性能就会急剧下降,所以对cache的管理变的尤其重要。手机之家的这种尝试确实解决了很多问题。
二 仍然和cache有关
完成了前面说的cache管理器,他们还想更近一步,把数据访问,缓存,尤其是对库的切分整个包装起来,给程序员一个透明的接口。这样程序员不用关心到底存在多少个库,怎么分布,是否需要从cache中取数据等等细节问题。
这也是个常见问题。所有从数据库取数据的地方都要先从memcached读一次,代码很难看,也很罗嗦。这个包装完成之后,这就是一个能提高生产力的工具了。直接有效,也确实节约了开发成本。这个被他们称做DAL,很俗的名字啊:D
三 这样用java
php用来做以上的2个部件,效果并不好,效率很低。事实上php就不是干这个用的。最后他们用java+nio实现了一个性能不错的服务。把所有问题都解决了。
用在网页上java/jsp确实不如php,但是用来做服务器还是很合适的。我询问过他们是否在GC的时候遇到性能问题,答案是目前还没有。如果稳妥起见,对于这种方案,我更愿意采用C,不过考虑到团队情况,和java程序员比C更容易找到,手机之家用java来开发也是一个折中方案。
总结手机之家经验分享的意义,我觉得在于,我们很少有机会看到一个网站从0做到接近千万的PV。就算在一个大的互联网工作过,所看到也只不过是冰山一角,很难有操刀动手的机会。手机之家的成长用了7年,老高始终在带着团队做优化。这种经验很难获得。
我们常常讲,做网站好像爬山,一个陡坡,一个缓坡。我见过很多网站在50万pv之下就被技术卡住了。很多很多的公司,就在某一次上坡的时候死了。
沙龙结束后,晚上,我和老高在gtalk上又聊了很久。我觉得他们做出来的这套方案,对很多公司都有帮助。至少跨越几个困难阶段。这就好像memcached带来的,在没有memcached的时候,很多网站抗不住10万这个级别的pv,有了memcached,哪怕用的很糟糕,50万这个级别也能到了。老高这个方案或许能让很多网站进入"百万俱乐部"。
说起来做互联网,中国人比外国人难很多。我们面对的用户规模比他们大的多,但是广告价值小的多。我们做一个网站,可能在第一年就碰上了第一次性能极限,但这时候钱还没有影。外国人可能3年才到达,但是人家已经赚了不少钱,也有足够的资源来解决问题。对中国的互联网来说,有一些这种解决方案确实很有帮助。
当然,未来还是未知的。老高和手机之家是如何期待这个产品的未来的?是开源,还是做解决方案?不管怎么说,至少我相信,他们做一个不错的轮子,应该不至于只给自己用。