趙文華
(中國福利彩票發行管理中心技術部,北京 100101)
目前,福彩銷售系統大多是基于分布式存儲結構開發的單體應用程序業務系統,市場運行多年來,總體情況良好,有力保障了福彩的發行銷售工作。為了保證系統實時安全運行,通常將上述單體應用業務系統部署在不同服務器上實現備份,保障發生故障時系統間相互快速切換,有的地方還建立了異地災備中心等。但是傳統的單體應用模式也導致了資源嚴重浪費,開發人員運維管理困難,系統可擴展性差等問題。隨著云計算技術、微服務技術等新型應用架構的不斷興起、發展和完善,為成功解決上述問題提供了思路。
微服務是以單一應用程序構成的小服務,自己擁有自己的行程與輕量化處理,服務依據業務功能設計,以全自動的方式集成部署,與其他服務使用HTTP/API 進行通信。同時服務會使用最小規模的集中管理能力,服務可以用不同的編程語言與數據庫等組件實現。微服務是一種開發軟件的架構和組織方法,其中軟件由通過明確定義的API 進行通信的小型獨立服務集組成,微服務架構使應用程序更易于擴展和更好更快的開發,具體特點如下所述。
通俗來講,不同服務內部的開發技術或編程語言可以不一致,為不同的服務選擇最適合的技術,系統中不同部分也可以使用不同存儲技術。
一個服務故障不會導致另一個服務癱瘓,因為各個服務是相互獨立和自治的系統。
微服務在出現性能瓶頸的時候,可以對造成此原因的服務進行擴展升級,而不是對整個系統應用進行優化升級,極大地降低了系統擴展性成本。
對于有幾百萬行代碼的單體服務,即使修改了幾行代碼仍需要重新編譯整個應用,而且軟件變更帶來的不確定性也相對較高,軟件部署的影響也比較大。在微服務架構中,各個服務的部署是獨立的,如果真出了問題也只是影響單個服務,可以快速回滾版本解決。微服務架構中單個服務的代碼量通常不會很大,當需要重構或者優化這些服務的時候,相對較為容易。
通常情況下,對于大型微服務架構的服務運維,往往需要建立一套完備的服務監控系統,服務運維人員需要實時掌握服務運行中的各種狀態,在故障發生時,盡可能降低影響范圍,盡快恢復正常服務。
有些服務的敏感數據存在安全問題,服務安全就是對敏感服務采用安全鑒權機制,對服務的訪問需要進行相應的身份驗證和授權,防止數據泄露外溢的風險。
Dubbo 是阿里巴巴公司開源的一個Java 高性能服務框架,應用可通過高性能的RPC 實現服務的輸入和輸出功能,可以和Spring 框架集成,它提供了三大核心功能:面向接口的遠程方法調用,智能容錯和負載均衡以及服務自動注冊發現。
騰訊內部經過多年的實踐,不斷總結形成的開源項目微服務架構TAF,目前僅支持C++語言。
Google 開發的高性能、通用的開源RPC 框架,其由Google 主要面向移動應用開發并基于HTTP/2 協議和序列化協議標準而設計,但其本身不是分布式的,所以要實現上面的框架功能需要進一步開發。
最初是由Facebook 開發的內部系統跨語言的高性能RPC 框架,之后成為Apache 開源項目之一,跟gRPC一樣,它有一套自己的接口定義語言IDL,可以通過代碼生成器,生成各種編程語言的客戶端和服務端的SDK 代碼,支持多種語言。
對于微服務模塊劃分,可以借鑒傳統單體應用業務功能模塊劃分的思路進行,在這個基礎上,會增加數據驅動,SOA 分層思路等,微服務劃分不宜太細,粒度劃分越細,后續微服務集成和管理的難度就越大。
在IT 應用架構規劃大中臺的概念下,實際上中臺包含了技術中臺和業務中臺,對于技術中臺重點是各個技術組件和技術服務能力的實現,而業務中臺主要包括了數據能力和業務規則處理能力的提供。對于業務中臺本身也是分層,包括了最基本的數據類中心和業務處理類中心。
數據類中心本身又包括了基礎主數據類和核心共享業務數據類,例如,產品中心和用戶中心,屬于基礎主數據類。而訂單中心和庫存中心則屬于業務共享數據類。
業務處理類則主要是進行核心業務邏輯和功能的處理,包括交易中心、結算中心及計費中心等,都可以看作是業務處理類的中臺模塊。當然,業務處理類中臺也可為關鍵的領域服務提供組件,此類組件需要調用底層更多基礎子模塊的核心接口。
數據是驅動業務流程的關鍵性因素,特別是對于一些基礎數據和共享數據,是業務系統的核心所在。如果將一個基礎主數據劃分為一個微服務模塊,那么會導致微服務模塊的數量比較大,從效率上來講不太可行。如果是按標準的主數據管理系統的業務模塊劃分,一定程度上,它不是按照數據維度進行劃分,一般主數據系統包含元數據和數據對象,又細分為數據集成和調度、數據清理、流程引擎及數據內容管理等各個模塊。
對于基礎主數據類微服務模塊,最好的方式是按數據域進行拆分,例如對于用戶、組織、崗位和人員等劃分到一個人力域數據中心,對于供應鏈、物料編碼和采購類別等劃分到采購或供應鏈域微服務模塊。這種劃分既實現了一定程度上的模塊拆分和松耦合,同時按域劃分后,同一個域的基礎主數據本身在一個數據庫中進行管理,這些基礎主數據本身可能存在一定的耦合關系,那么這些耦合關系的處理將不再需要提升到分布式事務層面去處理。
在把基礎和共享數據劃分出來之后,再考慮上層的各個業務以及業務流程與業務規則處理等還需要單獨設置哪些微服務模塊。
對于單體業務系統,還可從已有的業務系統入手進行微服務模塊劃分。這種劃分方式通??紤]了高內聚低耦合的道理。單體應用構建更多是從縱向業務功能的角度出發,是偏縱向垂直方式構建業務功能的,而對于微服務架構思想下,引入了SOA 架構思路,主要思考目前的業務功能和業務流程,從數據→功能→流程的橫向分層思路來搭建。
參考已有的業務系統模塊劃分,也要考慮核心共性基礎數據下沉為獨立的微服務,而流程類業務功能上升到前臺類應用也作為獨立的微服務。在整個過程中可以多參考業務系統的功能架構圖,通過對比分析,再結合實際業務需求和業務流程情況進行優化整合。
福彩銷售系統是發行福利彩票的重要技術載體,也是管理福利彩票的主要技術手段。目前,以在運行的福利彩票“快樂8”銷售系統為例,按照功能模塊劃分,主要包括中央核心交易系統、游戲引擎管理系統、線下渠道管理系統及銷售終端軟件系統。系統功能架構如圖1 所示。
中央核心交易系統主要實現彩票交易流轉、彩票數據稽核、彩民賬戶管理、彩票游戲管理等核心業務功能,并且針對游戲引擎和前端服務系統均提供了標準接口。
游戲引擎管理系統主要完成“快樂8”游戲規則參數化設置、游戲投注方式、游戲風險控制、兌獎查詢及服務等功能。
線下渠道管理系統主要包括投注站權限管理、投注站點新增、撤銷以及調整、站點繳款、業務運行監控、多維度統計分析及日志審計等。
銷售終端軟件系統是指安裝部署在銷售終端上(含自助終端)的業務軟件系統,用于銷售彩票、兌獎服務、通知公告查詢、銷售報表查詢和在線培訓等。
按照上述系統功能架構要求,游戲引擎系統與核心交易系統在基諾游戲彩票核心交易業務中的邏輯關系如圖2 所示。

