程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> ffrpc-c++進程間(服務器端、客戶端)通信框架

ffrpc-c++進程間(服務器端、客戶端)通信框架

編輯:C++入門知識

FFRPC

github 地址 https://github.com/fanchy/FFRPC

FFRPC 已經陸陸續續開發了1年,6月6日這天終於完成了我比較滿意的版本,暫稱之為 V0.2,FFRPC實現了一個C++版本 的異步進程間通訊庫。我本身是做游戲服務器程序的,在服務器程序領域,系統是分布式的,各個節點需要異步的進行通信, 我的初衷是開發一個易用、易測試的進程間socket通信組件。實際上FFRPC 已經是一個框架。

FFRPC 主要特性

  • FFRPC 采用Epoll Edge Trigger模式,這裡特別提一下ET是因為在異步工作模式,ET方式才是epoll最簡單也是最高效的方式 網上的很多帖子寫LT簡單易用,那純碎是沒有理解ET的精髓之所在,如果讀者想要從ffrpc中探究一下ET的奧妙,提醒讀者的是 請把Epoll 看成一個狀態機!FFRPC 采用Broker模式,這樣的好處是 Scalability!! 在游戲領域的開發者一定很熟悉Master/Gateway/Logic Server的概念, 實際上Master 實際上扮演的Broker master的角色,而gateway扮演的是Broker slave的角色,Broker Slave負責轉發客戶端的 請求到Logic Service,提供一個轉發層雖然會增加延遲,但是系統變得可擴展,大大提高了吞吐量,這就是Scalability!! 而Broker master負責管理所有的Master Slave,負責負載均衡。不同的client分配不同的Broker SLave。
  • FFRPC 就是基於以上的思路,有如下四個關鍵的概念:
    • 一:broker master 負責負載均衡,同步所有節點的信息,所有的slave broker和rpc service/ rpc cleint都要連接broker master。
    • 二:slave broker負責完成service和client間轉發消息,如果service、client和broker在同一進程,那麼直接在內存間投遞消息, 這是v0。2的重要的優化,v0。1時沒有此功能,網友很多反應這個問題,看來大伙對優化還是太敏感! 另一個創新之處在於ffmsg_t,封裝了消息的序列化和反序列化,我已經厭倦了protobuff,如果你也研究了為每個消息定義cmd 和為cmd寫switch(有些人可能已經用上注冊回調函數,但還有更好用的)。實際上定義消息結構體時一個消息本身就是獨一無二的, 所以為什麼我們還要給消息在定義一個cmd呢?比如定義了struct echo_t{int a;}消息,echo_t名稱本身就是獨一無二的,否則編譯 器肯定報錯了,那麼為什麼不直接用echo_t這個名稱作為cmd呢?在FFRPC中可以使用TYPE_NAME(echo_t)獲得消息體名稱字符串, 是滴TYPE_NAME是一個很有意思的實現,c++中並沒喲關鍵字可以獲取一個類的名稱,但是所有的編譯器都實際上已經提供了這個功能! 詳情請看源碼。有讀者可能會糾結使用消息體結構的名稱做cmd固然省事,但是浪費了流量!32位的cmd總是比字符串省流量,是的這個 結論雖然我很不喜歡(我總是懶的優化,除非...被逼的),但是他是對的!ffrpc中很好的解決了這個問題,當每個節點初始化時都要 注冊到broker master,這時所有的消息都會在master中分配一個唯一的msg id,這樣就可以用整數1代表echo_t結構了,由於每個節點 都知道echo_t到1的映射,所以程序員再也不用手動定義cmd了,broker唯一初始化時動態定義。
    • 三:ffrpc service,提供接口的模塊,也就就是服務端,通過ffrpc類注冊的接口基於異步模式,推薦的模式是每個消息都返回 一個結果消息
    • 四:ffrpc client是調用的ffrpc service的模塊,基於異步模式,記住服務名成和消息名稱唯一的確定一個接口,這個c++的類和類接口 概念是一致的,而且調用遠程接口時可以指定回調函數,而且回調函數還支持lambda參數綁定!
  • 想快速見證ffrpc庫的魅力可以小看如下的示例,只要你有linux系統,可以1分鐘內測試這個示例,ffrpc沒有其他依賴,提醒你的是 FFRPC的日志組件是彩色的哦!

示例代碼

#include <stdio.h>

 
 in_t:  ffmsg_t<in_t><<>> out_t:  ffmsg_t<out_t><<>>
     echo(ffreq_t<echo_t::in_t, echo_t::out_t>&.data =, 
     echo_callback(ffreq_t<echo_t::out_t>& req_, ,  main( argc, *
    LOG.start(

    ffrpc_t ffrpc_service(&foo_t::echo, &.data = 
    printf(, .get_type_name());

     ( i = ; i < ; ++
        ffrpc_client.call(, , ffrpc_ops_t::gen_callback(&foo_t::echo_callback, & 

 

總結

  • ffrpc中broker、client、service可以啟動在不同的進程,如果在同一進程,那麼直接內存間投遞消息
  • ffrpc 每個實例單獨啟動一個線程和任務隊列,保證service和client的操作都是有序、線程安全的。
  • 如果你研究過protobuff、thrift、zeromq、ice等等類庫/框架, 更要試用一下ffrpc。
  • github 地址 https://github.com/fanchy/FFRPC

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved