1. 程式人生 > >開源RPC(gRPC/Thrift)框架效能評測

開源RPC(gRPC/Thrift)框架效能評測

海量網際網路業務系統只能依賴分散式架構來解決,而分散式開發的基石則是RPC;本文主要針對兩個開源的RPC框架(gRPC、 Apache Thrift),以及配合GoLang、C++兩個開發語言進行效能對比分析。C++、Thrift都是比較成熟的技術,先簡單介紹一下GoLang以及gRPC; GoLang Go語言是由Google開發的一個開源專案,目的之一為了提高開發人員的程式設計效率。 Go語言語法靈活、簡潔、清晰、高效。它對的併發特性可以方便地用於多核處理器 和網路開發,同時靈活新穎的型別系統可以方便地編寫模組化的系統。Go集成了C、Python(PHP)、ErLang等語言的優點,主要特點有:
  • 面向過程的改良, 不追求極致面向物件;
  • 強型別、靜態編譯,幾乎沒有部署依賴(Java需要JVM,PHP/Python需要解析執行器,與靜態編譯的C/C++相當);效能優秀,與C/C++、Java同量級;
  • 為分散式而生,優雅高效的併發能力,基於訊息的併發和同步;
  • 自動垃圾回收,不用再擔心記憶體洩露;
  • 內建各種高階語言型別,各種網際網路協議和類庫;
gRPC 一個高效能、通用的開源RPC框架,其由Google主要面向移動應用開發並基於HTTP/2協議標準而設計,基於ProtoBuf(Protocol Buffers)序列化協議開發,且支援眾多開發語言。 gRPC基於HTTP/2標準設計,帶來諸如雙向流控、頭部壓縮、單TCP連線上的多複用請求等特性。這些特性使得其在移動裝置上表現更好,更省電和節省空間佔用。 本次測試物件主要有三個組合:
  • gRPC & GoLang
  • Thrift & GoLang
  • Thrift & C++
通過這三個組合,基本可以對比出gRPC/Thrift, go/c++兩者在RPC下的效能; 此外,Thrift & C++還有多種伺服器模式,我挑選了TSimpleServer、TNonblockingServer兩種進行測試; 測試環境 CPU:Intel E5-2640 2.50GHz (8 cores) 記憶體:16GB 軟體: CentOS 6.5,Go 1.4、Gcc 4.4.6,開啟tcp reuse, tcp recycle; 測試邏輯 【遠端加法運算】,參考IDL:
MathService.proto
syntax = "proto3"; service MathService { rpc Add (AddRequest) returns (AddReply) {} } message AddRequest { int32 A = 1; int32 B = 2; } message AddReply { int32 X = 1; }
MathService.thrift
service MathService { i32 Add(1:i32 A, 2:i32 B) }
測試場景
  • client, server都是單程序,長連線,在單次連線內發起1w(5w)次rpc呼叫,計算耗時;
  • client, server都是單程序,短連線,共發起1w(5w)次連線,每次連線單次RPC呼叫,計算耗時;
  • 併發4個client程序,每個程序長連線10w rpc,服務端單程序多執行緒(協程),計算耗時;
由於不同語言,耗時統計存在偏差,比如boost.timer在程式裡計算出來的耗時明顯偏小,所以統一使用linux命令time來計算耗時; 測試資料和分析 一、 單程序下,長短連線,兩個RPC框架和兩大語言對比

小結:
  • 整體上看,長連線效能優於短連線,效能差距在兩倍以上;
  • 對比Go語言的兩個RPC框架,Thrift效能明顯優於gRPC,效能差距也在兩倍以上;
  • 對比Thrift框架下的的兩種語言,長連線下Go 與C++的RPC效能基本在同一個量級,在短連線下,Go效能大概是C++的二倍;
  • 對比Thrift&C++下的TSimpleServer與TNonblockingServer,在單程序客戶端長連線的場景下,TNonblockingServer因為存線上程管理開銷,效能較TSimpleServer差一些;但在短連線時,主要開銷在連線建立上,執行緒池管理開銷可忽略;
  • 兩套RPC框架,以及兩大語言執行都非常穩定,5w次請求耗時約是1w次的5倍;
