實(shí)驗(yàn)服務(wù)器架構(gòu)圖

??補(bǔ)充一張實(shí)驗(yàn)服務(wù)器的架構(gòu)圖面哼,說明一下集成的各軟件平臺之間的關(guān)系與連接歌殃。
??一般情況下,在紅色的調(diào)用線路上辞嗡,Shiny APP與R函數(shù)調(diào)用集成已經(jīng)可以解決大部分的需求豁护。如果有些業(yè)務(wù)分析模塊是用Python寫的,又不需要作圖輸出或與用戶界面交互欲间,那么走藍(lán)色線路直接調(diào)用Python函數(shù),效率要高一點(diǎn)断部。還有就是使用習(xí)慣的問題猎贴,對于習(xí)慣了用Python的人,新技能都有學(xué)習(xí)曲線蝴光,為什么不能提供Python的完整集成呢她渴?Python的作圖能力也不錯(cuò),習(xí)慣Python的人也可以用它作圖蔑祟。所以作為一個(gè)解決方案趁耗,要提供各種可能的選項(xiàng),這樣才全面和完整疆虚。


開源多層分布式B/S結(jié)構(gòu)數(shù)據(jù)分析系統(tǒng)解決方案

一苛败、架構(gòu)圖說明
??這張圖上有4層軟件結(jié)構(gòu),藍(lán)色的是服務(wù)器平臺径簿,綠色的是運(yùn)行的程序罢屈,紅色的是開發(fā)工具。紅色連線是貫通各層的任脈篇亭,R語言的一支缠捌;藍(lán)色連線是督脈,Python語言的一支译蒂,紫紅色是它們共同的部分曼月。
??表示層是瀏覽器平臺,網(wǎng)頁中運(yùn)行的是HTML柔昼、CSS哑芹、JavaScript 3種語言,它們都操作網(wǎng)頁在瀏覽器內(nèi)部的表示形式岳锁,文檔對象模型DOM绩衷。這是人機(jī)交互的UI界面蹦魔。
??應(yīng)用層運(yùn)行的是Java EE服務(wù)器平臺,跑的是Java語言的WEB APP咳燕,它實(shí)現(xiàn)的是業(yè)務(wù)流程勿决。使用的開發(fā)工具是Eclipse/IntelliJ IDEA。
??中間層是R語言與Python語言深度數(shù)據(jù)分析平臺招盲,它實(shí)現(xiàn)的是業(yè)務(wù)數(shù)據(jù)分析功能模塊低缩,比如前面文章例子中生成業(yè)務(wù)分析報(bào)告等。
??R語言平臺使用的開發(fā)工具是Rstudio/Rstudio Linux Server曹货,它產(chǎn)生可運(yùn)行的Shiny APP或 R Script咆繁,它們都可以通過Reticulate包調(diào)用Python Script。然后通過Shiny Server對外提供APP調(diào)用顶籽,通過Rserve對外提供R語言函數(shù)調(diào)用玩般。
??Python語言平臺使用的開發(fā)工具是JupyterHub/Lab,它產(chǎn)生Jupyter Notebook運(yùn)行文件(.ipynb)礼饱,調(diào)試好后再拷貝成Python Script(.py)坏为,所以在它們之間畫了條綠色的連線。也可以用客戶端的Spyder在PC端開發(fā)調(diào)試一些比較復(fù)雜的Python程序镊绪,它的Debugger比JupyterLab要好用一點(diǎn)匀伏。然后用gRPCPyro5等對外提供遠(yuǎn)過程調(diào)用。Python平臺有多種支持分布式計(jì)算的遠(yuǎn)過程調(diào)用軟件包蝴韭,這兩個(gè)支持Java客戶端够颠,后面再探討一下,目前實(shí)驗(yàn)服務(wù)器上還沒有開發(fā)好這個(gè)分支的調(diào)用實(shí)例榄鉴,其它所有路徑都開發(fā)好了履磨。
??數(shù)據(jù)層這里為了畫圖清晰好看,把對各種數(shù)據(jù)源的訪問都?xì)w集到一個(gè)Data節(jié)點(diǎn)上牢硅,實(shí)際上是沒有的蹬耘,Java、R减余、Python程序要訪問什么數(shù)據(jù)源综苔,直接通過接口驅(qū)動程序連就是了。數(shù)據(jù)層提供初步整理好的數(shù)據(jù)供中間層分析位岔。單個(gè)R或Python進(jìn)程都沒有處理大數(shù)據(jù)的能力如筛,對大數(shù)據(jù)的初步處理還是依賴數(shù)據(jù)層,比如云數(shù)據(jù)庫抒抬,Oracle等大型關(guān)系數(shù)據(jù)庫杨刨,提煉成小一些的數(shù)據(jù)集(比如數(shù)千萬行),或通過SQL等選取一個(gè)較小的子集來分析擦剑。這一層增加了SQL與Cypher語言妖胀。
??這樣這個(gè)開源解決方案就集成了5種平臺8種語言了芥颈。當(dāng)然每種平臺都會有很多各有特色的產(chǎn)品,比如數(shù)據(jù)層的云平臺赚抡、關(guān)系數(shù)據(jù)庫爬坑、圖數(shù)據(jù)庫、GIS平臺涂臣,市場上都有多種主流的產(chǎn)品盾计,而它們的具體實(shí)現(xiàn),通常會包含C/C++赁遗、Fortran等更多語言實(shí)現(xiàn)的算法模塊或插件署辉,比如R語言里大部分的包都是C/C++寫的。
??在應(yīng)用層與中間層之間岩四,部署了一個(gè)Nginx HTTP服務(wù)器哭尝,反向代理Rstudio Linux Server與Shiny Server,因?yàn)樗鼈兊拈_源免費(fèi)版都不支持SSL加密連接剖煌,而開發(fā)刚夺、測試與生產(chǎn)環(huán)境如果部署到公網(wǎng)上,SSL是必須的末捣。

