Dubbo3 消費(fèi)端線程池模型

2022-04-02 10:19 更新

Dubbo 消費(fèi)端線程池模型用法

2.7.5 版本對(duì)整個(gè)調(diào)用鏈路做了全面的優(yōu)化,根據(jù)壓測(cè)結(jié)果顯示,總體 QPS 性能提升將近 30%,同時(shí)也減少了調(diào)用過程中的內(nèi)存分配開銷。其中一個(gè)值得提及的設(shè)計(jì)點(diǎn)是 2.7.5 引入了 Servicerepository 的概念,在服務(wù)注冊(cè)階段提前生成 ServiceDescriptor 和 MethodDescriptor,以減少 RPC 調(diào)用階段計(jì)算 Service 原信息帶來的資源消耗。

消費(fèi)端線程池模型優(yōu)化

對(duì) 2.7.5 版本之前的 Dubbo 應(yīng)用,尤其是一些消費(fèi)端應(yīng)用,當(dāng)面臨需要消費(fèi)大量服務(wù)且并發(fā)數(shù)比較大的大流量場(chǎng)景時(shí)(典型如網(wǎng)關(guān)類場(chǎng)景),經(jīng)常會(huì)出現(xiàn)消費(fèi)端線程數(shù)分配過多的問題,具體問題討論可參見 Need a limited Threadpool in consumer side #2013

改進(jìn)后的消費(fèi)端線程池模型,通過復(fù)用業(yè)務(wù)端被阻塞的線程,很好的解決了這個(gè)問題。

老的線程池模型

消費(fèi)端線程池.png

我們重點(diǎn)關(guān)注 Consumer 部分:

  1. 業(yè)務(wù)線程發(fā)出請(qǐng)求,拿到一個(gè) Future 實(shí)例。
  2. 業(yè)務(wù)線程緊接著調(diào)用 future.get 阻塞等待業(yè)務(wù)結(jié)果返回。
  3. 當(dāng)業(yè)務(wù)數(shù)據(jù)返回后,交由獨(dú)立的 Consumer 端線程池進(jìn)行反序列化等處理,并調(diào)用 future.set 將反序列化后的業(yè)務(wù)結(jié)果置回。
  4. 業(yè)務(wù)線程拿到結(jié)果直接返回

2.7.5 版本引入的線程池模型

消費(fèi)端線程池新.png

  1. 業(yè)務(wù)線程發(fā)出請(qǐng)求,拿到一個(gè) Future 實(shí)例。
  2. 在調(diào)用 future.get() 之前,先調(diào)用 ThreadlessExecutor.wait(),wait 會(huì)使業(yè)務(wù)線程在一個(gè)阻塞隊(duì)列上等待,直到隊(duì)列中被加入元素。
  3. 當(dāng)業(yè)務(wù)數(shù)據(jù)返回后,生成一個(gè) Runnable Task 并放入 ThreadlessExecutor 隊(duì)列
  4. 業(yè)務(wù)線程將 Task 取出并在本線程中執(zhí)行:反序列化業(yè)務(wù)數(shù)據(jù)并 set 到 Future。
  5. 業(yè)務(wù)線程拿到結(jié)果直接返回

這樣,相比于老的線程池模型,由業(yè)務(wù)線程自己負(fù)責(zé)監(jiān)測(cè)并解析返回結(jié)果,免去了額外的消費(fèi)端線程池開銷。

關(guān)于性能優(yōu)化,在接下來的版本中將會(huì)持續(xù)推進(jìn),主要從以下兩個(gè)方面入手:

  1. RPC 調(diào)用鏈路。目前能看到的點(diǎn)包括:進(jìn)一步減少執(zhí)行鏈路的內(nèi)存分配、在保證協(xié)議兼容性的前提下提高協(xié)議傳輸效率、提高 Filter、Router 等計(jì)算效率。
  2. 服務(wù)治理鏈路。進(jìn)一步減少地址推送、服務(wù)治理規(guī)則推送等造成的內(nèi)存、cpu 資源消耗。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)