阿里云做網(wǎng)站需要環(huán)境自己做一個(gè)網(wǎng)站要多少錢(qián)
主題匹配核心算法就是字符串匹配,在字符串匹配基礎(chǔ)上,會(huì)加入分段匹配需求,類(lèi)似URL的點(diǎn)分式字符串。這個(gè)算法在幾個(gè)場(chǎng)景中十分普遍。
1、應(yīng)用層的路由尋址。比如反向代理中,根據(jù)請(qǐng)求中的URL,轉(zhuǎn)發(fā)到對(duì)應(yīng)的后臺(tái)服務(wù)。
2、消息總線(xiàn)的隊(duì)列匹配。這個(gè)場(chǎng)景非常有意思,在傳統(tǒng)的消息隊(duì)列中,主題的數(shù)量比較少,幾百個(gè)主題已經(jīng)算多了。但在某些應(yīng)用中,會(huì)存在很夸張的主題數(shù)量,比如行情訂閱和高頻交易,這個(gè)后面再細(xì)說(shuō)。
3、行情訂閱,這個(gè)跟消息總線(xiàn)很像。一些專(zhuān)業(yè)消息總線(xiàn),如TIBCO和UM,兩者具有重疊區(qū)域。
大部分主題匹配的應(yīng)用場(chǎng)景比較簡(jiǎn)單,性能需求沒(méi)有那么苛刻。我們就以類(lèi)似行情發(fā)布和訂閱場(chǎng)景為例,假設(shè)有100W只股票代碼隨時(shí)都可能發(fā)布行情,而消費(fèi)者會(huì)隨機(jī)訂閱其中的1W只股票行情。
我們不考慮行情壓縮,減少每條行情的字節(jié)數(shù),這個(gè)不在主題匹配考慮范圍內(nèi)。如果采用組播技術(shù),有一個(gè)很有效的方法,對(duì)于同一個(gè)組播地址,可以指定1W個(gè)端口號(hào),每個(gè)端口綁定100只股票代碼。于是,即使100W只股票代碼,每個(gè)端口也只需要承擔(dān)100只股票的行情量。而消費(fèi)者根據(jù)訂閱請(qǐng)求,監(jiān)聽(tīng)對(duì)應(yīng)端口號(hào),就能拿到所需要的行情數(shù)據(jù)。
在采用前面技術(shù)之后,對(duì)于每個(gè)節(jié)點(diǎn),需要處理的數(shù)據(jù)量大幅下降,但仍然高于實(shí)際需要的數(shù)據(jù)量。我們繼續(xù)假設(shè),需要發(fā)布10W只股票的行情,而消費(fèi)者訂閱其中的1W只股票行情。
股票或者主題來(lái)說(shuō),通常會(huì)采用類(lèi)似URL那樣的點(diǎn)分式來(lái)表示,比如EXHG.123456.SECT,而消費(fèi)者會(huì)采用EXHG.*,或者EXHG.1234__.SECT。這兩種模式匹配的算法,除了采用字典樹(shù),貌似沒(méi)有其他辦法。當(dāng)然字典樹(shù)是可以繼續(xù)優(yōu)化的,具體參考前面CPU和內(nèi)存章節(jié)。
更多場(chǎng)景下,訂閱的1W只股票,是隨機(jī)指定的。因此,發(fā)布的股票和訂閱的股票之間,需要進(jìn)行精確匹配。普通做法是,1W只股票先構(gòu)建一個(gè)索引,比如C++的std::map。每收到一條消息,就去匹配索引。則時(shí)間復(fù)雜度為:10W * LOG2(1W) > 100W。
進(jìn)一步升級(jí),消費(fèi)者鎖訂閱的1W只股票,以哈希表構(gòu)建索引,則時(shí)間復(fù)雜度為:10W * 常數(shù)C > 10W。我們知道,時(shí)間復(fù)雜度的常數(shù)C,最小為1,因?yàn)?0W只股票的行情,不管有沒(méi)有消費(fèi)者,都是要發(fā)布的。將10W只股票分散到多個(gè)CPU,提供并發(fā)度,仍然是個(gè)不錯(cuò)的降低延遲的優(yōu)化措施。
還有更多的優(yōu)化措施,但性?xún)r(jià)比低,只有極少數(shù)更加苛刻的場(chǎng)景才需要考慮。