二、用Graphviz生成上述架構(gòu)圖

??使用Graphviz前创橄,要先安裝它的可執(zhí)行文件箩做,具體請參閱各操作系統(tǒng)平臺的安裝指南
??可以在Rstudio上直接編輯文本文件mysolution.gv妥畏,Graphviz的 dot格式繪圖文件都以.gv為后綴邦邦。具體語法可參閱Graphviz的文檔

graph ER {
    label = "開源多層分布式B/S結(jié)構(gòu)數(shù)據(jù)分析系統(tǒng)解決方案";
    labelloc  =  t; // t: Place the graph's title on top.
    fontsize  = 30; // Make title stand out by giving a large font size
    fontcolor = black;
    layout=dot;
           
    subgraph cluster_browser {
        label="表示層  瀏覽器";
        fontsize  = 24;
        style=filled;
        fillcolor=gray90;
        subgraph cluster_page{
            label="網(wǎng)頁";
            style=filled;
            fillcolor=aliceblue;            
            node [shape=parallelogram, style=filled, fillcolor=yellowgreen];  JavaScript; HTML; CSS;
            node [shape=oval, style=filled, fillcolor=gold]; DOM模型;
        }
    }
    
    JavaScript -- DOM模型;
    HTML -- DOM模型;
    CSS -- DOM模型;
    
    subgraph cluster_Java {  
        label="應(yīng)用層  Java";
        fontsize  = 24;        
        style=filled;
        fillcolor=gray90;        
        node [shape=rectangle, style=filled, fillcolor=lightpink]; "Eclipse/IntelliJ IDEA";
        subgraph cluster_Java{
            label="Java EE Server";
            style=filled;
            fillcolor=aliceblue;            
            node [shape=rectangle, style=filled, fillcolor=lightblue]; Tomcat;
            node [shape=component, style=filled, fillcolor=yellowgreen]; "Java EE WEB APP";
        }
    }
    
    DOM模型 -- Tomcat[label="HTTPS", color=purple, penwidth=5];
    "Eclipse/IntelliJ IDEA" -- Tomcat;
    Tomcat -- "Java EE WEB APP"[color=purple, penwidth=5];
    
    node [shape=rectangle, style=filled, fillcolor=lightblue]; Nginx;
    subgraph cluster_R {
        label="中間層 R";
        fontsize  = 24;
        style=filled;
        fillcolor=gray90;        
        node [shape=rectangle, style=filled, fillcolor=lightblue]; "R Serve"; "Shiny Server";
        node [shape=parallelogram, style=filled, fillcolor=yellowgreen];  "R Script"; "Shiny APP";
        node [shape=rectangle, style=filled, fillcolor=lightpink]; "Rstudio Linux Server";
    }
   
    "Java EE WEB APP" -- Nginx[label="HTTPS",color=red, penwidth=5];
    DOM模型 --  Nginx[label="HTTPS"];    
    Nginx -- "Rstudio Linux Server";
    Nginx -- "Shiny Server"[color=red, penwidth=5];
    "R Serve" -- "R Script"[color=red, penwidth=5];
    "Shiny Server" -- "Shiny APP"[color=red, penwidth=5];
    "Java EE WEB APP" -- "R Serve"[label="SSL", color=red, penwidth=5];

    
    "Rstudio Linux Server" -- "R Script";
    "Rstudio Linux Server" -- "Shiny APP";
     
    subgraph cluster_Python { 
        label="中間層 Python";
        fontsize  = 24;
        style=filled;
        fillcolor=gray90;        
        node [shape=rectangle, style=filled, fillcolor=lightblue]; "gRPC/Pyro"; 
        node [shape=rectangle, style=filled, fillcolor=lightpink];  Spyder; "JUpyter Hub & Lab";       
        node [shape=parallelogram, style=filled, fillcolor=yellowgreen];  "Python Script"; "Jupyter Notebook";
    }
 
    "Java EE WEB APP" -- "gRPC/Pyro"[label="SSL", color=blue, penwidth=5];
    "gRPC/Pyro" --  "Python Script"[color=blue, penwidth=5];
    Spyder -- "Python Script";
    "Jupyter Notebook" -- "Python Script"[color=darkgreen, penwidth=5];
    "JUpyter Hub & Lab" --  "Jupyter Notebook";
    DOM模型 -- "JUpyter Hub & Lab"[label="HTTPS"];
    
    subgraph cluster_Data {
        label="數(shù)據(jù)層";
        fontsize  = 24;        
        style=filled;
        fillcolor=gray90;        
        node [shape=rectangle]; "Data";
        node [shape=box3d]; "Cloud Database"; "Data Warehouse"; "Relational Database"; "Graph Database";"GIS Data"; "Text Data"
    }
    
    "R Script" -- "Data"[color=red, penwidth=5];
    "Shiny APP" -- "Data"[color=red, penwidth=5];
    "Python Script" -- "Data"[color=purple, penwidth=5];
    "Jupyter Notebook" -- "Data";
    "Java EE WEB APP" -- "Data";
    "R Script" -- "Python Script"[label="Reticulate", color=red, penwidth=5];
    "Shiny APP" -- "Python Script"[label="Reticulate",color=red, penwidth=5];
  
    
    "Data" -- "Cloud Database"[label="SQL"];
    "Data" -- "Data Warehouse"[label="SQL"];
    "Data" -- "Relational Database"[label="SQL"];
    "Data" -- "Graph Database"[label="Cypher"];
    "Data" -- "GIS Data";
    "Data" -- "Text Data";

}

