天天看點

.net RPC架構選型

    近期開始研究分布式架構,會涉及到一個最核心的元件:RPC(Remote Procedure Call Protocol)。這個東西的穩定性與性能,直接決定了分布式架構系統的好壞。RPC技術,我們的産品中其實早就已經應用。但是産品中經常出現通路失敗等錯誤,在沒有細緻研究的情況下,大家懷疑是選用的RPC元件不穩定引起。今天也借這個機會給這個元件正名一下吧。

    選型的思路很簡單,先baidu找業界最有名的RPC架構,看各種牛人的的對比分析,然後到github上搜尋排名和評價靠前的元件,确定一個選型的大緻範圍,然後進行一輪測試。當然,我們是有特性要求的:

      1.最好支援TCP、HTTP兩種通訊協定。即使不支援也可以擴充,或者內建兩種RPC元件。

      2.最好支援異步、同步兩種調用方式。

      3.性能要盡可能的好。

      4.通訊層最好要有失敗重試的機制或者類似的補償機制。

      5..net技術路線。

    經過篩選,大緻确定了5個元件:Thrift、gRPC、Halibut、SCS、Shuttler.net(這是按照知名度排序的)。前兩個大家都很熟,後3個比較陌生吧。其中Halibut是Octopus deploy産品中的元件,已經在各種場景中驗證過了,對其也寄予一定的厚望(Octopus deploy是自動化部署的産品,微軟也在用,是個好東西)。

    我的測試方法有些特殊,分為本機和區域網路兩種網絡環境測試(我們的區域網路是無線。300M帶寬?好像是!)。每種環境在細分為兩種場景:無限制、加入10MS延遲和1%丢包。

    Thrift情況如下:

單連接配接 本機調用:100次耗時(毫秒) 區域網路調用:100次耗時(毫秒)
無限制 丢包率:1%,延遲:10ms
響應時間 失敗次數
第一次測試 79.1 0.0 10879.9 3816.1 8221.7
第二次測試 83.1 10613.9 3410.8 9189.4
第三次測試 80.6 12221.1 3726.1 9662.5
平均 80.9 11238.3 3651.0 9024.5

每次通路

建立連接配接

81.6 19414.9 3298.6 13124.0
22372.1 3200.1 13680.2
82.1 21589.0 3958.9 15757.5
82.2 21125.3 3485.9 14187.2

    gRPC情況如下:

200.8 16899.8 3990.4 9199.9
200.2 18200.1 4099.9 9200.1
200.4 16801.0 3800.2 9599.6
200.5 17300.3 3963.5 9333.2
20522.1 66560.1 41991.2 38106.0
20713.1 51348.0 40517.2 41988.8
20751.5 56108.4 42404.0 52477.6
20662.2 58005.5 41637.5 44190.8

    Halibut情況如下:

75.1 15593.3 1056.6 13457.4
16775.7 775.9 9023.0
16857.4 891.4 10739.2
79.9 16408.8 908.0 11073.2
1237.4 46431.4 17210.6 25839.7
1237.9 44134.8 10440.8 34425.2
1232.4 43727.5 22320.3 26654.1
1235.9 44764.6 16657.2 28973.0

    SCS情況如下:

67.0 15465.6 685.6 7179.0
68.0 18709.0 819.1 11511.9
69.0 14791.2 703.3 7319.3
16321.9 736.0 8670.1
74.1 20980.5 757.4 8978.9
70.0 22169.9 770.6 10990.9
77.6 16133.7 1019.4 14943.6
73.9 19761.4 849.1 11637.8

    Shuttler.net情況如下:

Shuttler是支援TCP和HTTP兩種協定的,但是TCP的錯誤太多了,我就不貼了
建立連接配接(HTTP)
46.5 46950.1 3062.8 37665.3
40.5 42380.0 2016.0 42242.0
39.5 47681.7 2080.4 35739.7
42.2 45670.6 2386.4 38549.0

    實際環境中,肯定是區域網路環境,是以我把區域網路部分的結果統計了一下。因為失敗次數都為0,是以隻統計了耗時。

項目(100次調用響應時間MS,區域網路環境) Thrift Thrift(Teld) gRPC Halibut SCS Shuttler.net
單連結 3774.8
9586.7
多連結 3777.6
9154.8

    通過統計結果來看,SCS有三項第一,一項第二。特别是沒有加入丢包和網絡延遲的情況下,性能表現非常好。下一步對它和Thrift進行深入的研究。