在過去的幾年中,隨着微服務的增長,gRPC在這些較小的服務之間的相互通信中獲得了很大的普及,在后台,gRPC使用http/2在同一連接和雙工流中復用許多請求。
使用具有結構化數據的快速,輕便的二進制協議作為服務之間的通信介質確實很有吸引力,但是使用gRPC時需要考慮一些因素,最重要的是如何處理負載均衡。
gRPC使用粘性連接
gRPC連接是粘性的。這意味着當從客戶端到服務器建立連接時,相同的連接將被盡可能長時間地用於許多請求(多路復用)。這樣做是為了避免所有最初的時間和資源花費在TCP握手上。因此,當客戶端獲取與服務器實例的連接時,它將保持連接。
現在,當同一客戶端開始發送大量請求時,它們都將轉到同一服務器實例。而這正是問題所在,將沒有機會將負載分配給其他實例。他們都去同一個實例。
這就是為什么粘性連接會使負載平衡變得非常困難。
以下是一些負載均衡gRPC相互通信的方法,以及每種方法的一些細節。
1.服務器端
當在服務器端完成負載均衡時,會使客戶端非常精簡,並且完全不知道如何在服務器上處理負載:
網絡負載均衡器
網絡負載均衡器在OSI (Open Systems Interconnection) 模型的第4層運行。因此,它非常快,可以處理更多的連接。當出現新的TCP通信連接時,負載均衡器將選擇一個實例,並且在連接有效期內將連接路由到該單個實例。
現在請記住,gRPC連接是粘性的和持久的,因此它會在負載均衡器后面的客戶端和同一服務器實例之間保持相同的連接,只要它可以。
現在這是問題所在:
粘性連接和自動縮放
如果單個服務器實例上的負載(內存或cpu)高於自動伸縮策略,則將導致在該目標組中啟動一個新實例。
但是,目標組中的新實例將無濟於事。為什么?同樣,因為gRPC連接是持久的且具有粘性。正在發送大量請求的客戶端,將繼續將它們發送到與其連接的同一服務器實例。
因此,新的服務器實例被啟動,但是沒有請求過載將流向新的實例。利用率高的同一台單服務器實例仍在接收來自客戶端的請求負載(因為客戶端一直在重用相同的連接)。
自動伸縮策略可能會不斷觸發並向目標組添加新實例(因為單個實例的cpu /內存過載)。但是這些新實例接收的流量幾乎為零。自動縮放策略可能會繼續觸發並可能最大化目標組中允許的實例,而實際上並未從發送到新實例的請求中受益。
如何使用gRPC粘性連接分配負載?
為了基本上有機會分配負載,我們必須使用以下方法之一放棄粘性和持久連接:
1.客戶端定期重新連接
如果您可以控制連接的gRPC客戶端,則可以強制客戶端定期斷開連接並重新連接。此行為將迫使客戶端向負載均衡器發送新請求,並且作為對此請求的響應,這次將返回更健康的實例。
2.服務器定期強制斷開客戶端連接
如果您無法控制連接的gRPC客戶端,則可以在服務器端實現類似的邏輯。使服務器在一段時間后強行關閉連接,當它們重新連接時,它會自動使新連接進入更健康的實例。
這些方法中的任何一種都丟失了gRPC的基本優勢:可重用的連接。
DNS服務發現
同樣,我們可以將服務器實例放置在DNS服務發現之后,而不是在Elastic Load Balancer后面。服務發現本質上是一種DNS服務,當請求進入時,它將以隨機順序返回其后面所有實例(或正常實例的子集)的IP地址列表。因此,當客戶端選擇要連接到的服務器並進行DNS查找時,服務發現將返回排序后的實例的IP地址。
網絡負載均衡器的所有問題幾乎都適用於DNS服務發現負載均衡。當客戶端獲取到單個實例的連接時,它將堅持並繼續重用它。
2.客戶端
如果您完全控制客戶端,則可以在客戶端實現負載均衡的邏輯。使客戶端了解所有可用服務器及其運行狀況,並選擇要連接的服務器。這將導致客戶的邏輯負擔增加。因此,它們不僅應包含執行應做的邏輯,而且還需要實現用於負載平衡,運行狀況檢查等的邏輯。
在一種情況下,這是一個可行的選擇:如果您完全控制所有客戶端。您不能讓有故障的客戶端連接到您的服務並導致各種負載平衡問題。只需要一個有故障的客戶端就可以引起足夠的麻煩。
3. 觀察模式
按照官方gRPC負載平衡的建議,此方法使用外部負載均衡器或one-arm負載均衡器在服務器實例之間分配流量。
客戶端與外部服務聯系,它將返回可用服務器,服務發現和所有其他必需信息的列表。
理想情況下,客戶端也會有一些邏輯來幫助做出決定。這種方法很容易出現上面提到的粘性連接問題,因此需要仔細實施。
每個調用都將分別進行負載均衡,而不是每個連接一個,這是理想且理想的情況,它將避免具有沉重的粘性連接。
您需要實現和部署全新的專用服務,以僅負載均衡其他服務之間的gRPC連接。每項新服務都具有自己的維護,操作,監視,警報等。
結論
服務器端負載均衡要有非常重要的考慮,我們無法從gRPC的主要優點之一中受益,后者是粘性可重用連接。
客戶端負載均衡需要對客戶端進行完全控制,如果有一個錯誤的客戶端,則可能會破壞所有計划。
觀察模式負載均衡是對gRPC連接進行負載均衡的最合邏輯且性能最高的解決方案,但是它需要自己的完整且專用的服務,這意味着要在體系結構中實施和操作一項新服務,這些是要考慮到的。
gRPC也需要權衡取舍,了解折衷方案並做出相應選擇至關重要。
原文作者: majidfn
原文鏈接: https://majidfn.com/blog/20201222-grpc-load-balancing/
最后
歡迎掃碼關注我們的公眾號 【全球技術精選】,專注國外優秀博客的翻譯和開源項目分享,也可以添加QQ群 897216102