二、 多程序(執行緒,協程)下,兩大RPC框架和兩大語言對比

小結:
  • Go語言本身的併發設計非常優秀,相關RPC框架預設支援協程和非堵塞,通過設定GOMAXPROCS可以非常容易的控制程式佔用的CPU核數,編碼角度無需關心併發實現;
  • C++有堵塞和非堵塞的選擇,同時需要自己實現執行緒池(Thrift自帶),高併發場景下編碼需要特別設計;
  • Thrift框架效能比gRPC框架快兩倍以上;
  • 堵塞模式下的Thrift&C++組合,只能同時針對單個客戶端提供服務,四個客戶端依次順序執行;高併發呼叫場景下,基本不太可能採用;
  • 高併發場景下,使用Thrift框架,Go/C++效能相當,服務端單核處理能力可達3.2w/s。
總結:
  • Go語言效能強勁,語法上靈活、簡單、清晰,易於釋出和部署,可大規模應用於業務、運維、測試系統;(自動GC類語言,GC勢必會影響業務邏輯執行效能,具體影響待海量業務下進一步驗證)
  • gRPC做為Google開源出來的RPC框架,效能上明顯低於Thrift; 但設計上更為規範,基於HTTP/2可以較好的網路適應及擴充套件,協議自帶的流控等功能未能進一步測試;

相關推薦

開源RPCgRPC/Thrift框架效能評測

海量網際網路業務系統只能依賴分散式架構來解決,而分散式開發的基石則是RPC;本文主要針對兩個開源的RPC框架(gRPC、 Apache Thrift),以及配合GoLang、C++兩個開發語言進行效能對比分析。C++、Thrift都是比較成熟的技術,先簡單介紹一下GoLa

冰河開源了全網首個完全開源的分散式全域性有序序列號分散式ID框架!!

## 寫在前面 > mykit-serial框架的設計參考了李豔鵬大佬開源的vesta框架,並徹底重構了vesta框架,借鑑了雪花演算法(SnowFlake)的思想,並在此基礎上進行了全面升級和優化。支援嵌入式(Jar包)、RPC(Dubbo,motan、sofa、SpringCloud、Spring

docker簡易環境搭建實戰篇:以人人網開源專案renren-fast搭建分散式部署後端篇

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast)搭建分散式部署(後端篇) 寫在前面:注:閱讀本文前,請先閱讀docker標籤的docker簡易系列的文章。 後端最終實現的架構圖: 第一步 簡單瞭解人人開源專案renren-fast 官網:h

靜態程式碼分析工具清單:開源各語言

本文是一個靜態程式碼分析工具的清單,共有26個工具。包括4個.NET工具、2個Ada工具、7個C++工具、4個Java工具、2個JavaScript工具、1個Opa工具、2個Packaging工具、3個Perl工具、1個Python工具。 1.NET .NET Compiler Platfo

sql server 2016新特性 查詢儲存Query Store效能影響

前段時間給客戶處理效能問題,遇到一個新問題, 客戶的架構用的是 alwayson ,並且硬體用的是4路96核心,記憶體1T ,全固態快閃記憶體盤,sql server 2016 。 問題  描述        客戶經常出現系統卡住的現象,從當時跟蹤的語句執行情況看  是補卡住了,但每次的阻塞源頭都不一樣,當

春節前最後一篇,CRUD碼農專用福利:PDF.NET之SOD Version 5.1.0 開源釋出兼更名

從2013.10.1日起,原PDF.NET 將更名為 SOD :- 原PDF.NET框架將成為一個全功能的企業開發框架,而 SOD框架將是PDF.NET開發框架下面的 “資料開發框架 ”,詳細資訊請看框架官網 框架下載地址:  大大的 下載按鈕 ,進去便是 。 原始碼的獨立下載正在

學習Cassandra的開源電子書中英文版

