前面提到了Dapper的三個(gè)基本設(shè)計(jì)目標(biāo),在這三個(gè)目標(biāo)中,實(shí)現(xiàn)難度最大的是對(duì)應(yīng)用層透明。為了達(dá)到既定設(shè)計(jì)目標(biāo),Google不斷進(jìn)行創(chuàng)新,最終采用了一些關(guān)鍵性技術(shù)解決了存在的問題。這些關(guān)鍵性技術(shù)概括起來主要包括以下兩個(gè)方面。
1.輕量級(jí)的核心功能庫(kù)
這主要是為了實(shí)現(xiàn)對(duì)應(yīng)用層透明,設(shè)計(jì)人員通過將DaPPer的核心監(jiān)控實(shí)現(xiàn)限制在一個(gè)由通用線程(Ubiquitous Threading)、控制流(Control Flow)和 RPC代碼庫(kù)(RPC Library Code)組成的小規(guī)模庫(kù)基礎(chǔ)上實(shí)現(xiàn)了這個(gè)目標(biāo)。其中最關(guān)鍵的代碼基礎(chǔ)是基本Rpc、線程和控制流函數(shù)庫(kù)的實(shí)現(xiàn),主要功能是實(shí)現(xiàn)區(qū)間創(chuàng)建、抽樣和在本地磁盤上記錄日志。用C++的話Dapper核心功能的實(shí)現(xiàn)不超過1000行代碼,而用Java則不到800行。鍵/值對(duì)方式注釋功能的實(shí)現(xiàn)需要額外增加500行代碼。將復(fù)雜的功能實(shí)現(xiàn)限制在一個(gè)輕量級(jí)的核心功能庫(kù)中保證了Dapper的監(jiān)控過程基本對(duì)應(yīng)用層透明。
2.二次抽樣技術(shù)
監(jiān)控開銷的大小直接決定Dapper的成敗,為了盡可能地減小開銷,進(jìn)而將Dapped泛部署在Google中,設(shè)計(jì)人員設(shè)計(jì)了一種非常巧妙的二次抽樣方案。二次抽樣顧名思義包括兩次抽樣過程。Google每天需要處理的請(qǐng)求量驚人,如果對(duì)所有的請(qǐng)求都進(jìn)行監(jiān)控的話所產(chǎn)生的監(jiān)控?cái)?shù)據(jù)將會(huì)十分的龐大,也不利于數(shù)據(jù)分析,因此DaPPer對(duì)這些請(qǐng)求進(jìn)行了抽樣,只有被抽中的請(qǐng)求才會(huì)被監(jiān)控。在實(shí)踐中,DaPPer的設(shè)計(jì)人員發(fā)現(xiàn)了一個(gè)非常有意思的現(xiàn)象,那就是當(dāng)抽樣率低至1/1024時(shí)也能夠產(chǎn)生足夠多的有效監(jiān)控?cái)?shù)據(jù),卻在1024個(gè)請(qǐng)求中抽取1個(gè)進(jìn)行監(jiān)控也是可行的,這種低抽樣率有效的原因在于巨大的事件數(shù)量使關(guān)注的事件可能出現(xiàn)的足夠多,從而可以捕獲有效數(shù)據(jù)。這就是DaPPer的第一次抽樣。最初Dapper設(shè)計(jì)的是統(tǒng)一的抽樣率,但是慢慢地發(fā)現(xiàn)對(duì)于一些流量較低的服務(wù),低抽樣率很可能會(huì)導(dǎo)致一些關(guān)鍵性事件被忽略,因此Dapper的設(shè)計(jì)團(tuán)隊(duì)正在設(shè)計(jì)一種具有適應(yīng)性抽樣率的方案。盡管釆取抽樣監(jiān)控,所產(chǎn)生的數(shù)據(jù)量也是驚人的。根據(jù)Dapper團(tuán)隊(duì)的統(tǒng)計(jì),Dapper每天得到的監(jiān)控?cái)?shù)據(jù)量已經(jīng)超過1T,如果將這些數(shù)據(jù)全部寫入Bigtable中效率較低,而且Bigtable的數(shù)據(jù)存儲(chǔ)量有限,必須定期處理,較少的數(shù)據(jù)能夠保存更長(zhǎng)的時(shí)間。對(duì)此,Dapper團(tuán)隊(duì)設(shè)計(jì)了第二次的抽樣。這次抽樣發(fā)生在數(shù)據(jù)寫入Bigtable之前,具體方法是將監(jiān)控id散列)成一個(gè)標(biāo)量z,其中0<z<l。如果某個(gè)區(qū)間的z小于事先定義好的匯總抽樣系數(shù)(Collection Sampling Coeficient),則保留這個(gè)區(qū)間并將它寫入Bigtable。否則丟棄不用。也就是說在采樣決策中利用z值來決定某個(gè)監(jiān)控樹是整棵予以保留還是整棵棄用。這種方法非常的巧妙,因?yàn)樵诒匾獣r(shí)只需改動(dòng)z值就可以改變整個(gè)系統(tǒng)的寫入數(shù)據(jù)量。利用二次抽樣技術(shù)成功地解決了低開銷及廣泛可部署性的問題。
上面的兩種技術(shù)手段解決了主要設(shè)計(jì)問題,這使得Dapper在Google內(nèi)部得到了廣泛應(yīng)用。Dapper守護(hù)進(jìn)程已成為Google鏡像的一部分,因此Google所有的服務(wù)器上都有運(yùn)行Dapper。