云計(jì)算實(shí)踐2
上一篇《基于云計(jì)算的價(jià)格查詢實(shí)現(xiàn)》就算是云計(jì)算實(shí)踐1吧,所以這篇就叫《云計(jì)算實(shí)踐2》。其實(shí)今年開(kāi)始研究云計(jì)算有一段時(shí)間了,約3個(gè)月前研究md5破解(http://www.shprog.com/HashCrack.aspx),那個(gè)項(xiàng)目就是選來(lái)玩云計(jì)算的,當(dāng)時(shí)覺(jué)得md5破解這個(gè)小項(xiàng)目好玩,邏輯很簡(jiǎn)單,密碼字母組合可長(zhǎng)可短,規(guī)模可大可小,1臺(tái)機(jī)器不嫌少,1萬(wàn)臺(tái)不嫌多,所以就選中了它,沒(méi)想到第一個(gè)md5破解版本后來(lái)演變成了主要是密碼數(shù)據(jù)庫(kù)的制造,雖然第一版沒(méi)有做成標(biāo)準(zhǔn)云計(jì)算,但也算有個(gè)結(jié)果,而且存儲(chǔ)效率、制造速度還是令人滿意的,也就是說(shuō)那個(gè)項(xiàng)目只是云計(jì)算研究的副產(chǎn)品,我的本意并不是想做一個(gè)md5破解或者qq密碼破解,但結(jié)果就產(chǎn)生了這么一個(gè)產(chǎn)品,也算是努力了一個(gè)多月的結(jié)果,期間對(duì)hash算法、存儲(chǔ)格式等絞盡腦汁思考了很久,也因此對(duì)云計(jì)算倒是考慮得不多,最終偏離了大目標(biāo)。
好在后續(xù)研究基于云計(jì)算的價(jià)格查詢終于又回到云計(jì)算上來(lái)了,而且仿照google的map/reduce做了一個(gè)標(biāo)準(zhǔn)的jobserver + tasknode形式的實(shí)現(xiàn),雖然兄弟們未必對(duì)價(jià)格查詢項(xiàng)目看好,但對(duì)這個(gè)基于windows實(shí)現(xiàn)的云計(jì)算框架還是一致看好的,價(jià)格查詢項(xiàng)目第一階段基本完成預(yù)定目標(biāo),所以昨天我又將以前md5破解的東西寫(xiě)了一個(gè)在線版的dll,拿到云計(jì)算框架里面來(lái)試圖云破解,不過(guò)這個(gè)不是特別成功,主要是即時(shí)計(jì)算耗時(shí)有些多,平均1個(gè)task計(jì)算1億組合大約需要30秒,因此在我現(xiàn)在只有2個(gè)點(diǎn)參與運(yùn)算的情況下遍歷很大區(qū)間是很耗時(shí)的,也因此我沒(méi)有做一個(gè)在線云破解md5的頁(yè)面,這個(gè)工作作為研究性探索也只在我的控制端下了幾個(gè)云計(jì)算的任務(wù)就告一段落,今后將致力于其他更實(shí)用的云計(jì)算實(shí)踐。
為了做這第二個(gè)云計(jì)算的dll,我將原來(lái)定義的jobtask接口(可參見(jiàn)《基于云計(jì)算的價(jià)格查詢實(shí)現(xiàn)》)修改了一下,不再使用原來(lái)的c風(fēng)格接口,直接改成c++風(fēng)格了,如下:
interface IJobTask
{
virtual HMODULE free() = 0;
//初始化函數(shù),部署環(huán)境等
virtual bool init(bool tasknode) = 0;
//分割函數(shù),分割輸入
virtual size_t split(const char *input, size_t len, std::vector<CAutoBuffer *> &vbuf) = 0;
//task執(zhí)行函數(shù)
virtual bool map(const char *cmdline, CAutoBuffer &buf, CAutoBuffer &ibuf) = 0;
//reduce打包輸出函數(shù)
virtual bool reduce(std::vector<CAutoBuffer *> &vbuf, CAutoBuffer &buf) = 0;
//獲取執(zhí)行錯(cuò)誤
virtual char *geterror() = 0;
};
有朋友批評(píng)我,說(shuō)我的接口使用stl容器,使用自定義類(lèi)CAutoBuffer等不好,我以前也是這么跟別人講的,接口不要使用這些東西,但看了google的map/reduce實(shí)現(xiàn)用的都是MapInput、ReduceInput之后我改變了看法,暫時(shí)就這樣定義吧,大不了各個(gè)dll都用同一版本的vc編譯就是了,也沒(méi)有什么大不了的,如果不行整體升級(jí)一下總可以吧,為了短時(shí)間盯住主要目標(biāo),也只能大刀闊斧不考慮過(guò)多細(xì)節(jié)了,這也算是一個(gè)平衡的結(jié)果吧。
這次修改除了修改了接口,簡(jiǎn)化了實(shí)現(xiàn)之外,還實(shí)現(xiàn)了一些特性,動(dòng)態(tài)卸載,上一個(gè)版本裝入之后就不卸載了,要關(guān)閉exe才能卸載這些dll,所以無(wú)法熱更新,這個(gè)版本實(shí)現(xiàn)動(dòng)態(tài)卸載之后就支持熱更新了,關(guān)鍵就在那個(gè)free函數(shù),
virtual HMODULE free() = 0;
該函數(shù)實(shí)例如下:
virtual HMODULE free()
{
HMODULE h = m_hlib;
delete this;
return h;
// if(h) FreeLibrary(h); 這里釋放是有問(wèn)題的,所以不能這樣釋放
}
在外部調(diào)用的地方
FreeLibrary(jf->free());
這樣就實(shí)現(xiàn)了動(dòng)態(tài)卸載dll的功能
用上云計(jì)算布局的價(jià)格查詢的這段時(shí)間,還是有一些經(jīng)驗(yàn)教訓(xùn)的,基于這種相隔很遠(yuǎn),網(wǎng)絡(luò)條件差別很大的機(jī)器布局的云計(jì)算環(huán)境,可靠性是很差的,大多數(shù)時(shí)間可能反應(yīng)還是比較快,但有的時(shí)候反應(yīng)就特別慢,可能網(wǎng)絡(luò)延時(shí)會(huì)相差200ms,或者500ms,或者更多,我特意記錄了每個(gè)task的實(shí)際執(zhí)行時(shí)間和包括網(wǎng)絡(luò)傳輸在內(nèi)的總時(shí)間,就是從這兩個(gè)時(shí)間看出差距的,所以如果要基于這種環(huán)境做實(shí)時(shí)性很高的計(jì)算還是不適合的,如果對(duì)節(jié)點(diǎn)反饋實(shí)時(shí)性要求很高,那一定要布置類(lèi)似局域網(wǎng)形式的計(jì)算環(huán)境,點(diǎn)點(diǎn)反饋時(shí)間1ms內(nèi),而且響應(yīng)穩(wěn)定不易受到影響。此外磁盤(pán)Log時(shí)間是不定的,我記錄最后一個(gè)task完成到job完成之間調(diào)用了兩次WriteLog,對(duì)大多數(shù)job來(lái)說(shuō),最后一個(gè)完成的task的時(shí)間和job完成的時(shí)間一致,但偶爾有少數(shù)job時(shí)間和最后一個(gè)完成的task時(shí)間差別很大,甚至有超過(guò)1s的,原先沒(méi)有這么精細(xì)的測(cè)量,這次在jobserver寫(xiě)了很多log,起初是為了找錯(cuò)誤,后來(lái)是為了追蹤job和task執(zhí)行,倒是意外的發(fā)現(xiàn)了一些問(wèn)題,也獲得了一些意外的收獲。
云計(jì)算好啊,早年我做過(guò)一個(gè)遠(yuǎn)程控制的程序,當(dāng)時(shí)做了一條命令broadcast,可以廣播其他任意命令,當(dāng)時(shí)很得意于這個(gè)設(shè)計(jì),也有指揮千軍萬(wàn)馬的感覺(jué),但當(dāng)時(shí)各自執(zhí)行,結(jié)果并不匯總,各個(gè)任務(wù)完全獨(dú)立。現(xiàn)在給云計(jì)算環(huán)境下達(dá)一個(gè)任務(wù),也有同樣的感覺(jué),可能對(duì)使用我的價(jià)格查詢(http://www.oldworm.com/pps.aspx)的用戶或者使用google查詢的用戶根本感覺(jué)不到,他這一個(gè)查詢提交下去后面有那么多機(jī)器聯(lián)動(dòng)運(yùn)算,但作為開(kāi)發(fā)人員,真真切切的看到后面那么多機(jī)器在執(zhí)行任務(wù),真的是很爽的一件事情,一起看下我兩臺(tái)機(jī)器聯(lián)動(dòng)執(zhí)行任務(wù)的場(chǎng)面共勉吧:
圖看得不是很清楚,實(shí)際上第一個(gè)taskmanager是一臺(tái)機(jī)器,另一個(gè)taskmanager是另一臺(tái)機(jī)器,那兩個(gè)都是在遠(yuǎn)程桌面里面運(yùn)行的,下面ie是我的網(wǎng)頁(yè),可以看到我在網(wǎng)頁(yè)里面查詢nokia的時(shí)候,上面兩臺(tái)機(jī)器的tasknodeapp里面就接收到任務(wù)并執(zhí)行了任務(wù),那個(gè)tasknodeapp是我臨時(shí)用來(lái)演示的,事實(shí)上里面都是調(diào)用tasknode.dll,tasknode的主要任務(wù)都是tasknode.dll執(zhí)行的,為這個(gè)dll做了好幾個(gè)不同的容器,有service的有普通mfc的還有console的,這也是我的得意設(shè)計(jì)哦。
未來(lái)還將繼續(xù)云計(jì)算實(shí)踐,期待有相同興趣愛(ài)好的朋友一起交流。