真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

GRPC連接池如何實現(xiàn)

這篇文章主要講解了“GRPC連接池如何實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“GRPC連接池如何實現(xiàn)”吧!

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、虛擬主機、營銷軟件、網(wǎng)站建設、姚安網(wǎng)站維護、網(wǎng)站推廣。

前言

在分布式高并發(fā)服務器中,client到server以及server中的多個節(jié)點之間的連接往往使用連接池來管理。簡單來說就是將提前創(chuàng)建好的連接保存在池中,當有請求到來時,直接使用連接池中的連接對server端訪問,省去了創(chuàng)建連接和銷毀連接的開銷(TCP建立連接時的三次握手和釋放連接時的四次揮手),從而提高了性能。

設計原則

  • 連接池的擴縮容

  • 空閑連接的超時與?;?/p>

  • 池滿的處理機制

連接池的擴縮容

通常連接池屬性包含最大空閑連接數(shù)和最大活躍連接數(shù)。

最大空閑連接數(shù):連接池一直保持的連接數(shù),無論這些連接被使用與否都會被保持。如果客戶端對連接池的使用量不大,便會造成服務端連接資源的浪費。

最大活躍連接數(shù):連接池最多保持的連接數(shù),如果客戶端請求超過次數(shù),便要根據(jù)池滿的處理機制來處理沒有得到連接的請求。

擴容:當請求到來時,如果連接池中沒有空閑的連接,同時連接數(shù)也沒有達到最大活躍連接數(shù),便會按照特定的增長策略創(chuàng)建新的連接服務該請求,同時用完之后歸還到池中,而不是關閉連接。

縮容:當連接池一段時間沒有被使用,同時池中的連接數(shù)超過了最大空閑連接數(shù),那么便會關閉一部分連接,使池中的連接數(shù)始終維持在最大空閑連接數(shù)。

空閑連接的超時與?;?/h5>

超時 如果連接沒有被客戶端使用的話,便會成為空閑連接,在一段時間后,服務端可能會根據(jù)自己的超時策略關閉空閑連接,此時空閑連接已經(jīng)失效,如果客戶端再使用失效的連接,便會通信失敗。為了避免這種情況發(fā)生,通常連接池中的連接設有最大空閑超時時間(最好略小于服務器的空閑連接超時時間),在從池中獲取連接時,判斷是否空閑超時,如果超時則關閉,沒有超時則可以繼續(xù)使用。

保活 如果服務器發(fā)生重啟,那么連接池中的連接便會全部失效,如果此時再從池中獲取連接,不論獲取到哪一個,都將通信失敗。因此,連接池必須考慮連接的?;顔栴},有兩種解決方法:

1、連接池設置一個Ping函數(shù),專門用來做連接的?;睢T趶某刂蝎@取連接的時候,Ping一下服務器,如果得到響應,則連接依然有效,便可繼續(xù)使用,如果超時無響應,則關閉該連接,生成新的連接,由于每次都要Ping一下,必然會增加延遲。也可以后臺用一個線程或者協(xié)程定期的執(zhí)行Ping函數(shù),進行連接的?;睿秉c是感知連接的失效會有一定的延遲,從池中仍然有可能獲取到失效的連接。

2、客戶端加入相應的重試機制。比如重試3次,前兩次從池中獲取連接執(zhí)行,如果報的錯是失效的連接等有關連接問題的錯誤,那么第3次從池中獲取的時候帶上參數(shù),指定獲取新建的連接,同時連接池移除前兩次獲取的失效的連接。

池滿的處理機制

連接池不可能無限的容納連接,當池滿時,有兩種處理機制:

1、池新建連接,并返回給客戶端,當客戶端用完時,如果池滿則關閉連接,否則放入池中。

2、設置一定的超時時間來等待空閑連接。需要客戶端加入重試機制,避免因超時之后獲取不到空閑連接產(chǎn)生的錯誤。

基本原理

  1. 服務啟動時建立連接池。

  2. 初始化連接池,建立最大空閑連接數(shù)個連接。

  3. 請求到來時,從池中獲取一個連接。如果沒有空閑連接且連接數(shù)沒有達到最大活躍連接數(shù),則新建連接;如果達到最大活躍連接數(shù),設置一定的超時時間,等待獲取空閑連接。

  4. 獲取到連接后進行通信服務。

  5. 釋放連接,此時是將連接放回連接池,如果池滿則關閉連接。

  6. 釋放連接池,關閉所有連接。

GRPC特性

關于GRPC的介紹,不在這里闡述,可閱讀深入了解GRPC協(xié)議,也可自行Google。這里主要簡要說明GRPC的兩個特性:多路復用、超時重連。

