由于原先的appserver功能不斷增多,最近又增了兩個(gè)功能,需要不斷從后端memcached中提取數(shù)據(jù)并進(jìn)行計(jì)算,由于提取數(shù)據(jù)量大且頻繁,導(dǎo)致效率很低,粗測(cè)了一下,獲取數(shù)據(jù)和格式化等操作花了90%以上的時(shí)間,由此設(shè)想將memcached改寫或重寫一個(gè)支持memcached的服務(wù)器,將計(jì)算功能和memcached做到一起,讓獲取數(shù)據(jù)的路徑最短,也就最大限度減少了數(shù)據(jù)傳輸和格式化等操作,就是類似存儲(chǔ)過程一樣啦,這部分可以考慮使用插件來實(shí)現(xiàn),甚至可考慮使用腳本語言來實(shí)現(xiàn)。
網(wǎng)上搜了一下,果然發(fā)現(xiàn)早有人這么干了,正所謂英雄所見啊,呵呵。具體方法倒很多,自定義key命名,根據(jù)特殊key在get、set、replace上做特殊操作,或者根據(jù)命令中的flag等做特殊處理,或者擴(kuò)充stat命令等,都是可以的,我們暫時(shí)就考慮修改特殊的鍵值做特殊處理。
要做一個(gè)完備的既支持ascii命令又支持binary命令的兼容memcached還是有一點(diǎn)點(diǎn)麻煩的,我暫時(shí)也沒有太多需求,所以就僅支持了ascii命令,其實(shí)也是考慮支持ascii的客戶端更多,各種語言的支持mc的客戶端數(shù)不勝數(shù),但大多只支持ascii命令。由于我之前為了測(cè)試服務(wù)器框架效率,做過一個(gè)支持ascii命令的memcached兼容版本,因此拿過來直接使用太方便了,這個(gè)版本的實(shí)現(xiàn)其實(shí)很容易,如果有一個(gè)較好的框架代碼的話基本上在一天之內(nèi)可做完,當(dāng)然要做到很好可能需要多花一些時(shí)間,我現(xiàn)在做的也不是特好,要完全取代memcached使用還是有些差距,主要是一些過期機(jī)制等沒完全實(shí)現(xiàn),雖然速度上比標(biāo)準(zhǔn)mc版本還要快一點(diǎn),呵呵,因?yàn)闀簳r(shí)的確是不需要這些過期機(jī)制,所以也沒打算這個(gè)版本實(shí)現(xiàn),其他功能基本上都有。
以后準(zhǔn)備將這個(gè)memcached解碼部分作為一個(gè)單獨(dú)的解析器,和支持其他協(xié)議一樣,換上這個(gè)解析那就支持mc協(xié)議了,還是很方便的,以后有空還是要做個(gè)支持binary協(xié)議的,以便可以更高效的解決問題。
想到server能支持Memcached協(xié)議真是好啊,客戶端基本只要用個(gè)libmemcached就好了,多服務(wù)器分布,容錯(cuò),多份數(shù)據(jù)啥的都有現(xiàn)成的解決方案,只要把server做穩(wěn)定了就基本ok了,對(duì)咱這種小團(tuán)隊(duì)來說再合適不過了,節(jié)省了很多開發(fā)維護(hù)成本啊,現(xiàn)在內(nèi)存這么便宜,部署幾個(gè)點(diǎn)實(shí)在是很easy的問題。