自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我們一起聊聊如何利用并行計(jì)算挖掘性能極限

開(kāi)發(fā) 前端
在數(shù)據(jù)流交互架構(gòu)中,不同并行執(zhí)行單元的處理消息速率通常不一致,因此需要借助消息隊(duì)列緩存來(lái)協(xié)調(diào)。在 Java 中,各種并發(fā)的 BlockingQueue 就是這種消息隊(duì)列的一種實(shí)現(xiàn)方式,即典型的生產(chǎn)者消費(fèi)者模型的處理方法。

在當(dāng)前的計(jì)算機(jī)領(lǐng)域中,CPU 單核性能的增長(zhǎng)已逐漸停滯,而業(yè)務(wù)問(wèn)題的復(fù)雜度卻不斷上升。為了更好地解決這一沖突,在 CPU 中增加核數(shù)成為了常見(jiàn)的應(yīng)對(duì)方案。在這種情況下,并行設(shè)計(jì)的重要性日益凸顯,它能夠充分發(fā)揮硬件多核的運(yùn)行性能。

然而,要通過(guò)并行設(shè)計(jì)將計(jì)算負(fù)載均衡到每個(gè) CPU 核上,并將軟件性能提升至最大化,面臨著諸多挑戰(zhàn)。例如,并行拆分不合理可能導(dǎo)致產(chǎn)品性能不可控甚至惡化,程序員的串行編程慣性思維使得并發(fā)同步互斥實(shí)現(xiàn)中的故障難以定位,進(jìn)而導(dǎo)致產(chǎn)品在較長(zhǎng)時(shí)間內(nèi)處于不可用狀態(tài)。

為了應(yīng)對(duì)這些挑戰(zhàn),我們首先需要了解并行計(jì)算模型。在面對(duì)具體的業(yè)務(wù)問(wèn)題時(shí),我們需要將其拆分成可并行的邏輯單元,并實(shí)現(xiàn)同步交互。并行計(jì)算模型可以幫助我們建立對(duì)并發(fā)系統(tǒng)的抽象模型和基本概念的認(rèn)識(shí)。

具體來(lái)說(shuō),并行計(jì)算模型可以抽象為兩個(gè)層次:一是由結(jié)構(gòu)數(shù)據(jù)和相應(yīng)的計(jì)算邏輯組成并發(fā)執(zhí)行單元,通過(guò)組合實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù);二是基于各種手段(如內(nèi)存、互斥量、消息隊(duì)列、數(shù)據(jù)庫(kù)等)對(duì)并發(fā)執(zhí)行單元計(jì)算的結(jié)果進(jìn)行交互同步,保證業(yè)務(wù)計(jì)算結(jié)果的確定性。

需要注意的是,并行執(zhí)行單元的粒度可大可小,不僅僅局限于線程。在設(shè)計(jì)并發(fā)架構(gòu)時(shí),我們應(yīng)根據(jù)處理的特定領(lǐng)域問(wèn)題,選擇合適的并行執(zhí)行單元粒度,并選擇或定制實(shí)現(xiàn)相應(yīng)的并發(fā)調(diào)度框架。

接下來(lái),我們介紹六種針對(duì)不同業(yè)務(wù)問(wèn)題的典型并行設(shè)計(jì)架構(gòu)模式。

第一種是任務(wù)線性分解架構(gòu),它是按照計(jì)算邏輯維度進(jìn)行確定性拆分的并行架構(gòu)設(shè)計(jì)模式。當(dāng)單核處理性能存在瓶頸時(shí),通過(guò)依賴分析,發(fā)現(xiàn)計(jì)算邏輯相對(duì)獨(dú)立,便可按照計(jì)算邏輯拆分成獨(dú)立的并行執(zhí)行單元,從而提升性能。這種架構(gòu)模式適用于業(yè)務(wù)邏輯確定性的場(chǎng)景,但需要注意消除或隔離數(shù)據(jù)依賴、確定執(zhí)行單元工作量以及任務(wù)線性拆分?jǐn)U展性差等問(wèn)題。

圖片圖片

當(dāng)我們觀察圖中的左側(cè)時(shí),可以看到計(jì)算邏輯 A、B 和 C 在同一個(gè)數(shù)據(jù)塊上進(jìn)行操作。通過(guò)依賴性分析,我們可以發(fā)現(xiàn) A、B 和 C 這三個(gè)計(jì)算邏輯是相對(duì)獨(dú)立的。因此,當(dāng)單核處理性能達(dá)到瓶頸時(shí),可以通過(guò)計(jì)算邏輯維度進(jìn)行并行拆分來(lái)提升性能。