多路復用GRPC使用HTTP/2作為應用層的傳輸協(xié)議,HTTP/2會復用底層的TCP連接。每一次RPC調(diào)用會產(chǎn)生一個新的Stream,每個Stream包含多個Frame,F(xiàn)rame是HTTP/2里面最小的數(shù)據(jù)傳輸單位。同時每個Stream有唯一的ID標識,如果是客戶端創(chuàng)建的則ID是奇數(shù),服務端創(chuàng)建的ID則是偶數(shù)。如果一條連接上的ID使用完了,Client會新建一條連接,Server也會給Client發(fā)送一個GOAWAY Frame強制讓Client新建一條連接。一條GRPC連接允許并發(fā)的發(fā)送和接收多個Stream,而控制的參數(shù)便是MaxConcurrentStreams,Golang的服務端默認是100。

超時重連我們在通過調(diào)用Dial或者DialContext函數(shù)創(chuàng)建連接時,默認只是返回ClientConn結(jié)構(gòu)體指針,同時會啟動一個Goroutine異步的去建立連接。如果想要等連接建立完再返回,可以指定grpc.WithBlock()傳入Options來實現(xiàn)。超時機制很簡單,在調(diào)用的時候傳入一個timeout的context就可以了。重連機制通過啟動一個Goroutine異步的去建立連接實現(xiàn)的,可以避免服務器因為連接空閑時間過長關閉連接、服務器重啟等造成的客戶端連接失效問題。也就是說通過GRPC的重連機制可以完美的解決連接池設計原則中的空閑連接的超時與?;顔栴}。

以Golang的GRPC客戶端為例: GRPC連接池如何實現(xiàn)

GRPC調(diào)優(yōu)

GRPC默認的參數(shù)對于傳輸大數(shù)據(jù)塊來說不夠友好,我們需要進行特定參數(shù)的調(diào)優(yōu)。

MaxSendMsgSizeGRPC最大允許發(fā)送的字節(jié)數(shù),默認4MiB,如果超過了GRPC會報錯。Client和Server我們都調(diào)到4GiB。

MaxRecvMsgSizeGRPC最大允許接收的字節(jié)數(shù),默認4MiB,如果超過了GRPC會報錯。Client和Server我們都調(diào)到4GiB。

InitialWindowSize基于Stream的滑動窗口,類似于TCP的滑動窗口,用來做流控,默認64KiB,吞吐量上不去,Client和Server我們調(diào)到1GiB。

InitialConnWindowSize基于Connection的滑動窗口,默認16 * 64KiB,吞吐量上不去,Client和Server我們也都調(diào)到1GiB。

KeepAliveTime每隔KeepAliveTime時間,發(fā)送PING幀測量最小往返時間,確定空閑連接是否仍然有效,我們設置為10S。

KeepAliveTimeout超過KeepAliveTimeout,關閉連接,我們設置為3S。

PermitWithoutStream如果為true,當連接空閑時仍然發(fā)送PING幀監(jiān)測,如果為false,則不發(fā)送忽略。我們設置為true。

實現(xiàn)細則

代碼:https://github.com/shimingyah/pool

基于GRPC的多路復用、超時重連特性,我們很容易實現(xiàn)GRPC連接池。

接口設計

提供簡潔的Pool和Conn的接口設計。 GRPC連接池如何實現(xiàn) GRPC連接池如何實現(xiàn)

連接復用

GRPC是支持多路復用的,所以在設計GRPC池的時候和其他連接池區(qū)別之一是支持連接復用,通過MaxConcurrentStreams控制,默認64。我們稱單個的GRPC為物理連接,復用的連接為邏輯連接。池的實際有效連接邏輯連接=物理連接 * MaxConcurrentStreams。

擴縮容

擴容初始化池的有效連接數(shù)(邏輯連接)為:最大空閑連接數(shù) * MaxConcurrentStreams,每一次請求都會對池的引用計數(shù)原子++,同時hash求取選取連接,當引用計數(shù)超過邏輯連接數(shù)時,就需要進行擴容了,如果最大空閑連接沒有達到最大活躍連接數(shù),則按照double的方式擴容,如果達到了最大活躍連接數(shù),我們會根據(jù)Reuse參數(shù)的值來做進一步操作:如果為true,則繼續(xù)使用池中的連接,即使用的是物理連接的邏輯連接,關閉連接時,對引用計數(shù)原子--即可,如果為false,則新建連接,關閉連接時還需要對連接進行真正的Close。

縮容如果池的引用計數(shù)為0時,便會觸發(fā)縮容操作,是連接維持到最大空閑連接數(shù)。

超時?;?/h5>

基于GRPC的Keepalived特性,我們不需要自己實現(xiàn)?;顧C制,也無需關注連接池中的連接是否有效,因為就算失效,GRPC會自動重連的,此時只不過耗時會略微增加,即認為除了服務器一直處于down狀態(tài)等原因,連接池中的連接是始終有效的。

Tips
  • 由于使用hash求余,每個GRPC上并發(fā)的Stream可能會超過MaxConcurrentStreams。

  • 不同場景對應的連接池配置也不一樣,需要根據(jù)自己的場景壓測得出連接池的最佳參數(shù)配置。

感謝各位的閱讀,以上就是“GRPC連接池如何實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對GRPC連接池如何實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!


本文標題:GRPC連接池如何實現(xiàn)
文章鏈接:http://weahome.cn/article/ghposi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部