py-instantse:一个问答网站的实时搜索功能后台实现

标签: py instantse 网站 | 发表时间:2011-08-08 22:47 | 作者:(author unknown) 非狐外传
出处:http://simple-is-better.com/

最近完成了网站的后台实时搜索服务的实现,最开始的时候认为这一块难度系数比较大,需要的时间比较长,结果看来,是所有模块中实现最快的,主要原因也是之前开发的模块已经打下了比较好的基础,对Python开发后台服务也比较熟悉了,当逻辑结构理清,工具选好,实现就是水到渠成的事情。好了,不多说,开始介绍这个模块。

在网上搜了一下实时搜索的架构,大概看了几个,比较类似,主要参考的是王鹏云的这个PPT,这个主要是相对于搜索引擎来实施的,和我们的搜索有一点差别,因此在这个基础上进行了简化。当然也有比较超前的,比如使用redis这样的key/value型的内存数据库来进行搜索,速度很快,redis在我们的网站中也有使用用,但是评估了一下我们的硬件条件以及运维方面的因素,决定还是采用传统的在硬盘上索引的方式来实现。

那么接下来就是架构的简化,和工具的选择了。仔细观察王鹏云PPT上的架构图,可以发现这个架构主要可以分为三部分:

  1. Push部分:对于搜索引擎来说Push又包括两个子模块,一个是传统的Spider,另一个就是Push API。Spider就没什么说的了,这个Push API主要就是对于那些信息产生非常快的网站或者应用,例如Twitter,可以将他们的数据主动发给搜索引擎,使之能够很快被索引,如果用spider去爬,会比较慢,资源的开销也比较大。对于我们的网站来说,这个地方只需要有一个Push API就可以了,用户新产生的问题等可以直接发到Push API,然后快速建立索引。
  2. Index部分:在这里王鹏云的PPT里是使用了两个内存索引交替索引Push API发过来的数据,达到一定量之后与磁盘上的主索引合并,内存索引的主要作用其实是缓冲一下Push API发过来的大量数据,避免持续频繁的磁盘索引操作,减小I/O的开销。对于我们来说,在一定时间段内数据量还没有这么大的情况下,直接将Push API发来的数据进行硬盘索引是可以接受的,当然还需要考虑到后期存在升级的可能性,因此,对于这一部分,我们的计划是,最开始的时候可以只有一个主索引库,Index部分将接受到的数据直接写在主索引库中,查询端也从主索引库查询,就是类似一个生产者,多个消费者的模型。当数据量增大一些之后,可以进行主从分离,Index部分还是往主索引库写,读的的时候是从从库里读,然后主从库之间进行同步。当数据量再往上涨的时候,压力其实主要是在写索引的部分了,这时候可以建立内存索引库来缓冲,这时候需要处理好的就是合并和同步的时间间隔,这时候已经是伪实时的了,不过对于问答类的网站,这个也是可以接受的。
  3. Query部分:这一部分主要就是接受客户端Http请求然后返回查询结果的部分,主要需要考虑的就是并发性和相应速度。可以采用Comet长连接的方式,也可以采用传统的轮询的模式。在这里我们结合自身的情况选择了后者。

OK,大体的结构上就是这样了,然后是工具的选择,开发语言用Python就没得选了,对于第一部分的Push API,我们使用python自身的SocketServer模块进行开发,将传来的数据写到Python Multiprocessing模块的Queue中,然后Index这边就负责读,然后开始索引。在索引工具的选择上,主要看了纯Python的WhooshSphinx还有Xapian,Java写的Luence没有考虑。其中Whoosh开发比较简单,不过考虑到性能还有对中文的支持上,没有选择它,Sphinx使用的比较多,Quroa,者也都曾经用过它,不过看了看文档,它主要支持的是从数据库中查询然后建立索引,和我们这样脱离SQL数据库的Push API的方式不太相符,因此,最终选择了使用C++开发的Xapian,性能强劲,支持内存索引,也支持索引库的一写多读,而且对分布式的索引数据库支持也比较好,在建立索引时需要进行的中文分词,我们使用python的第三方模块mmseg。最后Query部分,就使用了最近常用的Gevent中的WSGI server,后面也很统一改。下面给出我们自己的实时搜索模块的架构图:

注意:图中是最终完整的设计,对于我们这样刚上线数据量不大的网站,可以适当简化,例如Xapian部分可以先只用一个主索引库,读写都在主索引库上,Query Server部分也可以只用一个,不用做负载均衡。这个图是说明,我们考虑了不同阶段系统的架构方案,保证该方案的可用性。

该模块已经开发完成,代码稍后开源,若干实施上的细节问题后面也会一并附文说明。如果对此感兴趣或者有好的建议,请联系作者Troycheng([email protected])。

代码已经开源,地址:http://code.google.com/p/py-instantse/

# 来源:弱类型


在微博上关注: 新浪, 腾讯   投稿

最新招聘