圖的右側(cè)展示了通過(guò)這種拆分形成的三個(gè)獨(dú)立并行執(zhí)行單元。這種方式可以映射到兩個(gè)硬件線程上,從而減少處理時(shí)延。

補(bǔ)充說(shuō)明:對(duì)于 Java 工程師來(lái)說(shuō),需要顯式地將任務(wù)映射到硬件線程的情況可能比較少;但對(duì)于嵌入式工程師來(lái)說(shuō),任務(wù)與硬件線程的映射綁定是并行設(shè)計(jì)中的一個(gè)關(guān)鍵環(huán)節(jié)。

實(shí)際上,在許多業(yè)務(wù)領(lǐng)域中,都存在需要根據(jù)同一個(gè)事件或數(shù)據(jù)并行觸發(fā)多個(gè)任務(wù)的場(chǎng)景。例如,在電商購(gòu)物場(chǎng)景下,一筆交易成功后,系統(tǒng)會(huì)同時(shí)觸發(fā)多項(xiàng)任務(wù),包括生成郵件通知責(zé)任人、進(jìn)行多維度數(shù)據(jù)統(tǒng)計(jì)及更新等。

當(dāng)這些觸發(fā)的業(yè)務(wù)計(jì)算邏輯相互獨(dú)立時(shí),可以創(chuàng)建多個(gè)并行執(zhí)行單元,分別處理拆分后的不同子任務(wù),并根據(jù)各執(zhí)行單元的工作量大小,將其與具體的硬件線程建立映射和綁定關(guān)系。

這種并行設(shè)計(jì)架構(gòu)相對(duì)簡(jiǎn)單,適用的業(yè)務(wù)場(chǎng)景也比較多。例如,在觀察者模式中處理類(lèi)似問(wèn)題、在消息隊(duì)列中解決一對(duì)多通信的業(yè)務(wù)問(wèn)題等,都隱含著任務(wù)線性并發(fā)的可能性。

總的來(lái)說(shuō),任務(wù)線性分解架構(gòu)適用于業(yè)務(wù)邏輯確定性的場(chǎng)景。在實(shí)際應(yīng)用中需要注意以下幾點(diǎn):

  1. 在并行執(zhí)行單元間,通過(guò)一些手段消除或隔離數(shù)據(jù)依賴,例如使用 ThreadLocal 變量,通過(guò)數(shù)據(jù)冗余來(lái)消除依賴。
  2. 執(zhí)行單元的工作量較為確定,便于與硬件線程建立綁定和映射關(guān)系。
  3. 進(jìn)行并行拆分時(shí),需要先了解全局的業(yè)務(wù)功能。任務(wù)線性拆分的擴(kuò)展性相對(duì)較差。

通過(guò)這些方法,任務(wù)線性分解架構(gòu)能夠在特定場(chǎng)景下有效提升性能。

第二種是任務(wù)分治架構(gòu),它是按照計(jì)算邏輯進(jìn)行動(dòng)態(tài)拆分的并行架構(gòu)設(shè)計(jì)模式。在許多業(yè)務(wù)場(chǎng)景中,計(jì)算邏輯并非全局確定,需要根據(jù)場(chǎng)景判斷是否拆分成更小的子問(wèn)題進(jìn)行求解。在這種情況下,需要?jiǎng)討B(tài)創(chuàng)建任務(wù),并借助任務(wù)隊(duì)列來(lái)管理執(zhí)行任務(wù)。這種架構(gòu)模式的使用場(chǎng)景相對(duì)較少,但在一些實(shí)時(shí)性要求高、性能要求苛刻的場(chǎng)景下,如股票交易等,任務(wù)隊(duì)列以及硬件資源綁定關(guān)系通常需要單獨(dú)設(shè)計(jì)實(shí)現(xiàn)。

圖片圖片

