張 漫 劉 俊 趙 婭
(東北石油大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院, 黑龍江 大慶 163318)
隨著虛擬現(xiàn)實(shí)技術(shù)、三維仿真技術(shù)以及計(jì)算機(jī)圖形學(xué)的不斷發(fā)展,仿真訓(xùn)練系統(tǒng)也在向多用戶、多終端、三維訓(xùn)練和在線訓(xùn)練的方式發(fā)展,使訓(xùn)練系統(tǒng)轉(zhuǎn)變?yōu)榭蛻舳?服務(wù)端結(jié)構(gòu)。在客戶端-服務(wù)端結(jié)構(gòu)下,服務(wù)端和客戶端之間需要通過(guò)協(xié)議進(jìn)行數(shù)據(jù)通信,即用戶在客戶端進(jìn)行訓(xùn)練操作,客戶端對(duì)接收到的信息進(jìn)行處理、壓縮后轉(zhuǎn)發(fā)給服務(wù)器,服務(wù)器處理后再將結(jié)果反饋給客戶端。目前,這種結(jié)構(gòu)主要用于網(wǎng)絡(luò)游戲開發(fā)。
根據(jù)服務(wù)器和客戶端之間的數(shù)據(jù)通信方式來(lái)劃分,常見(jiàn)的網(wǎng)絡(luò)游戲可分為點(diǎn)對(duì)點(diǎn)客戶端和服務(wù)器模式、基于分組的網(wǎng)絡(luò)模式和純CS結(jié)構(gòu)網(wǎng)絡(luò)模式[1]。
點(diǎn)對(duì)點(diǎn)客戶端和服務(wù)器模式支持局域網(wǎng)操作,將一臺(tái)計(jì)算機(jī)作為主機(jī)服務(wù)器,其他計(jì)算機(jī)作為客戶端與之連接。其核心邏輯算法是在每個(gè)客戶端獨(dú)立運(yùn)行,不依賴服務(wù)器處理。
基于大廳的在線游戲,最早出現(xiàn)在聊天系統(tǒng)中。大廳模塊服務(wù)于一個(gè)處理獨(dú)立事務(wù)的服務(wù)器,其功能主要是匹配來(lái)自不同地區(qū)和網(wǎng)段的客戶端用戶,使這些用戶能夠處于同一個(gè)世界中,在同一個(gè)世界中操作。在這種網(wǎng)絡(luò)模式下,數(shù)據(jù)庫(kù)通常需要對(duì)用戶的操作進(jìn)行評(píng)分并分別進(jìn)行存儲(chǔ),以便保存他們的分?jǐn)?shù);服務(wù)器通常不負(fù)責(zé)核心結(jié)構(gòu)運(yùn)算處理,它更像是一個(gè)輔助工具,與游戲系統(tǒng)分割開來(lái),只為用戶提供一個(gè)可供選擇的服務(wù)器房間。每個(gè)客戶端彼此平等,整體性能和速度大致相等,既是客戶端又是服務(wù)器。
在網(wǎng)絡(luò)游戲服務(wù)端架構(gòu)的基礎(chǔ)上,我們?cè)O(shè)計(jì)了適用于三維虛擬仿真訓(xùn)練系統(tǒng)的服務(wù)端系統(tǒng),可以增強(qiáng)仿真訓(xùn)練系統(tǒng)的性能。
為了更好地適應(yīng)用戶需求,堅(jiān)持以下設(shè)計(jì)原則:
(1) 系統(tǒng)嚴(yán)格分為服務(wù)端和客戶端,兩者的開發(fā)是相互分離、同時(shí)進(jìn)行。用戶能夠接觸的只有客戶端,服務(wù)端的維護(hù)由系統(tǒng)開發(fā)者負(fù)責(zé)。
(2) 服務(wù)端負(fù)責(zé)系統(tǒng)的核心邏輯操作和信息處理,包括用戶賬戶信息、角色信息、成績(jī)信息以及匹配機(jī)制等??蛻舳酥回?fù)責(zé)向用戶呈現(xiàn)界面及場(chǎng)景內(nèi)容等不關(guān)鍵的邏輯,并能夠隨時(shí)保持與服務(wù)器的連接。
(3) 系統(tǒng)整體上要具備良好的運(yùn)行效率與擴(kuò)展性,服務(wù)端應(yīng)實(shí)時(shí)處理客戶端對(duì)于賬號(hào)數(shù)據(jù)的靜態(tài)全局性請(qǐng)求和動(dòng)態(tài)非全局性請(qǐng)求。
仿真訓(xùn)練服務(wù)器由PHP服務(wù)器和C++服務(wù)器組成。鑒于三維模擬在線訓(xùn)練對(duì)系統(tǒng)性能有嚴(yán)格的要求,使用C++服務(wù)器來(lái)處理實(shí)際訓(xùn)練場(chǎng)景中的運(yùn)算邏輯和關(guān)鍵數(shù)據(jù)信息,使用PHP服務(wù)器(登錄服務(wù)器)來(lái)處理注冊(cè)和登錄等功能需求。服務(wù)端采用epoll機(jī)制來(lái)處理來(lái)自客戶端的連接,以提高查詢和處理客戶端連接的效率。
服務(wù)端設(shè)計(jì)架構(gòu)如圖1所示。負(fù)載層,在CDN服務(wù)器和Ngnix服務(wù)器的配合下實(shí)現(xiàn)負(fù)載均衡,提升網(wǎng)絡(luò)數(shù)據(jù)處理能力。應(yīng)用層,主要實(shí)現(xiàn)數(shù)據(jù)編碼與解碼、數(shù)據(jù)同步傳輸、數(shù)據(jù)壓縮與解壓等功能。中心服務(wù)器負(fù)責(zé)監(jiān)聽來(lái)自客戶端或者系統(tǒng)服務(wù)端發(fā)送的協(xié)議、數(shù)據(jù)流和信息流,然后執(zhí)行相關(guān)處理。為了充分利用服務(wù)端資源,并保障內(nèi)部核心數(shù)據(jù)的安全,將整體的服務(wù)分為多個(gè)層次,包括登錄服務(wù)器、網(wǎng)關(guān)服務(wù)器、日志服務(wù)器、中心(大廳)服務(wù)器和仿真服務(wù)器等。登錄服務(wù)器為整個(gè)服務(wù)體系的入口服務(wù)器,負(fù)責(zé)整個(gè)系統(tǒng)中用戶賬戶的管理工作。網(wǎng)關(guān)服務(wù)器承擔(dān)服務(wù)器信息的中轉(zhuǎn)和檢測(cè)工作。中心服務(wù)器為整個(gè)仿真功能的控制中心,在用戶進(jìn)入系統(tǒng)的仿真訓(xùn)練大廳時(shí),提供對(duì)應(yīng)的訓(xùn)練隊(duì)伍通信、仿真任務(wù)查詢,并控制相關(guān)仿真環(huán)境的編輯及訓(xùn)練服務(wù)的提供。日志服務(wù)器負(fù)責(zé)后臺(tái)的統(tǒng)計(jì)服務(wù),主要存儲(chǔ)培訓(xùn)的總次數(shù)、合格次數(shù)和訓(xùn)練成績(jī)等。仿真服務(wù)器提供訓(xùn)練環(huán)境、任務(wù)環(huán)境、仿真體、訓(xùn)練任務(wù)和訓(xùn)練信息的演算功能。
服務(wù)器系統(tǒng)通過(guò)部署多個(gè)節(jié)點(diǎn)實(shí)現(xiàn)集群化,然后通過(guò)自動(dòng)故障轉(zhuǎn)移和自動(dòng)切換流量而保證系統(tǒng)的高可用性。使用反向代理集群,解決客戶端到反向代理層的高可用問(wèn)題。通過(guò)主從同步的緩存,解決服務(wù)層到緩存層的高可用問(wèn)題。最后在數(shù)據(jù)庫(kù)層采用“主從同步,讀寫分離”架構(gòu),實(shí)現(xiàn)服務(wù)層到數(shù)據(jù)層的高可用問(wèn)題。設(shè)計(jì)過(guò)程中,將所有資源池化,實(shí)現(xiàn)資源的高可用性。通過(guò)軟件定義存儲(chǔ),將所有硬盤統(tǒng)一建立存儲(chǔ)池,實(shí)現(xiàn)文件的分布式存儲(chǔ)。即使有某一節(jié)點(diǎn)損壞了,也不影響數(shù)據(jù)的完整性。另外使用軟件定義資源,支持高擴(kuò)展,可以任意增加或替換現(xiàn)有資源。各服務(wù)器節(jié)點(diǎn)之間采用消息隊(duì)列進(jìn)行通信,不需要專用連接。
圖1 服務(wù)端架構(gòu)
把整體的服務(wù)劃分之后,緩解了服務(wù)器的邏輯處理能力和負(fù)載,但頻繁的場(chǎng)景切換仍容易擾亂中間連接狀態(tài),使培訓(xùn)系統(tǒng)的管理和維護(hù)變得艱難,并產(chǎn)生不必要的開銷。因此,單獨(dú)劃分出一個(gè)網(wǎng)關(guān)服務(wù)器[3]。一些公用的處理邏輯包括系統(tǒng)的登錄、排行榜查詢等模塊,在網(wǎng)關(guān)服務(wù)器內(nèi)部進(jìn)行預(yù)處理,然后將信息轉(zhuǎn)發(fā)。對(duì)于其他特殊邏輯則直接進(jìn)行轉(zhuǎn)發(fā)[4],移交給對(duì)應(yīng)的服務(wù)器進(jìn)行處理。服務(wù)端系統(tǒng)模塊架構(gòu)如圖2所示。
這種劃分方法可減少系統(tǒng)服務(wù)器的訪問(wèn)壓力,但多臺(tái)服務(wù)器可同時(shí)訪問(wèn)數(shù)據(jù)庫(kù),則會(huì)增加數(shù)據(jù)庫(kù)的壓力。因此,在服務(wù)端使用前端代理來(lái)進(jìn)行緩存處理。服務(wù)器不直接訪問(wèn)數(shù)據(jù)庫(kù),而是去訪問(wèn)代理服務(wù)器,最后由代理服務(wù)器訪問(wèn)底層數(shù)據(jù)庫(kù)。
系統(tǒng)中的PHP模塊需要滿足大流量且穩(wěn)定運(yùn)行的情況,因此使用了Ngnix反向代理技術(shù)來(lái)實(shí)現(xiàn)負(fù)載均衡。為了避免因信息不同步而導(dǎo)致重復(fù)登錄問(wèn)題,系統(tǒng)將所有會(huì)話信息放入Redis緩存之中,Ngnix分配的任何節(jié)點(diǎn)都可以從Redis獲取用戶信息,從而實(shí)現(xiàn)會(huì)話共享[5]。
圖2 服務(wù)端系統(tǒng)模塊架構(gòu)
1.3.1 登錄服務(wù)器
登錄服務(wù)器是用來(lái)管理用戶登錄的邏輯功能服務(wù)器,它兼負(fù)對(duì)用戶數(shù)據(jù)和服務(wù)之間的校驗(yàn)功能,完成從用戶客戶端到服務(wù)器、Redis緩存、數(shù)據(jù)庫(kù)之間的信息交互,為用戶進(jìn)入系統(tǒng)中的網(wǎng)關(guān)服務(wù)器發(fā)送Token。登錄服務(wù)器的模塊架構(gòu)如圖3所示。其中,網(wǎng)絡(luò)通信組件模塊為各大服務(wù)提供網(wǎng)絡(luò)通信功能;Protobuf模塊提供對(duì)應(yīng)的數(shù)據(jù)讀取及網(wǎng)絡(luò)協(xié)議的序列化和反序列化功能;數(shù)據(jù)庫(kù)交互模塊提供MySQL數(shù)據(jù)庫(kù)的連接、存儲(chǔ)、查詢和讀取等功能;通信和邏輯處理模塊負(fù)責(zé)仿真訓(xùn)練邏輯的處理及通信。
圖3 登錄服務(wù)器模塊架構(gòu)
在用戶端發(fā)起登錄請(qǐng)求后,服務(wù)器端根據(jù)加載的數(shù)據(jù)驗(yàn)證客戶端的Token,網(wǎng)關(guān)服務(wù)器返回登錄連接信息。客戶端收到鑒權(quán)信息、完成登錄以后,再向網(wǎng)關(guān)服務(wù)器發(fā)起連接和鑒權(quán)信息。具體的時(shí)序流程如圖4所示。
圖4 登錄時(shí)序
1.3.2 網(wǎng)關(guān)服務(wù)器
網(wǎng)關(guān)服務(wù)器模塊主要負(fù)責(zé)信息和用戶身份的鑒權(quán),并在各個(gè)服務(wù)之間轉(zhuǎn)發(fā)數(shù)據(jù)信息。它的主要功能包括:監(jiān)聽來(lái)自客戶端的各種消息;與客戶端進(jìn)行連接,建立和客戶端之間的會(huì)話層,接收客戶端和Post服務(wù)器到客戶端之間的消息;與部分服務(wù)器建立起會(huì)話層的相關(guān)連接,轉(zhuǎn)發(fā)服務(wù)器之間的數(shù)據(jù)消息;作為各個(gè)服務(wù)器數(shù)據(jù)信息的中轉(zhuǎn)機(jī)構(gòu),對(duì)信息進(jìn)行鑒權(quán)驗(yàn)證并去除不合法的信息。其模塊架構(gòu)如圖5所示,其中的網(wǎng)絡(luò)通信組件模塊和Protobuf模塊與登錄服務(wù)器的設(shè)計(jì)相同,但網(wǎng)關(guān)服務(wù)器不需要與數(shù)據(jù)庫(kù)進(jìn)行交互;網(wǎng)絡(luò)邏輯管理模塊負(fù)責(zé)實(shí)現(xiàn)對(duì)應(yīng)的驗(yàn)證和轉(zhuǎn)發(fā)協(xié)議,并監(jiān)聽來(lái)自各個(gè)服務(wù)器的協(xié)議通信[6]。
1.3.3 中心服務(wù)器
中心服務(wù)器主要接收來(lái)自用戶的數(shù)據(jù)信息,根據(jù)用戶的數(shù)據(jù)信息和客戶端的連接形成中心的會(huì)話交流池。在訓(xùn)練開啟中它不直接與仿真服務(wù)器進(jìn)行交互,而是通過(guò)網(wǎng)關(guān)服務(wù)器與其他服務(wù)進(jìn)行通信。其模塊架構(gòu)如圖6所示。
在仿真訓(xùn)練系統(tǒng)中,中心服務(wù)器的功能服務(wù)包括以下幾個(gè)方面:
(1) 教導(dǎo)員配置任務(wù)信息。如果使用教導(dǎo)員賬號(hào)登錄并授權(quán),會(huì)首先進(jìn)入客戶端配置頁(yè)面。配置完成以后,將相關(guān)配置信息發(fā)送給服務(wù)器,服務(wù)器根據(jù)配置信息和data信息在中心服務(wù)器內(nèi)存中生成任務(wù)。
圖5 網(wǎng)關(guān)服務(wù)器模塊架構(gòu)
圖6 中心服務(wù)器模塊架構(gòu)
(2) 用戶授權(quán)進(jìn)入任務(wù)。任務(wù)配置完成以后,在任務(wù)中心的用戶會(huì)收到授權(quán),再發(fā)送授權(quán)給中心服務(wù)器,隨即進(jìn)入任務(wù)大廳。
(3) 任務(wù)中心聊天。進(jìn)入任務(wù)大廳的所有人可以進(jìn)行實(shí)時(shí)聊天。
(4) 任務(wù)信息查詢和用戶信息查詢。在大廳里面,可以查詢當(dāng)前任務(wù)和當(dāng)前任務(wù)里所有用戶的信息,包括以往任務(wù)的歷史記錄。
(5) 教學(xué)任務(wù)視頻流。在大廳中的用戶,可以通過(guò)大廳的開放權(quán)限查看和任務(wù)相關(guān)的教學(xué)視頻,了解任務(wù)要點(diǎn)。
(6) 開辟訓(xùn)練場(chǎng)。任務(wù)大廳里的所有用戶準(zhǔn)備完畢后,中心服務(wù)器會(huì)開辟分布式服務(wù),為對(duì)應(yīng)這次任務(wù)的用戶和教員提供仿真訓(xùn)練服務(wù)。作為中心服務(wù)器,它可以同時(shí)提供多個(gè)訓(xùn)練仿真服務(wù),在不同的教室可同時(shí)進(jìn)行仿真教學(xué)。
1.3.4 仿真服務(wù)器
仿真服務(wù)器是一個(gè)獨(dú)立的邏輯服務(wù)運(yùn)算單位架構(gòu),為整個(gè)仿真體系在訓(xùn)練數(shù)據(jù)運(yùn)算、人物信息同步和訓(xùn)練AI等方面提供邏輯運(yùn)算服務(wù)。其模塊架構(gòu)如圖7所示。
圖7 仿真服務(wù)器模塊架構(gòu)
仿真服務(wù)器的主要功能如下:
(1) 仿真任務(wù)模擬計(jì)算生成。上傳人物配置數(shù)據(jù)并將信息顯示給用戶,生成對(duì)應(yīng)的訓(xùn)練數(shù)據(jù),計(jì)算仿真基礎(chǔ)數(shù)據(jù)。
(2) 仿真人員信息加入訓(xùn)練場(chǎng)景。驗(yàn)證在訓(xùn)練開啟時(shí)加入教員和用戶的仿真人物,實(shí)現(xiàn)訓(xùn)練中用戶信息的注冊(cè)和仿真人物的生成。
(3) 任務(wù)信息統(tǒng)計(jì)和訓(xùn)練計(jì)時(shí)。統(tǒng)計(jì)參與人員的得分及相關(guān)仿真訓(xùn)練任務(wù)計(jì)時(shí),將其作為評(píng)估仿真任務(wù)完成情況的依據(jù)。
(4) 任務(wù)事件處理和仿真信息統(tǒng)計(jì)演算。在對(duì)應(yīng)的仿真環(huán)境中添加心跳監(jiān)聽,接收仿真訓(xùn)練中發(fā)生的事件,統(tǒng)計(jì)用戶產(chǎn)生的事件,將其作為最終評(píng)分的依據(jù)。
(5) AI仿真輔助。在客戶端設(shè)有對(duì)應(yīng)的輔助AI,但它的行為控制不能在客戶端進(jìn)行計(jì)算。因此,針對(duì)AI的不同狀態(tài),在仿真服務(wù)器中建立對(duì)應(yīng)的AI狀態(tài)控制管理模塊,來(lái)同步AI的智能狀態(tài)情況。
(6) 工具、仿真人員、訓(xùn)練事件等信息仿真同步。同步訓(xùn)練環(huán)境中的動(dòng)態(tài)物體情況。
(7) 同步仿真中的實(shí)時(shí)聊天信息。
(8) 網(wǎng)絡(luò)連接。用戶通過(guò)連接網(wǎng)關(guān)服務(wù)器進(jìn)行協(xié)議的轉(zhuǎn)發(fā)。
后臺(tái)信息管理系統(tǒng)用于仿真訓(xùn)練的信息管理,其中包括權(quán)限管理、數(shù)據(jù)庫(kù)備份、服務(wù)器管理、文件管理。
按MVC思想將后臺(tái)信息管理系統(tǒng)進(jìn)行拆分,分為模型層(Model)、視圖層(View)和控制器層(Controller)。這種拆分的優(yōu)點(diǎn)是將模型(業(yè)務(wù)邏輯)和視圖(表示層)分離,對(duì)模型和視圖可以獨(dú)立修改,而不會(huì)相互影響。一個(gè)模型可以控制多個(gè)視圖層,并且這部分代碼可以重用,因此降低了代碼的重復(fù)性[8]??刂破鲗映洚?dāng)模型層和視圖層之間的媒介。
后臺(tái)信息管理系統(tǒng)的功能模塊,包括賬號(hào)管理、用戶管理、服務(wù)器配置、訓(xùn)練數(shù)據(jù)管理、運(yùn)營(yíng)管理、管理員和公告管理。賬號(hào)管理模塊主要用來(lái)展示賬號(hào)的基本信息和登錄日志等內(nèi)容,監(jiān)控用戶的每日在線情況,監(jiān)控每日的注冊(cè)詳情和對(duì)每日注冊(cè)人數(shù)進(jìn)行限制和管理。用戶管理模塊用于查詢和展示角色的基本信息、操作日志等。服務(wù)器配置模塊主要是對(duì)服務(wù)器進(jìn)行部署、編輯以及后期擴(kuò)展。訓(xùn)練數(shù)據(jù)管理模塊是用來(lái)統(tǒng)計(jì)用戶的訓(xùn)練完成情況及合格次數(shù)等。運(yùn)營(yíng)管理模塊主要是對(duì)數(shù)據(jù)庫(kù)的操作進(jìn)行控制管理;管理員模塊負(fù)責(zé)對(duì)后臺(tái)管理員的權(quán)限編輯及資料管理。公告管理模塊負(fù)責(zé)滾屏公告和登錄公告的查詢、申請(qǐng)等。
后臺(tái)信息管理系統(tǒng)使用Nginx作為Web服務(wù)器。為了提升用戶頁(yè)面的加載速度,使用gzip技術(shù)對(duì)頁(yè)面進(jìn)行壓縮,并且使用DNS輪詢方式進(jìn)行負(fù)載均衡處理。
在多臺(tái)Linux機(jī)器上部署服務(wù),即使一臺(tái)機(jī)器出現(xiàn)問(wèn)題,其他機(jī)器依然可以提供服務(wù)。主服務(wù)器負(fù)責(zé)提供服務(wù),從服務(wù)器負(fù)責(zé)監(jiān)聽主服務(wù)器的心跳。如果主服務(wù)器出現(xiàn)問(wèn)題,則立刻轉(zhuǎn)換為從服務(wù)器提供服務(wù)。使用的Linux版本為CentOS,服務(wù)器啟動(dòng)界面如圖8所示。
圖8 服務(wù)器界面
當(dāng)有用戶進(jìn)入系統(tǒng)時(shí),服務(wù)器會(huì)有相應(yīng)的信息顯示。用戶傳輸相應(yīng)的協(xié)議時(shí),服務(wù)器會(huì)顯示對(duì)應(yīng)的協(xié)議名稱。測(cè)試結(jié)果顯示:服務(wù)器延遲時(shí)間小于50 ms,數(shù)據(jù)交互速度大于1 000 Bytes,丟包率小于5%。這表明基于網(wǎng)絡(luò)游戲服務(wù)端架構(gòu)設(shè)計(jì)的服務(wù)端系統(tǒng)具有良好的性能,能夠適用于大型多人在線三維仿真訓(xùn)練系統(tǒng)。