圖2 功能架構
彩票銷售系統中的核心業務流程包括銷售和兌獎,業務流程如圖3 所示,具體描述如下。

圖3 業務流程
4.2.1 彩票銷售流程
(1)業主、彩民通過銷售終端軟件系統購買彩票,銷售終端軟件系統將購彩請求發送渠道管理系統;(2)渠道管理系統進行相關業務規則校驗通過,并完成渠道業務處理,將彩票交易請求轉發核心交易系統;(3)核心交易系統進行相關業務規則校驗通過,并完成彩民業務處理,將彩票交易請求轉發游戲引擎系統;(4)游戲引擎系統處理投注請求完成,將結果返回核心交易系統;(5)核心交易系統根據投注結果,對彩民業務進行處理,并將交易結果返回渠道管理系統;(6)渠道管理系統根據投注結果,對渠道業務進行處理,并將交易結果返回銷售終端軟件系統;(7)銷售終端軟件系統根據投注結果打印彩票或者給予相應提示。
4.2.2 彩票兌獎流程
(1)業主、彩民通過銷售終端軟件系統進行彩票兌獎,銷售終端軟件系統將兌獎請求發送渠道管理系統;(2)渠道管理系統進行相關業務規則校驗通過,將彩票兌獎請求轉發核心交易系統;(3)核心交易系統進行相關業務規則校驗通過,將彩票兌獎請求轉發游戲引擎系統;(4)游戲引擎系統處理兌獎請求完成,將結果返回核心交易系統;(5)核心交易系統根據兌獎結果,對彩民業務進行處理,并將交易結果返回渠道管理系統;(6)渠道管理系統根據兌獎結果,對渠道業務進行處理,并將交易結果返回前端售彩系統;(7)銷售終端軟件系統根據兌獎結果給予相應提示。
在福彩銷售系統中主要應用的微服務包括:注冊發現服務(registry)、異步消息通信(MQ)、負載均衡(load balance)、內存數據庫(非關系型數據庫)(redis)、安全服務(security)及日志監控服務(monitor)等。
注冊發現服務注冊中心是用來集中管理微服務,實現服務的注冊、發現、檢查等功能;服務A 與服務B 在注冊中心C 注冊,形成服務注冊表(表里登記了服務A 和服務B 的地址等相關信息)。當A 服務想要訪問B 服務時,可以通過注冊中心C 的服務發現機制,獲取服務注冊表進而找到服務B。注冊發現服務是整個銷售系統的基礎,系統中所涉及的微服務均在此注冊訪問。
異步消息通信是指兩個互不同步的設備通過計時機制或其他技術進行數據傳輸,異步通信中兩個字符之間的時間間隔是不固定的,而在一個字符內各位的時間間隔是固定的?;旧?,發送方可以隨時傳輸數據,而接收方必須在信息到達時準備好接收。異步消息通信對于解決在銷售彩票高峰階段且并發量較大的數據是一種較好的處理機制。
負載均衡就是指將負載工作任務進行平衡、分攤到多個操作單元上進行運行,例如核心應用服務器和其他主要任務服務器等,從而協同完成工作任務。負載均衡軟件解決方案是指在一臺或多臺服務器相應的操作系統上安裝一個或多個附加軟件來實現負載均衡,它基于特定環境,配置簡單且使用靈活,可以滿足一般的負載均衡需求。
目前使用的負載均衡算法為動態負載均衡算法以服務器的實時負載狀態信息來決定任務的分配,例如加權最小連接法。最小連接法適用于各個節點處理的性能相似時,任務分發單元會將任務平滑分配給服務器。但當服務器性能差距較大時,就無法達到預期的效果。因為此時連接數并不能準確表明處理能力,連接數小而自身性能很差的服務器可能不及連接數大而自身性能極好的服務器,所以在這個時候就會導致任務無法準確地分配到剩余處理能力強的機器上。
內存數據庫是一個非??焖俚摹㈤_源的、支持網絡、可基于內存亦可持久化的日志型、非關系類型的數據庫,一定程度上是對關系型數據庫的很好補充。它提供了Java,C/C++等客戶端,支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。使得其可執行單層樹復制,存盤可以有意無意地對數據進行寫操作。由于完全實現了發布/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道并接收主服務器完整的消息發布記錄。
安全服務的主要內容包括:安全機制、安全連接、安全協議和安全策略等,它們能在一定程度上彌補和完善現有操作系統和網絡信息系統的安全漏洞。具體內容包括,鑒別用于保證通信的真實性,正式接收的數據就來自所要求的源方,包括對等實體鑒別和數據源鑒別。數據源鑒別連同無連接的服務一起操作,而對等實體鑒別通常與面向連接的服務一起操作,一方面可確保雙方實體可信,另一方面可確保該連接不被第三方干擾,如假冒其中的一方進行非授權的傳輸或接收;訪問控制用于防止對網絡資源的非授權訪問,保證系統的可控性。訪問控制可以用于通信源或目的,或是通信鏈路上的某一地方。
日志監控服務主要是指實時掌握服務運行中的各種狀態,例如內存使用效率、調用次數和健康狀況等,建立一套完備的服務監控體系,包括拓撲關系、日志審計、預警通知和調用追蹤等。
福彩銷售系統既是發行和銷售福利彩票的重要載體,也是管理和服務福彩市場的有效手段,為我國彩票事業的持續發展提供了有力的技術支撐。微服務技術架構在福彩銷售系統中的應用將極大程度地提高該系統的可擴展性、高可用性及安全性等,進一步豐富福彩銷售系統的功能模塊,提升福彩銷售系統的性能指標,從廣義上來講,也將促進福利彩票銷售市場的韌性,擴大福利彩票銷售市場的規模,其必將更好地服務于我國民生民政事業和公益慈善事業持續創新發展。