通過(guò)圖中的左側(cè),我們可以發(fā)現(xiàn),在許多業(yè)務(wù)場(chǎng)景中,計(jì)算邏輯并不是全局確定的。在計(jì)算過(guò)程中,有些業(yè)務(wù)需要根據(jù)具體場(chǎng)景來(lái)判斷是否將其拆分成更小的子問(wèn)題進(jìn)行求解。例如,A 計(jì)算過(guò)程中會(huì)拆分出 2 個(gè) B 子問(wèn)題,而這 2 個(gè)子問(wèn)題在計(jì)算過(guò)程中又需要進(jìn)一步拆分為 3 個(gè) C 子問(wèn)題來(lái)求解。

針對(duì)這種動(dòng)態(tài)變化的場(chǎng)景進(jìn)行并行設(shè)計(jì)時(shí),不能在系統(tǒng)運(yùn)行前完成任務(wù)的拆分,而是需要在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建任務(wù),并借助任務(wù)隊(duì)列來(lái)管理和執(zhí)行這些任務(wù)。執(zhí)行線程可以從隊(duì)列中拉取任務(wù)。在并行執(zhí)行單元間,數(shù)據(jù)依賴可以通過(guò)一些手段進(jìn)行消除或隔離,比如利用 ThreadLocal 變量或通過(guò)數(shù)據(jù)冗余來(lái)處理。這樣,執(zhí)行單元的工作量相對(duì)確定,便于與硬件線程建立綁定和映射關(guān)系。

通常情況下,在進(jìn)行并行拆分時(shí),需要先了解全局的業(yè)務(wù)功能,盡管任務(wù)線性拆分的擴(kuò)展性相對(duì)較差。這種并行設(shè)計(jì)架構(gòu)模式的使用場(chǎng)景相對(duì)少一些。

例如,我之前基于 Akka 框架設(shè)計(jì)開(kāi)發(fā)了一款智能對(duì)話引擎。在這個(gè)對(duì)話引擎系統(tǒng)中,用戶對(duì)話的語(yǔ)義信息是有限的。當(dāng)收到某個(gè)用戶對(duì)話數(shù)據(jù)時(shí),在特定上下文中,其語(yǔ)義可能只是全局語(yǔ)義中的一個(gè)較小子集。因此,我需要在這個(gè)子集中選擇語(yǔ)義匹配率最高的一個(gè)進(jìn)行回復(fù)。

每個(gè)語(yǔ)義匹配率的計(jì)算邏輯與對(duì)話數(shù)據(jù)是獨(dú)立的。為了實(shí)現(xiàn)用戶對(duì)話消息的快速回復(fù),我需要在特定上下文下,動(dòng)態(tài)創(chuàng)建多個(gè)并行執(zhí)行單元,分別計(jì)算語(yǔ)義匹配度,然后匯總選擇匹配率最高的一個(gè)。這種實(shí)現(xiàn)框架基于任務(wù)分治架構(gòu)進(jìn)行設(shè)計(jì)。

實(shí)際上,在 Java 的 java.util.concurrent.Executors 以及 Akka 等框架中,已經(jīng)內(nèi)置了并發(fā)任務(wù)隊(duì)列,并支持與 CPU 等硬件線程的映射,從而滿足大部分場(chǎng)景下的業(yè)務(wù)需求。然而,在一些實(shí)時(shí)性要求較高、性能要求非??量痰膱?chǎng)景下,比如股票交易,任務(wù)隊(duì)列以及硬件資源的綁定關(guān)系通常需要單獨(dú)設(shè)計(jì)實(shí)現(xiàn)。

1.數(shù)據(jù)幾何分解架構(gòu)

圖片

數(shù)據(jù)幾何分解和任務(wù)線性分解架構(gòu)風(fēng)格相似,但幾何分解架構(gòu)的主要特點(diǎn)是在不同的數(shù)據(jù)上執(zhí)行相同的計(jì)算邏輯。正如圖中右側(cè)所示,拆分成不同的并行計(jì)算單元后,計(jì)算邏輯是相同的(同色表示),但數(shù)據(jù)是不同的(不同顏色表示)。

在互聯(lián)網(wǎng)微服務(wù)場(chǎng)景中,業(yè)務(wù)關(guān)鍵數(shù)據(jù)通常記錄在數(shù)據(jù)庫(kù)表中。當(dāng)數(shù)據(jù)規(guī)模較大時(shí),需要對(duì)數(shù)據(jù)庫(kù)表進(jìn)行分表策略保存,這就是一種典型的數(shù)據(jù)幾何分解方式。針對(duì)這種場(chǎng)景,當(dāng)接收到業(yè)務(wù)數(shù)據(jù)庫(kù)表查詢分析請(qǐng)求時(shí),需要基于相同的計(jì)算邏輯和不同的數(shù)據(jù)庫(kù)分表組合,創(chuàng)建多個(gè)執(zhí)行單元并行計(jì)算以提升性能。

