文章出處

系統邊界


什么是系統邊界?系統邊界就是在系統設計之初,對系統所要實現的功能進行界定,不亂添加,不多添加。這么做的好處就是,系統簡單明了,主旨明確,方便開發和用戶使用。舉個例子,一個自動售貨機的本職工作是自動售貨,用戶投入零錢,選擇商品,出貨,找零,功能簡單明了。但是,工程師非要再給售貨機添加一個播放音樂的功能,原因是能夠提升用戶感受,用戶在買東西的時候聽音樂會心情舒暢,這明顯就是亂加功能。更麻煩的是,有一天播放音樂的功能出了故障,由于售貨過程依賴音樂播放功能,售貨也跟著不能用了,這會更糟糕。如果買東西和播放音樂是獨立的,那么即使音樂播放不成功,也不影響用戶購買,而現在用戶只能眼巴巴看著售貨機不斷的罵售貨機的設計者是個傻X。

那么SimpleRpc的功能邊界是什么呢?SimpleRpc只提供一個跨網絡RPC框架,用戶代碼在固定的錨點插入,來完成這個RPC調用。

  1. 這個RPC不保證數據安全。有些rpc會使用ssl進行數據加密,但是SimpleRpc不考慮這種問題,因為服務調用在同一個機房內進行,不會涉及到外網數據傳輸,故不考慮數據加密。
  2. SimpleRpc不支持服務發現機制。有些Rpc會順帶實現服務注冊以及發現功能,比如GRPC。但是我們的服務就是展示一個簡單的RPC調用,其它功能忽略。
  3. SimpleRpc只有C++語言代碼,暫時不支持其它語言。因為,這個框架只是學習交流的目的,不推薦用在生產環境。
  4. SimpleRpc不需要IDL(接口描述語言)文件。因為我們就是要略去IDL轉換成代碼這個繁瑣的步驟,我們隱含默認服務端提供固定的計算服務,要求客戶端和服務端配套使用。
  5. SimpleRpc不提供數據的序列化和反序列化功能,我們只專注于RPC調用框架實現,序列化和反序列化可以使用第三方開源軟件protobuf完成。

整體架構


 

 

客戶端請求以及服務端響應的整個流程:

  1. 客戶端序列化請求數據后,通過socket發送給服務器。
  2. 服務端網絡事件監聽響應器捕捉到socket上的讀事件(由于客戶端發送了數據,服務端socket上會有讀信號返回,告訴服務端可讀)。
  3. 服務端響應器把讀事件放到事件隊列中。
  4. 服務端工作線程從隊列中獲取事件。
  5. 服務端工作線程通過事件綁定的端口讀取客戶端請求,進行反序列化,調用用戶層面的請求處理代碼(例如做加法)。
  6. 服務端工作線程把用戶層面的處理生成的響應數據序列化成字節流,通過socket發送回客戶端。
  7. 客戶端網絡事件監聽響應器捕捉到socket上的讀事件(由于服務端發送了響應數據,客戶端socket上會有讀信號返回,告訴客戶端可讀)。
  8. 利用客戶端響應器線程讀取網絡數據,反序列化,并把響應返回給用戶層面代碼。

從這個模型中可以看到,客戶端與服務端都是用網絡事件監聽響應器獲取網絡事件,不同的地方是服務端采用工作線程反序列化、計算,而客戶端使用反應器線程做數反序列化。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()