Dora-RPC端午升級,目前master還在beta版本增加了大量的特性。
項目線上已經有幾家公司平穩使用一年多了,當然他們是以此為原型進行了一定改造。最近升級改進了很多,如去掉unique函數導致效能翻倍,探索服務端有個別函數會被重複執行問題目前都已經修複,另外增加了非同步任務拿回結果。目前groupclient也在改造,稍晚會將groupclient的功能整合到client內而不是兩個用戶端。
在之前一直沒有深入做介紹,這裡簡單介紹一些目前有的特性:
此開源使用Swoole擴充進行的再次封裝,用於PHP前後端分離,當我們項目變得龐大的時候我們需要隔離一些功能作為公用服務,我們希望通過這個方式將我們複雜的系統通過API服務變的簡單易維護,更好評估複雜項目和跨項目組調用更加清晰。
架構思考:
- 僅提供一套最基本的服務端和用戶端,通過簡單整合即可使用在任何開發架構上。
- 返回資料結構分三層,每層都有msg和code,第一層(底層)代表當前用戶端通訊情況,第二層代表當前api在服務端執行情況是否有異常或者投遞情況,第三層代表代碼執行情況若業務代碼產生異常自動會紀錄在這裡。使用這個方式是因為RPC本身的複雜性,特提供這個方式來判斷系統真正的狀態。
- 為了支援非同步任務稍晚擷取功能,將開發包底層都做了升級,主要原因是服務端處理完非同步任務後會向用戶端發送處理結果,如果當前用戶端向服務端下發新任務並執行Recive的時候,之前用戶端是無法判斷出這次返回的內容是否為此次請求,與此同時由於長連結的特殊性,上一次的請求如果被異常中斷沒有執行recive的話,會導致上次的結果被本次請求拿到。為了防止以上問題特做了guid產生功能通過guid的判斷完成了非同步任務結果的收集和非本次請求的返回資料鑒別。
- 由於我們的業務代碼特殊性,我們不能保證我們的業務代碼不會因為一些特殊原因產生故障,很多故障會導致進程終止,為此我們的業務代碼都是在task上執行的,而不是worker上。通過這個方式我們可以做很多特殊的功能。不過task缺點是很多swoole非同步特性不支援。
- 服務分組,很多情況下我們是一個公用池子,既然同在一片天下我們就會收到影響。另外不同業務部署在不同的伺服器上也很常見,為此我們提供了服務分組功能。規定某個伺服器屬於哪幾個組,通過組能找到正確的伺服器配置進行串連工作。
任務下發模式:
下發任務數量可以分為:
下發任務等待結果有多個模式:
- 下發任務阻塞當前進程等待處理完畢並拿到返回資料
- 下發非同步任務不等待任務處理結果,只會返回下發成功,而任務在伺服器跑完畢後沒有任何返回
- 下發非同步任務不等待任務在伺服器的處理,下發成功後馬上返回下發成功,而服務完成後服務端返回處理結果給用戶端,用戶端通過一個函數統一將所有之前非同步任務結果擷取返回給當前業務進程。
通過以上方式我們可以成倍的增加我們介面響應速度和伺服器利用能力。即使不使用複雜的多線程我們也可以達到我們的目標。
網路通訊:
- 用戶端可以在PHP-FPM及CLI下工作,可維持長連結
- 每次來回一次請求網路耗時在 0.002~0.004 左右(也取決於內網網路)
- 請求處理完畢後連結仍舊保留不關閉 減少握手耗時及用戶端隊伺服器的連接埠數消耗。
- 若資料較大,支援包壓縮gzip若有特殊需要可簡單更改為其他壓縮方式
- 序列化使用的PHP內建的serialize若有需要可以直接自行更換
- 串連和接收結果預設逾時3秒,在const檔案內設定,如果出現逾時,用戶端會自動使用其他配置進行嘗試重試指定次數後返回json描述錯誤原因。如果有需要可以在重試邏輯內增加重試監控,監測各個伺服器的工作狀態。
- 如果在本次請求中有一個ip已經失敗過一次會自動在本次內進行屏蔽,如果發現所有配置已經都嘗試或超過重試次數會返回失敗。cli下失敗一次後再次下發API時會取消掉之前所有屏蔽配置繼續重試。
- 之前RPC單線程用戶端和虛擬機器下的測試QPS大概在200~500次每秒通訊,但是每次下發的任務可以很多QPS可以在2k 單應用伺服器
- 當前的通訊架構並沒有假如反向 Proxy服務,因為用戶端串連反向 Proxy會消耗一定時間。另外反向 Proxy伺服器雖然效能高但是本身也是一個“單點”,對於分布式服務來說這種方式還是直連比較方便。
服務發現:
- 當我們伺服器需要增加減少的時候我們正常的流程是更新用戶端的配置來實現新伺服器的增加,但是這個方式還是很多缺點如果某台伺服器出現故障,短期內我們無法發現,發現後還是需要人工修改配置或去營運配置中心區去摘除,通過服務發現我們可以自動的摘除,增加伺服器,只要我們的控制邏輯做的很完善後期我們可以讓這個過程完全自動。
- 本架構提供了最簡單的服務發現實現方式,使用redis作為儲存,紀錄所有服務端的ip和連接埠及所在分組。
- 啟動應用伺服器並告訴他服務發現的redis列表後,伺服器會自動將當前服務的ip和連接埠及分組上報到多個redis上進行註冊,並定期重新整理其逾時時間。如果有個別節點在超過逾時時間仍舊沒有再上報那麼自動摘除。
- 用戶端會定期從多個redis擷取到最新的配置,並且更新本地設定檔內容。
後期支援:
下一步將會支援分布式日誌,配置同步等
最後Dora-RPC是一個很開放的開源,本意是給Swoole社區使用者作為參考做出優秀的RPC及微服務。
與此同時也希望各位踴躍參與此項目開發,任何有效參與人都會紀錄在wiki內。
項目地址:https://github.com/xcl3721/Dora-RPC
最近活動:http://www.huodongxing.com/event/5337738177600 分享SOA實戰經曆,免費門票