從Minos部署系統談談XML-RPC
本文將根據小米開源的大資料部署系統Minos,談一談重要的"橋樑"XML-RPC。
本文將圍繞三個方面展開:什麼是XML-RPC、簡單實現一個XML-RPC server/client以及鏈式使用XML-RPC時遇到的問題及解決方法。
Minos是小米2013年開源的針對海量服務節點無法高效操作及統一配置管理的痛點,全新探索並研發的一套大型分散式部署及監控的系統。該系統基於supervisor XML-RPC實現分散式計算,支援跨地域、多節點部署服務。
上圖為Minos架構圖,客戶端對task節點的操作透過supervisor的XML-RPC完成。接下來我們談談什麼是XML-RPC,它是如何工作的。
XML-RPC是一個遠端過程呼叫(遠端程式呼叫)(remote procedure call,RPC)的分散式計算協議,透過XML將呼叫函式封裝,並使用HTTP協議作為傳送機制。
[1]可以用Perl, Java, Python, C, C++, PHP和許多程式語言實現。實現適用於Unix,Windows和Macintosh。
XML-RPC是受兩個早期協議的啟發。一個是由Dave Winer設計的匿名RPC協議。(這就是為什麼XML-RPC伺服器通常安裝在/RPC2下。)另一個更重要的是SOAP協議的初稿。Dave Winer提供了豐富的XML-RPC歷史淵源,對XML-RPC和SOAP之間的關係感興趣的可自行查閱資料。
一個簡單的示例。
服務端程式碼示例:(Python2.7 執行環境)
#-*- coding:utf-8 -*- from SimpleXMLRPCServer import SimpleXMLRPCServer from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler # 指定路徑 class RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2',) # 構建server server = SimpleXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler) server.register_introspection_functions() # 註冊pow函式 # pow.__name__為 pow函式的名稱 server.register_function(pow) # 註冊自定義函式 def adder_function(x,y): return x + y server.register_function(adder_function, 'add') # 註冊例項; # 例項的方法均釋出為 XML-RPC的方法 class MyFuncs: def div(self, x, y): return x // y server.register_instance(MyFuncs()) # 啟動server server.serve_forever()
接下來客戶端將呼叫服務端的方法:
#-*- coding:utf-8 -*-import xmlrpclib s = xmlrpclib.ServerProxy(') print s.pow(2,3) # Returns 2**3 = 8print s.add(2,3) # Returns 5print s.div(5,2) # Returns 5//2 = 2# 列印服務端所有方法 print s.system.listMethods()
由此在部署系統中,構建supervisor XML-RPC的服務端,封裝對節點操作的方法,由客戶端遠端呼叫此方法,實現分散式部署。
不過,SimpleXMLRPCServer是一個單執行緒的伺服器。這意味著,服務端同時收到多個客戶端傳送的多個請求,必須等待第一個請求完成以後才能繼續。有個最直接的方法可以解決這個問題:
from SimpleXMLRPCServer import SimpleXMLRPCServer from SocketServer import ThreadingMixIn # 新增構建ThreadXMLRPCServer類 class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass # 重新構建server server = ThreadXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler,allow_none=True) #Forking and threading versions of each type of server can be created using the ForkingMixIn and ThreadingMixIn mix-in classes. For instance, a threading UDP server class is created as follows:[2] class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
閱讀ThreadingMixIn的原始碼發現,ThreadingMixIn重寫了server類中呼叫的process_request方法。因此實現了server端多執行緒處理。
在我們實際應用中,當我們構建多個XML-RPC server的client,進行鏈式呼叫時,經常遇到httplib.CannotSendRequest的報警。
呼叫過程:
client -- calls -- SimpleXMLRPCServer’s functions -- calls --SimpleXMLRPCServer's functions -- do finish task
記過排查CannotSendRequest發生在當一個httplib.HTTPConnection被又一次新的“request”操作中斷。 所以,每個httplib.HTTPConnection.request必須以.getresponse()呼叫配對。 如果該配對被另一個請求操作中斷,第二請求將產生CannotSendRequest錯誤。 所以,類似如下請求,將會產生錯誤:
connection = httplib.HTTPConnection(...) connection.request(...) connection.request(...)
問題分析:
兩次呼叫都是serverproxy來構建的。只有在同時多次請求的時候出現了這個問題,應該是存在資源競爭條件。serverproxy在中間層被共享。
解決思路:
是讓每個執行緒建立自己的serverproxy。
解決方案:
在呼叫第一個SimpleXMLRPCServer的方法時構建下一次呼叫的連結。確保每個執行緒維護自己的serverproxy。
RPC在許多分散式的系統中都有著重要的應用,高效簡單,但在實際應用中多執行緒的處理上踩過一些坑,以上是在XML-RPC應用中的總結。
相關參考:
[1]Simon St. Laurent, Joe Johnston, Edd Dumbill. Programming Web Services with XML-RPC. First Edition. O'Reilly. 2001-06.
[2]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559359/viewspace-2217867/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 談談Linux系統啟動流程Linux
- 談談系統密碼儲存策略密碼
- 談談ACT手遊戰鬥系統
- 談談作業系統的多程式作業系統
- 談談優惠券系統的設計
- 從 原始碼 談談 redux compose原始碼Redux
- 短影片直播系統為什麼需要分散式部署,淺談分散式部署分散式
- Feed 流系統雜談
- 談談WINDOWS下重灌系統後oracle的恢復WindowsOracle
- 從 React render 談談效能優化React優化
- 來談談限流-從概念到實現
- 談談元件化-從原始碼到理解元件化原始碼
- 【前端打包部署】談一談我在SPA專案打包=>部署的處理前端
- 談談高併發系統的一些解決方案
- 從《Project Makeover》的成功,談談它對三消+遊戲系統設計與創新的啟示Project遊戲
- 淺談WPF之屬性系統
- 淺談差分約束系統
- 廣告系統淺談反作弊
- 淺談教你如何掌握Linux系統Linux
- 也談SAP系統優缺點
- 【前端打包部署】談一談我在SPA專案打包=>部署的處理(上)前端
- 從系統功能入手,談知識付費仍需改進的地方
- “談談MySQL的基數統計”MySql
- 淺談架構-從傳統走向分散式架構分散式
- minos 2.4 中斷虛擬化——中斷子系統
- 從影像融合談起
- 從JDK11新增HttpClient談談非阻塞模型JDKHTTPclient模型
- 從原始碼角度談談AsyncTask的使用及其原理原始碼
- 從《恥辱》到《掠食》:談談怪物設計
- 從釋出-訂閱模式談談 Flask 的 Signals模式Flask
- 談談從CAP定理到Lambda架構的演化架構
- 淺談支付系統開發基本流程
- 談談目前國內已知的主機管理系統現狀和使用感受
- 談談近況,談談自由職業,談談“金飯碗”
- 【雜談】從CGI到ServletServlet
- 從預防、應急、覆盤全流程詳談系統穩定性建設
- “被看見,才有價值” 從心理學談遊戲中的社交系統遊戲
- 談談surging引擎的tcp、http、ws協議和如何容器化部署TCPHTTP協議