分散式系統中的必備良藥 —— RPC

来源:http://www.cnblogs.com/Zachary-Fan/archive/2017/12/18/rpc_overview.html
-Advertisement-
Play Games

閱讀目錄 前言 成熟的解決方案 剖析 性能測試 結語 一、前言 在上一篇分散式系統系列中《分散式系統中的必備良藥 —— 服務治理》中闡述了服務治理的一些概念,那麼與服務治理配套的必然會涉及到RPC框架。在當前互聯網的大背景下,RPC的運用應該大家或多或少都有涉及,國內外的RPC框架也是百花齊放。那麼 ...


閱讀目錄

 

一、前言

  在上一篇分散式系統系列中《分散式系統中的必備良藥 —— 服務治理》中闡述了服務治理的一些概念,那麼與服務治理配套的必然會涉及到RPC框架。在當前互聯網的大背景下,RPC的運用應該大家或多或少都有涉及,國內外的RPC框架也是百花齊放。那麼各個RPC框架各自有什麼特點,另外RPC的核心點又是哪些,我們該如何去選擇是本文需要講述的內容。本文會圍繞.Net技術棧來展開,暫不討論諸如dubbo之類對.Net 不太友好的框架。

 

二、成熟的解決方案

  1.Google.gRpc(https://github.com/grpc/grpc

    大名鼎鼎的Google出品的RPC框架,基於Http2設計,支持雙向流、消息頭壓縮、單 TCP 的多路復用、服務端推送等特性,這些特性使得 gRPC 在移動端設備上更加省電和節省網路流量。使用的時候需要通過定義proto文件生成客戶端和服務端代碼,可以跨平臺(客戶端和服務端生成代碼時使用不同的語言)。如果大家已經被微軟寵慣了,那麼是不太習慣以一個純txt方式編輯這個proto文件的,畢竟全部需要手打 ╮(╯_╰)╭

  2.Facebook.Thrift(https://github.com/apache/thrift

    同樣是大廠Facebook出品的RPC框架,使用方式和gRpc類似,需要通過定義.thrift文件生成客戶端和服務端代碼,可以跨平臺(客戶端和服務端生成代碼時使用不同的語言)。Thrift的缺點是無法生成async,await,Task<T>之類的泛型代碼,這個對於當下大背景來說有一定的局限性(如果有小伙伴知道如何解決此問題,感謝賜教)。Thrift最大的特點是5種適用不同場景的服務模型,一圖勝千言,直接上圖,見圖1:

                    【圖1】

     但是遺憾的是Apache在.Net下提供的實現並不是上面的5種模式,僅僅3種(TSimpleServer、TThreadPoolServer、TThreadedServer),特別是在Java下大規模宣傳的NIO模式沒有提供實現。

  3.Orleans(http://dotnet.github.io/orleans/

    這是微軟在2015開源的構建分散式應用的框架。(什麼意思?那它是RPC框架麽?)我想這是大部分對Orleans不熟悉的同學的疑問,實際上Orleans的層次比RPC框架更高,它不僅僅解決了遠程調用問題,其內部還包含了服務發現、負載均衡、高可用等一些處理機制。一般用Akka(有.net版本 Akka.net)和它對標,都是基於Actor模型設計的分散式框架,順手附上一篇經典的對比文章:https://github.com/akka/akka-meta/blob/master/ComparisonWithOrleans.md 。Orleans最大的特點就是微軟一向的風格,高度封裝,提高生產力。面向OOP的設計,便於使用,大家可以在文末下載Demo感受一下,手感和WCF比較類似。

  4.WCF

    這應該是.net系下做分散式系統開發中的RPC標配了,隨著.net framework3.5在2007年推出,可謂功能豐富,而且支持的協議相比其它框架也是最多(沒有之一)。

  5.WebApi

    這是隨著VS2012一起推出的REST化API的一項web服務。近幾年隨著整個大環境的變化,逐漸有代替WCF的趨勢。跨平臺(特別是針對移動端有很大優勢)、便於開放共用和測試是他相對WCF的最大優勢。

 

三、剖析

   上面的這些框架說不上孰優孰劣,都有各自適用的場景。那麼我們來刨析一下如果要選擇哪個RPC框架更適合的話從何處入手。一個RPC框架核心的概念是下麵幾個:

網路協議:

  這是RPC框架的核心,面向什麼協議去設計,基本上也已經決定了框架最理想的適用場景了。協議又分為2個大類,分別對應OSI七層模型的應用層(http協議、ftp協議等)和傳輸層(tcp協議、udp協議)。這其中的協議又有各自的特點,這裡就不展開說了。當然有些框架將協議這層做成可適配的,比如WCF(不同協議)、thrift(同協議不同實現),那麼他們的覆蓋場景肯定就更多,但是相應的框架的實現複雜度肯定也是相應增加,需要考慮是否能接收這帶來的額外成本。

 

 序列化方式:

  序列化一般從3個維度去考慮,數據大小、可讀性、傳輸效率(序列化反序列所消耗的時間)。屬於可讀性較好的序列化比如Json;屬於數據壓縮比比較好的序列化比如Protobuf;屬於傳輸效率高的序列化比如MessageShark、MessagePack、Protobuf等。對於對性能十分執著的小伙伴們,這裡有一份轉載的基準測試報告,連接附上:https://www.cnblogs.com/shanyou/p/3294201.html 。大部分的框架都會序列化這層做成可適配的,相對網路協議,對序列化的個性化迫求是更強烈的。

 

四、性能測試

測試環境如下:

  CPU:I5-4300U 1.90GHz  2.50GHz

  記憶體:8G

  策略:10000次調用發送封裝world字元串的對象HelloRequest,並等待接收返回封裝Hello world字元串的HelloReply對象。

  網路:數據較小+本地調用,網路不是問題。想進一步測試區域網和大數據的可以基於文末的Demo項目自行改造。

  這裡需要提一下,WCF的測試使用了http和tcp2種常見的模式,針對webapi的訪問使用了HttpClient和HttpWebRequest2種方式。另外值得註意的是,由於Thrift和HttpWebRequest不支持多線程復用同一個實例,故在測試中都是使用每次實例化的方式進行(包括線程數1的時候)。

  由於數據比較多,直接付上2個動圖,想進一步分析的可以在文末下載excel自行解決~。見圖2,圖3:

                  【圖2】

                  【圖3】

  

五、結語

  這個是我網上找到的一篇性能相關的文章,大家可以參考一下:http://blog.csdn.net/jek123456/article/details/53395206

  歸根到底,大家在使用之前還是需要結合自己的實際情況,放到實際的場景去測一把,看看效果。下麵奉上替大家邁出第一步的Demo,大家可以進行進一步的深入研究。

 

 

本文相關的測試數據excel在此:https://github.com/ZacharyFan/RpcTest/raw/master/PerfTest.xlsx

本文相關的Demo地址在此:https://github.com/ZacharyFan/RpcTest

 

 

 

作者:Zachary_Fan
出處:http://www.cnblogs.com/Zachary-Fan/p/rpc_overview

 

 

 

如果你想及時得到個人自寫文章的消息推送,歡迎掃描下麵的二維碼~。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相信各位都在在網上買過東西吧?那麼今天我的主題就是寫個線上購物系統,是不可能的,哈哈(後期確實有這個項目),那麼購物都填寫過快遞地址吧?然後網上查個地址都有地址管理吧? 要求: 1.列印出省、市、縣等多級目錄 2.每一級可以返回到上一級,第一級不能再往上返回 3.可以隨時退出系統 分析: 1.簡單的 ...
  • 使用fmsb包繪製雷達圖 {r} library("fmsb") radarfig ...
  • 1.解釋器路徑 2.編碼 1.ascill 00000000 (8個位表示) 缺點:表示不了英文 2.unicode 0000000000000000+ (至少16位表示) 缺點:消耗記憶體,當表示位不需要16位以上,造成多餘記憶體消耗 Python3 無需關註 Python2 每個文件中只要出現中文, ...
  • [TOC] 一、簡介 java中的日期處理一直是個問題,沒有很好的方式去處理,所以才有第三方框架的位置比如joda。 文章主要對java日期處理的詳解,用1.8可以不用joda。 1. 相關概念 首先我們對一些基本的概念做一些介紹,其中可以將GMT和UTC表示時刻大小等同。 1.1 UT時間 UT反 ...
  • 一、簡介 JavaBean組件是一些可移植、可重用並可組裝到應用程式中的Java類,類必須是具體的和公共的。 符合下列設計規則的任何Java類均是以JavaBean: 1.對數據類型“protype”的每個可讀屬性,Bean下必須有下麵簽名的一個方法:public proptype getPrope ...
  • 1 import java.util.HashMap; 2 import java.util.Iterator; 3 import java.util.Map; 4 5 public class TestMap { 6 public static void main(String[] args) {... ...
  • 背水一戰 Windows 10 之 控制項(自定義控制項): 自定義控制項的 Layout 系統, 自定義控制項的控制項模板和事件處理的相關知識點 ...
  • 前言 ASP.NET Core 2.0 怎麼發佈到Ubuntu伺服器?又如何在伺服器上配置使用ASP.NET Core網站綁定到指定的功能變數名稱,讓外網用戶可以訪問呢? 步驟 第1步:準備工作 一臺Liunx伺服器:筆者用的是【[搬瓦工][1]】的VPS伺服器(CDN加速,支持支付寶,多機房選擇) 低配版 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...