RServe源代碼解析(下)
本文通過對Rserve的設計初衷、運行機制、核心對象和方法進行粗淺探討,為利用Rserve做深度產品開發的開發者提供初始幫助。中篇介紹了伺服器端部分函數/方法邏輯,今天我們繼續介紹。
R
3 伺服器端主要函數/方法邏輯
3.5 Rserve_QAP1_connected()函數
Rserve_QAP1_connected()函數邏輯主線如下所示,1)Rserve_prepare_child為新連接創建新的進程,2)為新進程創建新的工作目錄,3)循環處理請求中的命令(command),將結果通過sendResp返回給客戶端(sendResp是一個宏定義,對應每個伺服器的sendResp指針函數)。
以CMD_eval、CMD_voidEval、CMD_detachedVoidEval為例,Command的處理過程包括1)CMD參數解碼,主要通過QAP_decode函數,2)表達式的R解析,調用R_tryEval等函數。
setup_workdir()為每個連接創建一個工作目錄(Unix下):在系統配置的workdir下,創建一個名為conn+進程ID(通過getpid()獲得)的子目錄。
函數Rserve_prepare_child調用RS_fork()為新連接生成新的進程。
Rserve用了大量的函數指針,很多封裝關係在靜態代碼分析工具圖中沒有體現出來,這也增加了源代碼閱讀的難度。
在上節standalone.c中,我們看到htttp服務創建後,有一條賦值fork函數的命令
看到RS_fork()就能明白其作用,RS_fork是fork_http、fork_https、fork_ws的封裝,為不同服務埠的連接生成新進程。
3.6 websokcets.c代碼
create_WS_server()邏輯比較直接,指定了服務各種消息的處理指針函數
WS_connected()函數的處理邏輯如下,1)Rserve_prepare_child生成新進程,2)與客戶端通訊握手(handshake),3)調用RSserv.c的Rserve_QAP1_connected()函數或 Rserve_text_connected()函數處理請求。
3.7 http.c代碼
create_HTTP_server()邏輯與websockets.c邏輯類似。但在新的連接請求處理時候,因為R本身提供了處理http請求的能力,所以HTTP_connected函數(更確切的說是process_request函數)主要利用了R內置函數httpd(url, query, body, headers)。
3.8 數據結構
結構體
作用
源文件
args
request/response信息傳遞對象
http.c
buffer
雙向鏈表
http.c
header_info
socket頭信息
websockets.c
iohdr_t
cmd和len信息
rsio.c
MD5Context
MD5使用
md5.h
phdr
QAP1消息的Header part
Rsrv.h、/proxy/qap.h
rs_eval
表達式的上下文和traceback信息
utils.c
rsio
讀寫狀態
rsio.c
rsmsg_t
父子進程間的通信內容
rsio.h
server
服務的基礎信息和各種回調函數
RSserver.h
server_stack
server的雙向鏈表
RSserver.c、/proxy/server.c
SHA1Context
SHA的上下文
sha1.c
sSession
session信息
session.h
R
4 客戶端
RServe提供了Java、C++、PHP等3個語言客戶端。
客戶端
文件
描述
Java client
src/client/java
對R的主要類型提供了封裝
C++ client
src/client/cxx
基本功能
PHP client
src/client/php
非常簡單的例子
Java客戶端相對豐富,在數據類型上支持String、Integer、Double、Logical、Language、Expression、Raw、Complex、Reference、Factor的Vector和List,但還沒有對dataframe等對象進行包裝,開源社區也有不少在此之上的補充(如Rsession、J2R)。
R
5 總結
RServe作為一個基於TCP/IP的R服務,為應用開發利用R的能力提供很大便利。為更放心的利用RServe的能力,本文簡敘RServe的基本處理邏輯,分析了其核心源代碼,期望能起到拋磚引玉的作用,更多熟悉操作系統的同事不斷提升其穩定性和計算性能。
作者:田春華
田春華博士,崑崙數據首席數據科學家,2004年1月清華大學自動化系博士畢業。2004年-2015年在IBM中國研究院,負責數據挖掘演算法研究和產品工作,在高端裝備、產品運維服務、新能源運營優化等多領域,幫助中國、亞太、歐美領先企業,成功實施資產管理、運營優化、營銷洞察等各類數據分析項目,為客戶創造上億美元收益。發表學術論文(長文)82篇(其中第一作者42篇),擁有36項專利申請(10項已授權)。研究興趣:數據挖掘演算法與應用。
參考文獻
1. 張丹. R的極客理想:工具篇,2014,機械工業出版社
2. Simon Urbanek. A Fast Way to Provide R Functionality to Applications, Proceedings of the 3rd International Workshop on Distributed Statistical Computing (DSC 2003), March 20–22, Vienna, Austria
Simon Urbanek
2. https://cran.r-project.org/doc/manuals/R-ints.html
3. https://cran.r-project.org/doc/manuals/R-exts.html
4. Elliotte Rusty Harold,Java網路編程, O Reilly Media Inc.、中國電力出版社, 2013.
5. W.Richard Stevens,Bill Fenner,Andrew M. Rudoff. UNIX網路編程 卷1 套接字聯網API(第3版),北京郵電出版社
6. http://www.rforge.net/Rserve/doc.html
7. http://www.rforge.net/Rserve/dev.html
TAG:崑崙數據K2Data |
※RequireJS框架源代碼解析
※Drill-on-YARN之源碼解析
※Google的開源Consent解決方案解析APUS研究院
※AtomicInteger 源碼解析
※Marvell第二代ARM處理器ThunderX2解析:不遜Intel至強
※導演 Sing J. Lee 解析 Migos 新歌《Stir Fry》 MV 拍攝靈感
※Service Mesh 及其主流開源實現解析
※Android項目解耦-路由框架ARouter源碼解析
※精讀解析 《When Sophie Gets Angry》
※解析.DS_Store文件格式
※android 訪問webservice(解析一行代碼實現)
※Spring源碼解析——Spring思想、設計模式總結
※Siemens MPI協議解析
※Istio技術與實踐02:源碼解析之Istio on Kubernetes 統一服務發現
※《Fighting EX Layer》PC版將支持4K解析度
※FutureTask 在線程池中應用和源碼解析
※網關 Spring-Cloud-Gateway 源碼解析——路由之RouteDefinitionLocator一覽
※視覺中國官網vcg.com域名狀態變為clientHold(暫停解析)
※Word2v的ec 原理解析!
※Moto E5 Play Android Go手機發布:真上古解析度