之前釋出了英文版,現在包含中文版了。 學習Cassandra 本書循序漸進的引導開發人員理解Cassandra是什麼,如何工作以及如何使用Apache Cassandra 2.0的功能。 本書更多的關注開發人員的視角,也就是說,不會介紹太多關於Cassandra安裝和管理的內容,這些內容可以獨立作為一個的針

java實現各種排序演算法(包括氣泡排序,選擇排序,插入排序,快速排序簡潔版)及效能測試

1、氣泡排序是排序裡面最簡單的了,但效能也最差,數量小的時候還可以,數量一多,是非常慢的。      它的時間複雜度是O(n*n),空間複雜度是O(1)      程式碼如下,很好理解。 public static void bubbleSort(int[] arr)

推薦10個Java方向最熱門的開源專案8月

1. JCSprout(Java核心知識庫) 2. Java-Guide (Java學習指南) star: 3.1k 介紹: 一份涵蓋大部分Java程式設計師所需要掌握的核心知識,正在一步一步慢慢完善,期待您的參與。 3. java-

DRFdjango-rest_framework框架

views.py from django.shortcuts import render # Create your views here. from rest_framework import serializers from rest_framework.views import APIView

Android專案中最火最常用的優秀開源專案很有用

有那麼多漂亮好用的輪子,總是忍不住好好地總結分類收藏一番。 而收藏,當然是為了在可能需要的時候能夠迅速果斷地找到一個合適我們專案的輪子。 分類 詳細 框架名稱 簡介 Star 數 最近 更新 UI 選單 比較

輕量級C#網路通訊元件StriveEngine —— C/S通訊開源demo附原始碼

private ITcpServerEngine tcpServerEngine; private void button1_Click(object sender, EventArgs e) { try { //初

來自官方的Android資料繫結Data Binding框架

資料物件 任何的POJO 物件都可以用作資料繫結,但是修改一個 POJO 物件不會更新 UI。 資料繫結的威力在於,賦予資料物件在資料改變的時候通知其他元件的能力。有三種資料改變通知機制:Observable 物件、ObservableFields 和 observa

近期GitHub上最熱門的開源專案附連結

2 月份 GitHub 上最熱門的開源專案又出爐了,又有哪些新的專案擠進熱門榜單了呢,一起來看看

統計學習監督學習框架總結

以下內容參考《統計學習方法》李航著,《Python機器學習及實踐》範淼、李超著 機器學習:監督學習——對事物未知表現的預測                     無監督學習——對事物本身特性的分析                     半監督學習,強化學習 無監督學習:

小檔案大量時效能問題

記錄一個比較有趣的問題:在小檔案非常多的情況下,會對效能有什麼影響? 首先看寫操作: 在寫檔案時,作業系統需要向硬碟管理系統傳送IO請求,那麼多個小檔案,就意味著作業系統要向硬碟管理系統傳送多次IO請求。隨著檔案數目上升,多個IO請求耗費的時間逐漸累加,最終甚至可以大於本身

Github上一些好用的開源專案隨時記錄

1、RecyclerViewSwipeDismiss(滑動刪除recycleView) 專案地址 https://github.com/CodeFalling/RecyclerViewSwipeDismiss 使用:1、匯入libary檔案到專案中;            

GTK+圖形化應用程式開發學習筆記十七框架構件、比例框架構件

一、框架構件 框架構件(GtkFrame)可以用於在盒子中封裝一個或一組構件,框架本身還可以有一個標籤。標籤的位置和風格可以靈活改變。 我們用gtk_frame_set_label函式建立框架構件。 1. 名稱:: gtk_frame_new 功能: 建立

整理總結unity效能優化

一 減少Draw call Draw call就是cpu對圖形繪製介面的呼叫,CPU通過呼叫圖形庫(directx/opengl)介面,命令GPU進行渲染操作。 每一次繪製CPU都要呼叫DrawCa

使用C++通過Thrift訪問/操作/讀寫Hbase

#include "HbaseOperate.h" #include "log4cxx/log4cxx.h" #include "log4cxx/propertyconfigurator.h" static log4cxx::LoggerPtr logger(log4cxx::Logger::ge