開源項(xiàng)目研究與應(yīng)用小結(jié)
本文就高并發(fā)敏捷WEB架構(gòu)、消息隊(duì)列/總線服務(wù)、大規(guī)模數(shù)據(jù)存儲、數(shù)據(jù)緩存等幾個(gè)大方向在開源領(lǐng)域的研究與應(yīng)用進(jìn)行總結(jié)。
高并發(fā)敏捷WEB架構(gòu)
企業(yè)級、重型
Java:
Apache + Java/Tomcat + DB
優(yōu)點(diǎn))成熟度高,豐富的開源jar包
缺點(diǎn))項(xiàng)目負(fù)載重,開發(fā)相對笨重,不適合快速演化的創(chuàng)新項(xiàng)目
已有項(xiàng)目需在某種程度上去除過度框架化,比如O/R映射,復(fù)雜的MVC框架
輕量級、敏捷
Python:nginx + python/tornado + mongodb[mysql]
PHP:
apache + php + mysql
優(yōu)點(diǎn))敏捷與成熟之間取得不錯(cuò)的平衡,輕量級,敏捷響應(yīng)需求
缺點(diǎn))第三方包的成熟度不如JAVA平臺
高并發(fā)、進(jìn)取
Javascript:
Google V8 引擎
+ node.js +
mongodb[mysql]
優(yōu)點(diǎn))基于javascript的事件模型,高并發(fā),前后端統(tǒng)一使用javascript
缺點(diǎn))不少開源產(chǎn)品的node.js封裝還在適配階段,但國外社區(qū)很活躍
偏好推薦:
輕量級敏捷框架:
nginx + tornado + mongodb[mysql]
nginx
--- 成熟度高,并發(fā)能力極強(qiáng)的WEB接入(2x
Apache)
tornado
--- Facebook旗下使用的基于事件的Python
WEB應(yīng)用框架,高并發(fā),社區(qū)活躍
mongodb
--- OO角度抽象業(yè)務(wù)邏輯,便捷的集群設(shè)置,良好的對象邏輯設(shè)計(jì)帶來高性能
mysql---
成熟度高,廣泛應(yīng)用在開源WEB社區(qū),對集群的支持逐步增強(qiáng)
偏好原因:
1)業(yè)務(wù)變化迅速,
2)潛在證券業(yè)務(wù)創(chuàng)新的WEB項(xiàng)目,
3)python學(xué)習(xí)門檻低,語言動(dòng)態(tài)魅力
消息隊(duì)列、數(shù)據(jù)總線服務(wù)
Apache
ActiveMQ
優(yōu)點(diǎn):附帶Apache
Camel項(xiàng)目整合模式,支持JMS1.1,CXF/Axis
Web服務(wù)支持
缺點(diǎn):重量級,適合整體部署,特性需求切割困難
Apache
Qpid
優(yōu)點(diǎn):遵循高級消息隊(duì)列協(xié)議(AMQP),提供C++/JAVA兩個(gè)版本實(shí)現(xiàn),消息模式可編程性比ActiveMQ方便(AMQP提供)
缺點(diǎn):AMQP協(xié)議需要掌握,存在協(xié)議負(fù)載,成熟度不如ActiveMQ
Spring
RabbitMQ
優(yōu)點(diǎn):遵循高級消息隊(duì)列協(xié)議(AMQP),提供Erlang實(shí)現(xiàn),Spring社區(qū)活躍
缺點(diǎn):愛立信Erlang語言團(tuán)隊(duì)不大熟悉,和Qpid一樣需要掌握AMQP協(xié)議,存在協(xié)議負(fù)載
ZeroMQ
確切的說ZeroMQ不是一個(gè)成品的消息隊(duì)列項(xiàng)目,而是一個(gè)通訊層次框架。ZeroMQ定位在TCP/IP之上的智能網(wǎng)絡(luò)協(xié)議層;提供通訊中的常見的多線程,APP層錯(cuò)誤處理,點(diǎn)對點(diǎn)/發(fā)布訂閱/路由等通訊模型的抽象;線程之間、進(jìn)程之間、多機(jī)之間消息通訊的無差別抽象。ZeroMQ社區(qū)放棄了AMQP協(xié)議標(biāo)準(zhǔn),追求的目標(biāo)是輕量級、速度與語言適配。
優(yōu)點(diǎn):輕量級極其高效的編程模型,多種常見通訊模式的抽象,幾乎所有主流語言的適配,方便自由修改通訊模式與組合適應(yīng)各種業(yè)務(wù)場景—Magic
缺點(diǎn):需要二次開發(fā)投入,通訊雙方必須同時(shí)使用ZeroMQ
偏好選擇:
多異構(gòu)系統(tǒng)適配,性能要求不是特別高的場景下偏向選擇相對成熟的ActiveMQ。
新開發(fā)涉及到復(fù)雜通訊的處理的場景下或者需要高效通訊的業(yè)務(wù)場景下選擇ZeroMQ。
大規(guī)模數(shù)據(jù)存儲
MySQL
Cluster
優(yōu)點(diǎn):MySQL成熟穩(wěn)定,社區(qū)非常龐大,受大規(guī)模應(yīng)用考驗(yàn)(Twitter/Facebook/QQ注:基本上都經(jīng)過修改)
缺點(diǎn):SQL模式的缺點(diǎn)
MongoDB
優(yōu)點(diǎn):面向OO的模式思考存儲適合業(yè)務(wù)抽象,方便集群,合理的OO設(shè)計(jì)帶來高性能提升。
缺點(diǎn):SQL模式的優(yōu)點(diǎn)在MongoDB中不存在了,比如多表關(guān)聯(lián)失效了,某些查詢的性能因?yàn)樘厥獾?/span>OO設(shè)計(jì)變低了(MongoDB目前采用javascript版本的MapReduce模式統(tǒng)計(jì))。
Hadoop
Hadoop近兩年廣受開源社區(qū)關(guān)注,獲得2011年度MediaGuardian最佳創(chuàng)新項(xiàng)目大獎(jiǎng)。通俗的講,Hadoop是Google存儲與計(jì)算平臺的開源版本(山寨版本)。Facebook,Yahoo大容量存儲后臺已經(jīng)采用Hadoop,淘寶在開源社區(qū)大勢高薪招聘Hadoop架構(gòu)師并已實(shí)現(xiàn)基于Hadoop的‘云梯’混搭myql實(shí)現(xiàn)即時(shí)數(shù)據(jù)推送,Hadoop的影響力可見一斑。
Hadoop分為基礎(chǔ)文件系統(tǒng)HDFS,大規(guī)模數(shù)據(jù)表存儲Hbase,數(shù)據(jù)倉庫Hive(Facebook貢獻(xiàn)),數(shù)據(jù)挖掘Mahout,高性能分布式協(xié)同ZooKeeper等幾個(gè)子項(xiàng)目。
優(yōu)點(diǎn):
集分布式存儲與計(jì)算一體,大規(guī)模數(shù)據(jù)應(yīng)用觸發(fā)而生的項(xiàng)目
缺點(diǎn):需要投入大量研發(fā)能力,屬于牛刀類型。(已經(jīng)有商業(yè)版MapR)
偏好選擇:
證券業(yè)務(wù)WEB創(chuàng)新項(xiàng)目從輕量級的角度看選擇MongoDB可以快速Imaging業(yè)務(wù)。
公司基礎(chǔ)大規(guī)模業(yè)務(wù)數(shù)據(jù)采用傳統(tǒng)的SQL方式,長期戰(zhàn)略上看甚至可以考慮往Hadoop方向上思考,但前提是能駕馭類似Hadoop這樣的平臺。
數(shù)據(jù)緩存
Memcahced
Memcahced是一款分布式高性能緩存,接口簡潔,Key=>Value+失效時(shí)間的簡單模式能解決大部分緩存問題。Nginx服務(wù)接入可直接配置memcached的緩存模式,以URL地址為Key從源頭緩存WEB請求。
優(yōu)點(diǎn):
成熟,不少linux發(fā)行版本中自帶。性能優(yōu)越,簡單易用,PHP+Memcached模式久經(jīng)考驗(yàn)
缺點(diǎn):無磁盤存儲支持(嚴(yán)格上說這是設(shè)計(jì))
Redis
Redis在近3年的發(fā)展非常迅速,出現(xiàn)了很多成功應(yīng)用的案例。Redis不完全是簡單定位于Key/Value的緩存,更準(zhǔn)確的描述是數(shù)據(jù)結(jié)構(gòu)服務(wù)器,簡單字符串映射字符串—key/value的緩存,Redis支持的非常好,同時(shí)還支持value部分更復(fù)雜操作,操作比如list、set、sortedset、hashset等等,甚至還支持Pub/Sub訂閱消息模式。
優(yōu)點(diǎn):性能卓越,比memcached略高,支持key/value數(shù)據(jù)結(jié)構(gòu)高性能計(jì)算,集群,持久化
缺點(diǎn):相對memcached成熟度還不夠(但已經(jīng)很多成功使用案例)
Ehcache
Ehcache是JAVA平臺下常見的開源緩存產(chǎn)品,O/R映射產(chǎn)品Hibernate中就采用Ehcache,我們互動(dòng)平臺項(xiàng)目中采用的緩存產(chǎn)品就是Ehcache。
優(yōu)點(diǎn):成熟,JAVA項(xiàng)目集成相對方便。
缺點(diǎn):緩存結(jié)構(gòu)相對memcached/redis有些復(fù)雜,性能低于memcached/redis(c/c++實(shí)現(xiàn))
偏好選擇:
簡單緩存業(yè)務(wù)、混搭平臺選擇memcached,可以參考大量應(yīng)用案例
性能積極進(jìn)取型的項(xiàng)目嘗試redis,嘗試redis集群高可用
研究成果在項(xiàng)目中應(yīng)用:
zeromq智能網(wǎng)絡(luò)通訊框架
公司算法交易組中涉及pub/sub模式中在嘗試使用zeromq(python封裝),我將樂意提供基礎(chǔ)的技術(shù)支持,與團(tuán)隊(duì)共享zeromq的使用經(jīng)驗(yàn)。
公司算法交易組中IPython(交互式Python版本)內(nèi)部已經(jīng)采用zeromq
基于zeromq的zbus輕量級總線服務(wù)
我們自主開發(fā)的基于zeromq的輕量級總線服務(wù)zbus,支持分布式協(xié)同,經(jīng)過多次測試,zbus在普通PC上性能保持1.3萬QPS,bus提供python和c/c++兩個(gè)版本,在輕量級的場景下可以采用。
HD投資顧問交流平臺早期已經(jīng)嘗試部署使用,但尚未接受高壓業(yè)務(wù)場景。
nginx高并發(fā)WEB接入服務(wù)
nginx類似apache,提供更好的靜態(tài)文件服務(wù),速度在2x
Apache,普通PC上能達(dá)到1.6萬QPS,nginx除了卓越的性能之外還保持其靈巧簡便的配置。目前在投資顧問交流平臺中充當(dāng)WEB接入服務(wù)。
MongoDB面向文檔(key/value)大規(guī)模數(shù)據(jù)存儲服務(wù)
MongoDB在投資顧問交流平臺中充當(dāng)唯一數(shù)據(jù)存儲服務(wù),提供集群服務(wù)。從項(xiàng)目5月份上線至今,MongoDB尚未重啟過,內(nèi)存/CPU/帶寬等要素整體表現(xiàn)穩(wěn)定。在類似的WEB項(xiàng)目中建議采用,獲取其敏捷的開發(fā)優(yōu)勢。
redis/memcached緩存技術(shù)
redis:
在互動(dòng)平臺中redis充當(dāng)計(jì)算在線用戶狀態(tài)的緩存。
memcached:
在投資顧問交流平臺中memcached充當(dāng)多個(gè)python應(yīng)用實(shí)例之間共享session狀態(tài)共享,從而避免了多個(gè)容器之間的集群
memcached在投資顧問交流平臺中的成功應(yīng)用后,我跟唐斌討論了把目前CAS單點(diǎn)登錄采用兩個(gè)tomcat容器集群(jboss組播)產(chǎn)生的難以維護(hù)擴(kuò)展問題,近期修改成后臺session共享memcached或者redis的模式。在其他項(xiàng)目中建議這種處理方案可以參考。
CAS單點(diǎn)登錄
CAS在互動(dòng)平臺項(xiàng)目中做為單點(diǎn)登錄服務(wù)
互動(dòng)平臺項(xiàng)目之初采用的是開發(fā)商獨(dú)立開發(fā)的SSO模式,但是很快就給bug和擴(kuò)展性從項(xiàng)目中拉下,在開源社區(qū)中我推薦開源廣為使用的CAS(后期由唐斌負(fù)責(zé)維護(hù)),CAS社區(qū)至今仍然十分活躍,支持幾乎所有主流語言的客戶端接入,CAS專業(yè)做安全相關(guān)的協(xié)議完善和認(rèn)證后端框架的抽象。CAS在互動(dòng)平臺這幾年的運(yùn)營中系統(tǒng)層面是穩(wěn)定的,不斷的滿足了手機(jī),python,air客戶端的SSO接入。系統(tǒng)本身的某些小問題在于我們使用的模式(容器集群,需逐步改良)以及后端的認(rèn)證框架(經(jīng)過多個(gè)層次比如TC到達(dá)用戶信息表),和CAS
WEB界面的優(yōu)化問題。CAS在WEB應(yīng)用中我認(rèn)為是SSO的不二選擇。
階段性研究方向:
1)Google V8引擎,Node.JS
高并發(fā)框架在公司項(xiàng)目中應(yīng)用的可能性
2)Hadoop(大象)
Google存儲,MapReduce計(jì)算的開源版本
3)Tornado(颶風(fēng))
Facebook旗下的重點(diǎn)開源項(xiàng)目,基于事件的高并發(fā)Python
WEB框架