在業(yè)務(wù)發(fā)展過(guò)程中,待處理數(shù)據(jù)規(guī)模增加是一個(gè)非常重要的變化方向,通過(guò)彈性計(jì)算資源提升業(yè)務(wù)處理能力是核心關(guān)注點(diǎn)之一。數(shù)據(jù)幾何分解架構(gòu)是一種解決此類(lèi)問(wèn)題的典型方法,具有很多優(yōu)點(diǎn),應(yīng)用非常廣泛。

最后,讓我們看看數(shù)據(jù)幾何分解架構(gòu)的隱式約束條件:

  • 擴(kuò)展性強(qiáng):采用數(shù)據(jù)幾何分解架構(gòu),其可支持的擴(kuò)展性會(huì)比較強(qiáng)。
  • 適用于 SPMD 架構(gòu):這種性能架構(gòu)模式比較適合于 SPMD(Single Program Multi Data)架構(gòu)。SPMD 架構(gòu)使用一套相同的代碼實(shí)體并行運(yùn)行在多個(gè)硬件線程上,這樣用戶只需要管理一套代碼實(shí)體即可,成本比較低。
  • 獨(dú)立更新:在數(shù)據(jù)幾何分解架構(gòu)中,不同并行計(jì)算單元的更新數(shù)據(jù)是獨(dú)立的。

2.遞歸數(shù)據(jù)結(jié)構(gòu)

圖片圖片

從圖中可以看到,業(yè)務(wù)處理的數(shù)據(jù)是樹(shù)狀或圖狀組織的,這表明線性幾何拆分?jǐn)?shù)據(jù)會(huì)比較困難。

因此,在實(shí)際應(yīng)用中,需要在遍歷過(guò)程中動(dòng)態(tài)創(chuàng)建任務(wù),然后逐步合并每個(gè)中間計(jì)算單元的運(yùn)算結(jié)果,最終計(jì)算得到結(jié)果,如圖中右側(cè)所示。

MongoDB 是目前應(yīng)用非常廣泛的開(kāi)源文檔數(shù)據(jù)庫(kù),它支持將靈活的 JSON 格式業(yè)務(wù)數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。在對(duì)業(yè)務(wù)記錄 JSON 格式內(nèi)的多個(gè)字段進(jìn)行數(shù)據(jù)分析時(shí),代碼需要遞歸遍歷 JSON 中所有嵌套字段并進(jìn)行分析計(jì)算。為了最大化并發(fā)執(zhí)行,減少處理時(shí)延,可以采用遞歸數(shù)據(jù)架構(gòu)模式,在遞歸遍歷字段過(guò)程中動(dòng)態(tài)創(chuàng)建相應(yīng)字段分析的并行執(zhí)行單元。

這種架構(gòu)的應(yīng)用場(chǎng)景也相對(duì)較少,主要用于非規(guī)則結(jié)構(gòu)數(shù)據(jù)的計(jì)算分析,比如樹(shù)狀結(jié)構(gòu)、有向圖等數(shù)據(jù)結(jié)構(gòu)。

3.數(shù)據(jù)流交互架構(gòu)

圖片圖片

從上圖中我們可以發(fā)現(xiàn),這種業(yè)務(wù)場(chǎng)景的典型特征是計(jì)算單元的確定性較強(qiáng),可以靜態(tài)規(guī)劃與硬件線程的映射關(guān)系。設(shè)計(jì)的核心是如何高效實(shí)現(xiàn)并發(fā)計(jì)算單元間的信息交互。

具體如何實(shí)現(xiàn)呢?讓我舉個(gè)例子。

在大數(shù)據(jù)領(lǐng)域中,ETL(Extract-Transform-Load)是一個(gè)非常典型的場(chǎng)景,它描述了將數(shù)據(jù)從來(lái)源端經(jīng)過(guò)抽取(extract)、轉(zhuǎn)換(transform)和加載(load)至目的端的過(guò)程。在這種架構(gòu)模式下,計(jì)算任務(wù)單元需要?jiǎng)討B(tài)創(chuàng)建,且工作量不確定。

