張濤
(國(guó)能(北京)商務(wù)網(wǎng)絡(luò)有限公司 北京 100056)
國(guó)家能源e購(gòu)網(wǎng)上商城(以下簡(jiǎn)稱商城)是國(guó)家能源集團(tuán)進(jìn)行物資、工程、服務(wù)等項(xiàng)目非招標(biāo)采購(gòu)的電力產(chǎn)品專屬商城,是基于阿里云技術(shù)打造的,包含電力專區(qū)、電子超市、詢比價(jià)、競(jìng)價(jià)等板塊的一體化電子采購(gòu)平臺(tái)。國(guó)能(北京)商務(wù)網(wǎng)絡(luò)有限公司(以下簡(jiǎn)稱商務(wù)網(wǎng)公司)作為商城建設(shè)運(yùn)維單位,面對(duì)平臺(tái)型科技示范企業(yè)的創(chuàng)建要求,對(duì)標(biāo)國(guó)內(nèi)一流電商化企業(yè),必須打造出一支過(guò)硬的開(kāi)發(fā)和運(yùn)維隊(duì)伍。
商城及相關(guān)系統(tǒng)的運(yùn)維工作主要包括業(yè)務(wù)技術(shù)支持、IT基礎(chǔ)設(shè)施管理及集成、網(wǎng)絡(luò)安全管理等工作,必須高度重視信息系統(tǒng)運(yùn)維管理工作,這就需要轉(zhuǎn)變傳統(tǒng)的信息系統(tǒng)運(yùn)維模式,建立健全信息系統(tǒng)運(yùn)維體系,提升信息系統(tǒng)運(yùn)維水平[1]。運(yùn)維工作極其重要且又紛繁混雜,運(yùn)維和開(kāi)發(fā)項(xiàng)目管理系統(tǒng)需要具備較高的安全性、實(shí)時(shí)性和動(dòng)態(tài)分布等特性,建立一套高效、穩(wěn)定的問(wèn)題需求跟蹤工單系統(tǒng),就成為急需解決的問(wèn)題[2]。故障工單的流轉(zhuǎn)作為基礎(chǔ)維護(hù)工作的基礎(chǔ),必須能夠?qū)崟r(shí)反映故障和工單處理情況,為用戶提供優(yōu)異感知,切實(shí)解決各類異常[3]。
在很長(zhǎng)時(shí)間以來(lái),商務(wù)網(wǎng)公司系統(tǒng)運(yùn)維部使用的工單系統(tǒng)雖然功能全面,能夠滿足有序規(guī)劃和管理軟件研發(fā)全流程的要求,但是其全套工具價(jià)格成本很高,使用配置很復(fù)雜,有些功能并不實(shí)用且捆綁銷售,得不償失。
網(wǎng)站的開(kāi)發(fā)一般可分為前端開(kāi)發(fā)和后端開(kāi)發(fā)。前端開(kāi)發(fā)負(fù)責(zé)網(wǎng)站頁(yè)面的展示,是創(chuàng)建Web頁(yè)面或APP等前端界面呈現(xiàn)給用戶的過(guò)程,通過(guò)各種網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)、網(wǎng)站框架及前端解決方案,來(lái)實(shí)現(xiàn)方便實(shí)用的用戶界面交互;后端開(kāi)發(fā)負(fù)責(zé)網(wǎng)站底層業(yè)務(wù)邏輯的實(shí)現(xiàn)、平臺(tái)的穩(wěn)定性與性能等,通常是與前端進(jìn)行數(shù)據(jù)交互及網(wǎng)站數(shù)據(jù)的保存和讀取。目前,PHP語(yǔ)言以免費(fèi)、開(kāi)源、插件豐富及跨平臺(tái)性等優(yōu)點(diǎn)成為廣泛使用的網(wǎng)站后端開(kāi)發(fā)語(yǔ)言[4]。
為進(jìn)一步提升商城平臺(tái)工單處理能力,加強(qiáng)工單系統(tǒng)自主開(kāi)發(fā)運(yùn)維,系統(tǒng)運(yùn)維部積極組織技術(shù)攻關(guān),在開(kāi)源平臺(tái)上查找相關(guān)資源,最終確立了前端基于reactjs+redux、后端基于php laravel-framework、數(shù)據(jù)庫(kù)采用MongoDB的技術(shù)路線,開(kāi)發(fā)完成了一款問(wèn)題需求跟蹤軟件,并投入了使用。
前端React在MVC架構(gòu)中屬于V(視圖),構(gòu)建隨著時(shí)間數(shù)據(jù)不斷變化的大規(guī)模應(yīng)用程序。React利用虛擬DOM來(lái)減少對(duì)實(shí)際DOM的操作從而提升性能。通過(guò)React,開(kāi)發(fā)技術(shù)人員唯一要做的事情就是構(gòu)建組件,得益于其良好的封裝性,組件使代碼復(fù)用、測(cè)試和關(guān)注分離更加簡(jiǎn)單[5]。
React只是DOM的一個(gè)抽象層,并不是Web應(yīng)用的完整解決方案,而Redux就解決了這個(gè)問(wèn)題。Redux是JavaScript狀態(tài)容器,提供可預(yù)測(cè)化的狀態(tài)管理,它可以促進(jìn)構(gòu)建一致化的應(yīng)用,運(yùn)行于不同的環(huán)境(客戶端、服務(wù)器、原生應(yīng)用),并且易于測(cè)試。它將Facebook的Flux架構(gòu)和函數(shù)式編程相結(jié)合,迅速地成為了當(dāng)前最熱門的前端架構(gòu)。
Redux的設(shè)計(jì)思想是:首先,Web應(yīng)用是一個(gè)狀態(tài)機(jī),視圖與狀態(tài)是一一對(duì)應(yīng)的;其次,所有的狀態(tài),保存在一個(gè)對(duì)象里面。二者的結(jié)合React-Redux是Redux的官方React綁定庫(kù),其能夠使開(kāi)發(fā)者的React組件從Redux store中讀取數(shù)據(jù),并且向store分發(fā)actions以更新數(shù)據(jù)[6]。
后端采用的Laravel是一套簡(jiǎn)潔、優(yōu)雅的PHP Web開(kāi)發(fā)框架(PHP Web Framework)。它將開(kāi)發(fā)者從繁雜無(wú)章的代碼中解放出來(lái),可以幫助開(kāi)發(fā)者構(gòu)建一個(gè)完美的網(wǎng)絡(luò)應(yīng)用,并且每行源代碼都很簡(jiǎn)潔、富于表達(dá)力。
在Laravel中,具有一套高級(jí)的PHP ActiveRecord實(shí)現(xiàn)——Eloquent ORM,它能迅捷地將“約束(constraints)”應(yīng)用到該關(guān)系的雙方,這樣開(kāi)發(fā)者就具有了對(duì)數(shù)據(jù)的完全控制,而且享受到ActiveRecord的所有便利。Eloquent本身就完全支持Fluent中查詢構(gòu)造器的所有方法。
本系統(tǒng)的數(shù)據(jù)庫(kù)采用的是新興的非關(guān)系型數(shù)據(jù)庫(kù)MongoDB,是一款開(kāi)源的面向集合的數(shù)據(jù)庫(kù),它是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng),設(shè)計(jì)MongoDB的主要目的是為WEB應(yīng)用提供擴(kuò)展性好的高性能開(kāi)源數(shù)據(jù)存儲(chǔ)解決方案,在負(fù)載很高的情況下,更多的節(jié)點(diǎn)可以保證服務(wù)器性能?!懊嫦蚣希–ollection-Oriented)”的意思是將數(shù)據(jù)分組存儲(chǔ)在數(shù)據(jù)集合中,每個(gè)數(shù)據(jù)集合在數(shù)據(jù)庫(kù)中擁有一個(gè)唯一的標(biāo)識(shí)名,并且可以包含無(wú)限數(shù)目的文檔,其特點(diǎn)是性能高、部署容易、使用方便,存儲(chǔ)數(shù)據(jù)非常迅捷[7]。
MongoDB的主要目標(biāo)是在高性能和高度伸縮性的鍵/值存儲(chǔ)方式與傳統(tǒng)的RDBMS系統(tǒng)之間架起一座橋梁,它能夠集兩者的優(yōu)勢(shì)于一身。首先,MongoDB非常適合實(shí)時(shí)的數(shù)據(jù)增刪查改,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的可復(fù)制性以及高度伸縮性;其次,由于其高性能,MongoDB也非常適合作為關(guān)鍵信息基礎(chǔ)設(shè)施的持久化緩存層,在信息系統(tǒng)重啟之后,由MongoDB搭建的緩存層可以有效避免下層的數(shù)據(jù)源過(guò)載;最后,MongoDB的BSON數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ)及查詢[8]。
在方案配置方面,實(shí)現(xiàn)了支持用戶創(chuàng)建項(xiàng)目和定義屬于項(xiàng)目自己的配置方案,實(shí)現(xiàn)全局配置方案和本地配置方案的完美結(jié)合。在工作流方面,各項(xiàng)目不僅可引用系統(tǒng)工作流,同時(shí),可自定義自己的工作流,工作流的每一步可進(jìn)行精細(xì)控制,確保正確的人在正確的時(shí)間執(zhí)行正確的操作。該設(shè)計(jì)有看板和甘特圖功能,支持Scrum敏捷開(kāi)發(fā)和看板方法。通過(guò)看板,輕松實(shí)現(xiàn)任務(wù)、需求、Bug的管理跟蹤,Scrum是一個(gè)過(guò)程框架,它內(nèi)置有一系列的實(shí)踐和預(yù)定義角色,它最大的好處是易于學(xué)習(xí),而且應(yīng)用Scrum的投入相對(duì)較低;甘特圖不僅能顯示每一個(gè)問(wèn)題的時(shí)間長(zhǎng)短和進(jìn)展情況,還可以看到任意時(shí)間點(diǎn)在進(jìn)行哪些問(wèn)題,用戶針對(duì)問(wèn)題發(fā)表評(píng)論,同時(shí)可“@”項(xiàng)目組其他成員,用戶可在問(wèn)題上填寫(xiě)工作日志,及時(shí)查看問(wèn)題的完成情況,團(tuán)隊(duì)成員可分享和查找工作所需的資料文檔。設(shè)計(jì)有統(tǒng)計(jì)報(bào)表功能,隨時(shí)掌握項(xiàng)目進(jìn)度,快速調(diào)整項(xiàng)目作業(yè)狀況,支持各種維度的統(tǒng)計(jì)。設(shè)計(jì)有完備權(quán)限控制的模型,可自定義角色,不僅可給用戶授權(quán),同時(shí)支持給用戶組授權(quán)。在版本控制方面,把不同階段的任務(wù)和里程碑確定成一個(gè)個(gè)的版本,以便對(duì)整個(gè)項(xiàng)目進(jìn)行過(guò)程的管理和階段目標(biāo)的控制。日歷管理則不僅可同步國(guó)家法定節(jié)假日,用戶還可以配置自己的日程,以便更加準(zhǔn)確地跟蹤每個(gè)任務(wù)的進(jìn)展。為了安全管理,日志文件詳盡記錄了哪些用戶在什么時(shí)間段通過(guò)什么終端訪問(wèn)了哪些API,還支持Docker安裝,更加增強(qiáng)了可擴(kuò)展性和兼容性。
作為商城平臺(tái)的開(kāi)發(fā)運(yùn)維單位,商務(wù)網(wǎng)公司必須規(guī)范公司產(chǎn)品、軟件設(shè)計(jì)開(kāi)發(fā)和運(yùn)維工單處理過(guò)程的管理和監(jiān)督,滿足公司增強(qiáng)市場(chǎng)競(jìng)爭(zhēng)能力的需求,最大限度地減少公司經(jīng)營(yíng)風(fēng)險(xiǎn),結(jié)合質(zhì)量管理體系和網(wǎng)絡(luò)安全等保體系規(guī)范公司研發(fā)管理及研發(fā)流程,有效提升開(kāi)發(fā)品質(zhì),縮短開(kāi)發(fā)時(shí)間。
以運(yùn)維工單處理流程為例,工作流如圖1所示。
圖1 運(yùn)維工單處理流程工作流圖
問(wèn)題提報(bào)人首先進(jìn)入運(yùn)維工單項(xiàng)目,在問(wèn)題中新創(chuàng)建自己的工單,在頁(yè)面中填寫(xiě)必填項(xiàng),點(diǎn)擊確認(rèn),即可將該工單推送到工單負(fù)責(zé)人處,同時(shí)工單狀態(tài)變?yōu)榇幚?,解決狀態(tài)為未解決。
分配到的運(yùn)維工單,負(fù)責(zé)人接到新工單可以進(jìn)行3個(gè)操作,分別是開(kāi)始處理、轉(zhuǎn)產(chǎn)品分析確認(rèn)和轉(zhuǎn)開(kāi)發(fā)分析確認(rèn)。如果該工單是系統(tǒng)運(yùn)維部職能范圍內(nèi)的業(yè)務(wù),則點(diǎn)擊開(kāi)始處理,否則根據(jù)該工單內(nèi)容,判斷其應(yīng)該歸屬的部門,分別轉(zhuǎn)產(chǎn)品或開(kāi)發(fā)分析確認(rèn)。這3個(gè)操作完成后,工單狀態(tài)都進(jìn)入到問(wèn)題處理中狀態(tài),分別由系統(tǒng)運(yùn)維部、產(chǎn)品設(shè)計(jì)部和研發(fā)中心確定下一步操作。下一步操作步驟有提交腳本和待驗(yàn)證這兩個(gè)。如果涉及腳本執(zhí)行,則在工單信息中輸入需要執(zhí)行的腳本,然后提交給部門經(jīng)理進(jìn)行審批,該工單的狀態(tài)即變?yōu)槟_本審批中,部門經(jīng)理審核腳本,如果通過(guò),則點(diǎn)擊腳本審批按鈕提交執(zhí)行,工單狀態(tài)變?yōu)槟_本執(zhí)行中,否則,點(diǎn)擊腳本審批駁回按鈕,退回上一步,重新提交新的腳本,狀態(tài)回到問(wèn)題處理中。腳本執(zhí)行完后,即進(jìn)入待驗(yàn)證狀態(tài),由問(wèn)題提報(bào)人進(jìn)行驗(yàn)證,如驗(yàn)證通過(guò),則關(guān)閉該工單,工單狀態(tài)變?yōu)橐淹瓿刹⑶医鉀Q狀態(tài)置為已解決;如驗(yàn)證未通過(guò),則點(diǎn)擊退回按鈕,將問(wèn)題退回到問(wèn)題負(fù)責(zé)人,重新處理,工單狀態(tài)置為待處理,解決狀態(tài)置為未解決。問(wèn)題負(fù)責(zé)人如收到被退回的工單,則按上述步驟重新走一遍流程,直到驗(yàn)證通過(guò)。如果該問(wèn)題工單不涉及腳本執(zhí)行,則處理完后直接點(diǎn)擊待驗(yàn)證按鈕,直接將該工單推送到問(wèn)題提報(bào)人處進(jìn)行驗(yàn)證,狀態(tài)置為待驗(yàn)證,同樣,如果驗(yàn)證通過(guò),則關(guān)閉該工單,工單狀態(tài)變?yōu)橐淹瓿刹⑶医鉀Q狀態(tài)置為已解決;如驗(yàn)證未通過(guò),則點(diǎn)擊退回按鈕,將問(wèn)題退回到問(wèn)題負(fù)責(zé)人,重新處理,工單狀態(tài)置為待處理,解決狀態(tài)置為未解決。
本系統(tǒng)是完全自主開(kāi)發(fā)可控的問(wèn)題需求跟蹤系統(tǒng),可以根據(jù)不同單位的需求,進(jìn)行適應(yīng)性改造。從舊工單系統(tǒng)整體遷移到本系統(tǒng)以來(lái),運(yùn)維工單正常流轉(zhuǎn)零失誤,實(shí)現(xiàn)了對(duì)各個(gè)項(xiàng)目進(jìn)行過(guò)程的精細(xì)管理和階段目標(biāo)的精密控制,對(duì)運(yùn)維工作做到了無(wú)縫鏈接,其他在研項(xiàng)目的工單遷移工作也在逐步順利開(kāi)展。商務(wù)網(wǎng)公司規(guī)范了公司產(chǎn)品、軟件設(shè)計(jì)開(kāi)發(fā)和運(yùn)維工單處理過(guò)程的管理和監(jiān)督,滿足了公司增強(qiáng)市場(chǎng)競(jìng)爭(zhēng)能力的需求,最大限度地減少了公司經(jīng)營(yíng)風(fēng)險(xiǎn),有效提升了開(kāi)發(fā)品質(zhì),縮短了開(kāi)發(fā)時(shí)間,每年還節(jié)省了相對(duì)可觀的購(gòu)買系統(tǒng)軟件License的相關(guān)版權(quán)費(fèi)用,而且由于掌握了全部系統(tǒng)源代碼,做到了全系統(tǒng)自主可控。但是同時(shí),也發(fā)現(xiàn)由于工單系統(tǒng)沒(méi)有及時(shí)的通知提醒功能,導(dǎo)致部分工單沒(méi)有被相應(yīng)負(fù)責(zé)人及時(shí)處理。下一步將設(shè)計(jì)開(kāi)發(fā)一款工單提醒系統(tǒng),以用來(lái)有效提高工單響應(yīng)速度,解決工單實(shí)時(shí)響應(yīng)的問(wèn)題。