squid 折叠回源解析
生活随笔
收集整理的這篇文章主要介紹了
squid 折叠回源解析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、 說(shuō)明
正常流程:第一個(gè)請(qǐng)求miss ,在第一個(gè)請(qǐng)求store_ok以后,以后的請(qǐng)求再訪問(wèn)相同url則是hit。?
折疊流程: 第一個(gè)請(qǐng)求處理miss回源過(guò)程中,還沒(méi)有store_ok之前,第二個(gè)請(qǐng)求進(jìn)來(lái)了。squid對(duì)該時(shí)期有兩種做法,如下:
collapsed_forwarding on ?第一個(gè)請(qǐng)求進(jìn)入miss后,即創(chuàng)建storeentry,以后的請(qǐng)求來(lái)了,就會(huì)hit。
collapsed_forwarding off ?第一個(gè)請(qǐng)求進(jìn)入miss后, 在還沒(méi)有處理源站響應(yīng)包頭之前。第二個(gè)請(qǐng)求也會(huì)miss。
二、詳解 正常流程沒(méi)什么可說(shuō)的,來(lái)說(shuō)說(shuō)折疊流程。 在說(shuō)之前先嘮叨下squid中storeSetPrivateKey和storeSetPublicKey 。 storeSetPrivateKey: 將entry設(shè)置PRIVATE標(biāo)志,通過(guò)storeKeyPrivate(url,method,id)hash 獲得一個(gè)key,并且storeHashInsert(e,key)。 一般私有只能當(dāng)前request用,其他request不可見(jiàn)。 storeSetPublicKey:將entry的PRIVATE標(biāo)志清楚、通過(guò)storeKeyPublic(url,method)hash獲得一個(gè)key,并且storeHashInsert(e,key)。這個(gè)可共用,在后來(lái)的請(qǐng)求判斷是否命中時(shí),都用publichash。
1、collapsed_forwarding on?折疊回源開(kāi)啟 第一個(gè)請(qǐng)求 a、進(jìn)入miss,clientprocessmiss,http->entrty為null,clientCreateStoreEntry->storeCreateEntry->storeSetPrivateKey. 將新建entry打上私有標(biāo)簽 b、clientprocessmiss,進(jìn)入Config.onoff.collapsed_forwarding條件分支,進(jìn)入storeSetPublicKey。 c、storeSetPublicKey是將將之前的entry(當(dāng)然此處沒(méi)有,因?yàn)榈谝粋€(gè)嘛)變成private ,將當(dāng)前的entry變成public。
?第二個(gè)請(qǐng)求 a、進(jìn)入clientProcessRequest, 進(jìn)入clientProcessRequest2,e = http->entry = storeGetPublicByRequest(r),判斷是否需緩存,如可緩存且entry不為null(當(dāng)然不為null,第一個(gè)請(qǐng)求創(chuàng)建的),則hit。 b、當(dāng)然如果源站有no_cache字段,第一個(gè)請(qǐng)求會(huì)給entry設(shè)置release標(biāo)志且不會(huì)swapout,第二個(gè)請(qǐng)求會(huì)進(jìn)入到內(nèi)存命中,然后判斷是否有release標(biāo)志,如有則miss。 2、collapsed_forwarding off 折疊回源關(guān)閉?? 第一個(gè)請(qǐng)求 a、進(jìn)入miss,clientprocessmiss,http->entrty為null,clientCreateStoreEntry->storeCreateEntry->storeSetPrivateKey. 將新建entry打上私有標(biāo)簽 b、讀事件,httpReadReply->httpProcessReplyHeader -->switch (httpCachableReply(httpState, &ncr)(是否緩存)) { case 1(可緩存):httpMakePublic(entry);)-->?storeSetPublicKey(同上) c、在第一個(gè)請(qǐng)求的回源讀事件前,可能有其他請(qǐng)求過(guò)來(lái)。 第二個(gè)請(qǐng)求 a、在第一個(gè)請(qǐng)求沒(méi)有讀到源站數(shù)據(jù)前進(jìn)入clientProcessRequest,進(jìn)入clientProcessRequest2,e = http->entry = storeGetPublicByRequest(r), 因第一個(gè)請(qǐng)求時(shí)用private key 插入道storehash,所以第二個(gè)請(qǐng)求用public key找不到entry,然后走miss流程。 b、這樣第一個(gè)和第二個(gè)請(qǐng)求都miss回源,都會(huì)有自己的storeentry。第二個(gè)請(qǐng)求產(chǎn)生的storeentry也通過(guò)第一個(gè)請(qǐng)求處理的方式a 將storeentry打上私有標(biāo)志并插入到storetable中。 c、參考第一個(gè)請(qǐng)求處理方式b,storeSetPublicKey將之前的entry變成storeSetPrivateKey,將當(dāng)前的entry變成storeSetPublicKey。
3、源站no_cache ? ??a、假如request2就是一個(gè)這樣的請(qǐng)求,它發(fā)生在在request1拿到原站的數(shù)據(jù)之前,并找到了request1創(chuàng)建的StoreEntry,而且“以為”自己hit了。而回源的reply中有Cache-Control:no-cache,那么當(dāng)request2在進(jìn)入clientCacheHit時(shí),它找到的StoreEntry中一定會(huì)有RELEASE_REQUEST這個(gè)標(biāo)識(shí)。這個(gè)標(biāo)識(shí)是httpCachableReply函數(shù)發(fā)現(xiàn)no-cache之后設(shè)置的。當(dāng)發(fā)現(xiàn)這個(gè)標(biāo)識(shí)的時(shí)候,就會(huì)從clientCacheHit轉(zhuǎn)入clientProcessMiss,重新回源,不會(huì)跟request1取到相同的數(shù)據(jù) b、進(jìn)入miss,clientProcessMiss,http->entrty不為null但lock-- > 0,clientCreateStoreEntry->storeCreateEntry->storeSetPrivateKey.? c、接步驟b。此時(shí)可分折疊開(kāi)或不開(kāi),但都會(huì)進(jìn)入到storeSetPublicKey-->通過(guò)public key找到storetable中已存在的entry(第一個(gè)請(qǐng)求的),并將其設(shè)置成私有,然后將當(dāng)前私有entry變成public,并插入到storetable d、接步驟c。這樣新的先hit后miss的請(qǐng)求所產(chǎn)生的entry永遠(yuǎn)是最新的與public key綁定。之前請(qǐng)求的entry都變成private,直到requestfree釋放。
二、詳解 正常流程沒(méi)什么可說(shuō)的,來(lái)說(shuō)說(shuō)折疊流程。 在說(shuō)之前先嘮叨下squid中storeSetPrivateKey和storeSetPublicKey 。 storeSetPrivateKey: 將entry設(shè)置PRIVATE標(biāo)志,通過(guò)storeKeyPrivate(url,method,id)hash 獲得一個(gè)key,并且storeHashInsert(e,key)。 一般私有只能當(dāng)前request用,其他request不可見(jiàn)。 storeSetPublicKey:將entry的PRIVATE標(biāo)志清楚、通過(guò)storeKeyPublic(url,method)hash獲得一個(gè)key,并且storeHashInsert(e,key)。這個(gè)可共用,在后來(lái)的請(qǐng)求判斷是否命中時(shí),都用publichash。
1、collapsed_forwarding on?折疊回源開(kāi)啟 第一個(gè)請(qǐng)求 a、進(jìn)入miss,clientprocessmiss,http->entrty為null,clientCreateStoreEntry->storeCreateEntry->storeSetPrivateKey. 將新建entry打上私有標(biāo)簽 b、clientprocessmiss,進(jìn)入Config.onoff.collapsed_forwarding條件分支,進(jìn)入storeSetPublicKey。 c、storeSetPublicKey是將將之前的entry(當(dāng)然此處沒(méi)有,因?yàn)榈谝粋€(gè)嘛)變成private ,將當(dāng)前的entry變成public。
?第二個(gè)請(qǐng)求 a、進(jìn)入clientProcessRequest, 進(jìn)入clientProcessRequest2,e = http->entry = storeGetPublicByRequest(r),判斷是否需緩存,如可緩存且entry不為null(當(dāng)然不為null,第一個(gè)請(qǐng)求創(chuàng)建的),則hit。 b、當(dāng)然如果源站有no_cache字段,第一個(gè)請(qǐng)求會(huì)給entry設(shè)置release標(biāo)志且不會(huì)swapout,第二個(gè)請(qǐng)求會(huì)進(jìn)入到內(nèi)存命中,然后判斷是否有release標(biāo)志,如有則miss。 2、collapsed_forwarding off 折疊回源關(guān)閉?? 第一個(gè)請(qǐng)求 a、進(jìn)入miss,clientprocessmiss,http->entrty為null,clientCreateStoreEntry->storeCreateEntry->storeSetPrivateKey. 將新建entry打上私有標(biāo)簽 b、讀事件,httpReadReply->httpProcessReplyHeader -->switch (httpCachableReply(httpState, &ncr)(是否緩存)) { case 1(可緩存):httpMakePublic(entry);)-->?storeSetPublicKey(同上) c、在第一個(gè)請(qǐng)求的回源讀事件前,可能有其他請(qǐng)求過(guò)來(lái)。 第二個(gè)請(qǐng)求 a、在第一個(gè)請(qǐng)求沒(méi)有讀到源站數(shù)據(jù)前進(jìn)入clientProcessRequest,進(jìn)入clientProcessRequest2,e = http->entry = storeGetPublicByRequest(r), 因第一個(gè)請(qǐng)求時(shí)用private key 插入道storehash,所以第二個(gè)請(qǐng)求用public key找不到entry,然后走miss流程。 b、這樣第一個(gè)和第二個(gè)請(qǐng)求都miss回源,都會(huì)有自己的storeentry。第二個(gè)請(qǐng)求產(chǎn)生的storeentry也通過(guò)第一個(gè)請(qǐng)求處理的方式a 將storeentry打上私有標(biāo)志并插入到storetable中。 c、參考第一個(gè)請(qǐng)求處理方式b,storeSetPublicKey將之前的entry變成storeSetPrivateKey,將當(dāng)前的entry變成storeSetPublicKey。
3、源站no_cache ? ??a、假如request2就是一個(gè)這樣的請(qǐng)求,它發(fā)生在在request1拿到原站的數(shù)據(jù)之前,并找到了request1創(chuàng)建的StoreEntry,而且“以為”自己hit了。而回源的reply中有Cache-Control:no-cache,那么當(dāng)request2在進(jìn)入clientCacheHit時(shí),它找到的StoreEntry中一定會(huì)有RELEASE_REQUEST這個(gè)標(biāo)識(shí)。這個(gè)標(biāo)識(shí)是httpCachableReply函數(shù)發(fā)現(xiàn)no-cache之后設(shè)置的。當(dāng)發(fā)現(xiàn)這個(gè)標(biāo)識(shí)的時(shí)候,就會(huì)從clientCacheHit轉(zhuǎn)入clientProcessMiss,重新回源,不會(huì)跟request1取到相同的數(shù)據(jù) b、進(jìn)入miss,clientProcessMiss,http->entrty不為null但lock-- > 0,clientCreateStoreEntry->storeCreateEntry->storeSetPrivateKey.? c、接步驟b。此時(shí)可分折疊開(kāi)或不開(kāi),但都會(huì)進(jìn)入到storeSetPublicKey-->通過(guò)public key找到storetable中已存在的entry(第一個(gè)請(qǐng)求的),并將其設(shè)置成私有,然后將當(dāng)前私有entry變成public,并插入到storetable d、接步驟c。這樣新的先hit后miss的請(qǐng)求所產(chǎn)生的entry永遠(yuǎn)是最新的與public key綁定。之前請(qǐng)求的entry都變成private,直到requestfree釋放。
總結(jié)
以上是生活随笔為你收集整理的squid 折叠回源解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: springBoot datasourc
- 下一篇: 英特尔oneAPI---跨架构实现高效率