一般來(lái)說(shuō),遞歸數(shù)據(jù)架構(gòu)對(duì)應(yīng)的算法是遞歸算法。在這種架構(gòu)中,一個(gè)計(jì)算單元的輸出正好是另一個(gè)計(jì)算單元的輸入,消息交互是單向確定性的。同時(shí),業(yè)務(wù)場(chǎng)景中還會(huì)源源不斷接收到新的輸入,需要使用相似的計(jì)算策略進(jìn)行處理。

業(yè)務(wù)數(shù)據(jù)處理需求通常由多個(gè) ETL 階段組合完成,因此在這種場(chǎng)景下,使用數(shù)據(jù)流交互架構(gòu)會(huì)比較合適。此外,在嵌入式領(lǐng)域,網(wǎng)絡(luò)協(xié)議棧的報(bào)文處理、不同協(xié)議棧解析特定頭部字節(jié)、完成業(yè)務(wù)處理后透?jìng)鹘o下一層,也是使用數(shù)據(jù)流交互架構(gòu)的典型場(chǎng)景。

在數(shù)據(jù)流交互架構(gòu)中,不同并行執(zhí)行單元的處理消息速率通常不一致,因此需要借助消息隊(duì)列緩存來(lái)協(xié)調(diào)。在 Java 中,各種并發(fā)的 BlockingQueue 就是這種消息隊(duì)列的一種實(shí)現(xiàn)方式,即典型的生產(chǎn)者消費(fèi)者模型的處理方法。

通過(guò)這些手段,可以高效地實(shí)現(xiàn)并發(fā)計(jì)算單元間的信息交互,滿足動(dòng)態(tài)創(chuàng)建任務(wù)和處理不確定工作量的需求。

4.異步交付架構(gòu)

圖片圖片

從圖上我們可以發(fā)現(xiàn),該業(yè)務(wù)場(chǎng)景的典型特點(diǎn)如下:

這種系統(tǒng)的計(jì)算邏輯可能需要進(jìn)行全局拆分,也可能無(wú)法拆分,需要根據(jù)實(shí)際情況進(jìn)行處理。

讓我給你舉個(gè)例子。在微服務(wù)架構(gòu)中,微服務(wù)在完成一個(gè) REST 請(qǐng)求業(yè)務(wù)功能的過(guò)程中,可能需要進(jìn)行多次數(shù)據(jù)庫(kù)操作,還可能需要多次調(diào)用其他微服務(wù)提供的 REST 接口。為了充分發(fā)揮性能,當(dāng)我們將業(yè)務(wù)邏輯拆分為多個(gè)并行執(zhí)行單元后,并行執(zhí)行單元間的運(yùn)行開(kāi)銷(xiāo)差異較大時(shí),可以使用異步交互來(lái)實(shí)現(xiàn)業(yè)務(wù)功能。

請(qǐng)注意,要想最大化地發(fā)揮這種架構(gòu)的性能,還需要做到以下一點(diǎn):并行執(zhí)行單元能夠動(dòng)態(tài)靈活地映射到特定的硬件 CPU 核上。比如,Node.js 后端業(yè)務(wù)中的 async 機(jī)制和 Java 語(yǔ)言中的 Future 并發(fā)機(jī)制,都是支持異步交互架構(gòu)的較好語(yǔ)言機(jī)制。

通過(guò)這些方法,可以在微服務(wù)架構(gòu)中實(shí)現(xiàn)高效的異步交互,提高系統(tǒng)性能。

責(zé)任編輯:武曉燕 來(lái)源: 二進(jìn)制跳動(dòng)
相關(guān)推薦

2024-02-26 00:00:00

Go性能工具

2021-11-04 06:58:31

CSS性能設(shè)備

2025-03-13 05:00:00

2024-07-11 08:26:00

2023-12-29 08:29:15

QPS系統(tǒng)應(yīng)用

2024-02-02 09:21:57

API性能策略

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2024-09-30 09:33:31

2024-11-27 16:07:45

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷開(kāi)發(fā)模式

2023-04-03 00:09:13

2024-09-09 00:00:00

編寫(xiě)技術(shù)文檔

2021-12-10 07:45:48

字節(jié)音頻視頻

2024-12-10 00:00:25

2022-02-14 07:03:31

網(wǎng)站安全MFA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)