三醉蚁、Rstudio中渲染架構(gòu)圖
??需要先安裝DiagrammeR包燃辖,然后Rstudio菜單上直接就有Preview按鈕可以瀏覽Graphviz圖,它實(shí)際上執(zhí)行的是下面的命令:

>install.packages("DiagrammeR")
>DiagrammeR::grViz("images/mysolution.gv")

四网棍、Python中渲染架構(gòu)圖

??Python上同樣要先安裝graphviz包黔龟,然后執(zhí)行下面的程序輸出成SVG或在開發(fā)環(huán)境中顯示,輸出成SVG的話要在瀏覽器中另行打開滥玷,這里直接在開發(fā)環(huán)境中顯示氏身。

# pip install graphviz 
from graphviz import Source

with open("/home/jean/images/mysolution.gv","r", encoding ='utf-8') as f:
    dot_graph = f.read()
    # 輸出成SVG格式, layout: engine="dot", 還有 neato, fdp, sfdp,twopi,circo
gv = Source(dot_graph, engine="dot")
# gv.render(filename="MySolution", directory="/home/jean/images", format="svg")
gv

五、關(guān)于分布式方案的探討

??分布式方案的最大優(yōu)點(diǎn)是便于與存量的WEB應(yīng)用系統(tǒng)集成惑畴,只要在新的服務(wù)器上部署中間層的Python與R部分即可蛋欣,這樣可以有效的盤活存量的軟硬件與數(shù)據(jù)資產(chǎn),性價(jià)比很高如贷。稅務(wù)系統(tǒng)大部分的業(yè)務(wù)應(yīng)用系統(tǒng)都是運(yùn)行在瀏覽器上的B/S結(jié)構(gòu)Java EE平臺WEB應(yīng)用系統(tǒng)陷虎,都有數(shù)據(jù)層與中間件層到踏,是否如本方案一樣區(qū)分應(yīng)用層與中間層,對于本方案新增加的R與Python深度數(shù)據(jù)分析中間層尚猿,并無影響窝稿。所以B/S與分層是與業(yè)務(wù)應(yīng)用系統(tǒng)高度同構(gòu)的,便于開發(fā)與集成谊路。
??新部署的R與Python部分運(yùn)行在自己的服務(wù)器中讹躯,自然與Java EE平臺的原業(yè)務(wù)系統(tǒng)分開計(jì)算,這就是分布式計(jì)算缠劝。本方案對R語言平臺的集成有兩種模式潮梯,Tomcat WEB APP嵌入Shiny APP方式的集成在瀏覽器端,由頁面窗口之間的JavaScript通訊實(shí)現(xiàn)業(yè)務(wù)流程與數(shù)據(jù)的連接惨恭,嚴(yán)格來說并不算分布式計(jì)算秉馏,只是調(diào)用不同服務(wù)器上的資源而已,關(guān)鍵是這些資源能夠協(xié)調(diào)配合完成既定的任務(wù)脱羡。由Tomcat WEB APP通過Rserve調(diào)用R語言函數(shù)萝究,則是一種松耦合的分布式計(jì)算,因?yàn)樗募稍诜?wù)器端锉罐。Java程序通過網(wǎng)絡(luò)協(xié)議直接調(diào)用R服務(wù)器上的程序帆竹,并等待它的返回。松耦合是因?yàn)樗且环NC/S模式脓规,而不是傳統(tǒng)分布式組件CORBA栽连、Java RMI、DCOM的本地代理模式侨舆。上面這些是二十年前秒紧,十年前還比較流行的分布式計(jì)算技術(shù),后來Web Service興起挨下,提供了XMLHTTP協(xié)議上的C/S式調(diào)用熔恢,即類似于調(diào)用Rserve那樣的松耦合分布式計(jì)算。近年則是Web Service在HTTP協(xié)議上的進(jìn)一步發(fā)展臭笆,衍生的REST API成為了主流叙淌,如各大云平臺的REST API,都是松耦合的分布式計(jì)算愁铺,通過方便的API來調(diào)用云端強(qiáng)大的大數(shù)據(jù)算力凿菩。用Rserve是有什么用什么,并且它的歷史很長帜讲,經(jīng)過了充分的驗(yàn)證衅谷,也很穩(wěn)定可靠,能完成任務(wù)就好似将。
??Python中間層的調(diào)用方案還沒有寫好實(shí)例获黔,只是初步了解一下可用的方案蚀苛。它并沒有Rserve那樣的松耦合軟件包可用,相反提供了類似Java RMI那樣緊耦合的幾種方案(軟件包)玷氏。gRPC是Google開源并在內(nèi)部廣泛使用的通用RPC(遠(yuǎn)過程調(diào)用)框架堵未,客戶端與服務(wù)端都支持多種語言,包括Pyhton與Java盏触。Thrift是Facebook開源的通用RPC 框架渗蟹,與gRPC一樣客戶端與服務(wù)端都支持Python與Java,Thriftpy是它另一個(gè)比較流行的Python封裝赞辩。Pyro5是一個(gè)歷史較長的開源項(xiàng)目雌芽,比較有名,已經(jīng)發(fā)展到版本5了辨嗽,它也是客戶端與服務(wù)端都支持Python與Java世落。RpyC是另一個(gè)比較流行的純Python RPC框架先馆,它只支持Python害幅。這篇文章比較了上面的幾種RPC框架度宦,這篇文章則介紹了Python平臺上可用于分布式計(jì)算的更多框架偶芍。
??Python平臺上大概也是有什么用什么,要求是客戶端Java服務(wù)端Python谅辣,看哪個(gè)更方便和更符合應(yīng)用場景的需求吧凄吏。有成熟的方案铸敏,實(shí)現(xiàn)的難度應(yīng)該不大杈帐。
??最后說明一下髓堪,這里說的分布式計(jì)算,還沒有涉及到并行計(jì)算娘荡,這已經(jīng)超出了本篇的范圍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驶沼,一起剝皮案震驚了整個(gè)濱河市炮沐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌回怜,老刑警劉巖大年,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玉雾,居然都是意外死亡翔试,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門复旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垦缅,“玉大人,你說我怎么就攤上這事驹碍”谙眩” “怎么了凡恍?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怔球。 經(jīng)常有香客問我嚼酝,道長,這世上最難降的妖魔是什么竟坛? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任闽巩,我火速辦了婚禮,結(jié)果婚禮上担汤,老公的妹妹穿的比我還像新娘涎跨。我一直安慰自己,他們只是感情好漫试,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布六敬。 她就那樣靜靜地躺著,像睡著了一般驾荣。 火紅的嫁衣襯著肌膚如雪外构。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天播掷,我揣著相機(jī)與錄音审编,去河邊找鬼。 笑死歧匈,一個(gè)胖子當(dāng)著我的面吹牛垒酬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播件炉,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼勘究,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斟冕?” 一聲冷哼從身側(cè)響起口糕,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磕蛇,沒想到半個(gè)月后景描,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秀撇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年超棺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呵燕。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棠绘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弄唧,我是刑警寧澤适肠,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站候引,受9級特大地震影響侯养,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澄干,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一逛揩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麸俘,春花似錦辩稽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拜效,卻和暖如春喷众,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紧憾。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工到千, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赴穗。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓憔四,卻偏偏與公主長得像,于是被迫代替她去往敵國和親般眉。 傳聞我的和親對象是個(gè)殘疾皇子了赵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容