更多>>

相关 [py instantse 网站] 推荐:

py-instantse:一个问答网站的实时搜索功能后台实现

- 非狐外传 - python.cn(jobs, news)
最近完成了网站的后台实时搜索服务的实现,最开始的时候认为这一块难度系数比较大,需要的时间比较长,结果看来,是所有模块中实现最快的,主要原因也是之前开发的模块已经打下了比较好的基础,对Python开发后台服务也比较熟悉了,当逻辑结构理清,工具选好,实现就是水到渠成的事情. 好了,不多说,开始介绍这个模块.

阅读 py-web-server: 让你了解 webserver 的实现方式

- Eric - python.cn(jobs, news)
这个系统的写作目的,是让对web编程有兴趣的程序员,了解webserver的实现方式. 根据这个目的,系统遵循以下几个设计原则:. 效率,安全性,特性不是最重要的. 目前稳定使用请用stable分支,不要使用default分支. 开始是从prefork模式开始,做到threading模式,然后是poll模式,把所有python下的服务器模式学了一遍,目前是用greenlet加上epoll来做出一个高性能socket抽象,然后在上面实现rfc2616,——而且是比较完整的实现.

网站推荐:IFTTT(if this then that)

- 小皮球香蕉梨 - 有意思吧
这是一个神奇的网站,比某电视上天天放的那个广告要神奇许多. 就像它的域名 ifttt.com 一样,虽然丑却十分个性. 昨天晚上,ifttt.com 在 Twitter 被瞬间引爆,每个被邀请的人都会再拥有5个邀请名额,源源不断的邀请让 Geek 很兴奋. 那么,ifttt 到底是什么呢. 这是一个条件触发网站,当 A 条件触发时,自动激发 B 条件发生.

Facebook 网站架构

- - idea's blog
我收集到一些文章和视频, 可以带你窥探 Facebook 的架构. Facebook 承载了几十亿的用户, 它的架构(包括思想和实现)是非常值得参考的. 当然, 你要小心不要照搬 Facebook 的每一字一句, 因为任何思想和实现都是有自己的应用场景的.. Google Talk 界面开发分析. 使用Python POST任意的HTTP数据以及使用Cookie.

用BrowserID注册网站

- ashuai - Solidot
Mozilla宣布了一个实验项目BrowserID,提供了一种注册网站的新方法. 注册网站通常的方法是电子邮件验证,造成用户时间的浪费,要求用户登录另一个网站,记住另一个密码. BrowserID(源代码发布在github上)提供了一种更简单的方法,消除了电子邮件验证. 它是Verified Email Protocol实现,基于公钥系统和Mozilla的认证服务器,以确保用户身份的真实性.

ifttt、GGG与网站图谱

- babyone - cnBeta全文版
尽管伯纳斯・李(Tim Berners-Lee)在发明WWW之初,心中就有一个GGG(Giant Global Graph)的宏大梦想,但是直到Google的网页图谱、尤其是Facebook的社交图谱、Twitter的兴趣图谱之后,人们才真正意识到图谱的网络效应魔力. 不过这仍然未及伯纳斯・李的预期,他理想中的GGG是一张数据的图谱、服务的图谱,而不仅仅是网页、人或兴趣.

苹果网站的特点

- fei - 所有文章 - UCD大社区
以前听同行讲过一次apple.com,在他眼里apple.com就是丰碑,基本没有不好. 任何哲学的理论和术语都可以往它身上套,简直就是成就与完美的化身. 这问题我觉得需要拆解分层次的看,任何有特点的设计必然有其优势,也有其局限性. 我认为讲apple.com很有特点可能更合适,因为“特点”只是个中性词.

中国的大网站

- yangzhe - Jarain
//别的搜索引擎把不能搜的挑出来屏蔽,百度把能搜的挑出来让大家搜. //以Twitter为指导思想,以饭否和叽歪的关站为经验教训,以稳定压倒一切为基本原则的具有中国特色的社会主义微博. //什么博客什么校友录什么白社会什么搜狐微博都是浮云. //中国只有两个有态度的网络媒体,一个是人民网,一个是网易.

苹果网站的特点

- 图腾 - 千鳥志
以前听同行讲过一次apple.com,在他眼里apple.com就是丰碑,基本没有不好. 任何哲学的理论和术语都可以往它身上套,简直就是成就与完美的化身. 这问题我觉得需要拆解分层次的看,任何有特.

50个黄色网站

- 小汐 - 帕兰映像
一个好的黄色网站的重点并不是够不够黄,也不一定要黄色电影、黄色视频、黄色图片和黄色小说一应俱全,而是要黄的有质感有层次,欣赏起来要赏心悦目. 在浩瀚的互联网宇宙中,有无数的黄色网站. 有的你可能已经深入接触,有的你可能从未体验. 本文里面,帕兰将向你推荐50个来自不同国家的优质的黄色网站,请准备好大饱眼福.