周敏 江西省公安廳科技信息化總隊 南昌市 330000
隨著金盾工程的推進,警務信息系統(tǒng)開始蓬勃發(fā)展。一直以來,警務應用系統(tǒng)部署于公安內(nèi)網(wǎng),主要用戶是公安民警,核心任務就是提供快速、準確的信息化手段滿足“打、防、管、控”需求。由于民警數(shù)量相對固定、訪問量有限,所以,內(nèi)網(wǎng)警務系統(tǒng)大部分采取傳統(tǒng)的三層架構就能滿足需求。
近年來,“放管服”改革快速推進,要求公安機關向互聯(lián)網(wǎng)開放能力,直接為廣大群眾公安政務服務, 讓企業(yè)和群眾少跑腿、好辦事。這一要求給我們公安機關提出了新的信息化建設命題,就是如何架構滿足海量用戶高并發(fā)訪問需求的互聯(lián)網(wǎng)警務應用系統(tǒng)。廣義的互聯(lián)網(wǎng)警務系統(tǒng)一般包括三大部分:一是互聯(lián)網(wǎng)端應用,通常需要進行身份驗證、業(yè)務數(shù)據(jù)獲取、業(yè)務邏輯處理等;二是邊界網(wǎng)關,主要任務是內(nèi)外網(wǎng)數(shù)據(jù)交互;三是內(nèi)網(wǎng)端警種業(yè)務系統(tǒng),主要實現(xiàn)業(yè)務辦理和結果反饋。本文僅討論互聯(lián)網(wǎng)端的警務系統(tǒng)設計。
互聯(lián)網(wǎng)警務系統(tǒng)與傳統(tǒng)警務系統(tǒng)最大區(qū)別就是由用戶數(shù)量的不同而帶來的高并發(fā),核心指標就是QPS(每秒處理請求數(shù))。警務內(nèi)網(wǎng)的QPS一般在千級,因此,傳統(tǒng)的客戶端-應用服務器-數(shù)據(jù)庫服務的結構即能夠很好滿足,但互聯(lián)網(wǎng)端面對的全國上億群眾,QPS每秒數(shù)萬是很正常的,需要新的架構以滿足業(yè)務需求。傳統(tǒng)集中式結構的縱向擴展特性,決定了其性能的非線性增長,而且集群規(guī)模越大,性能衰減越厲害,昂貴的成本無法覆蓋激增業(yè)務處理需求。因此,對業(yè)務系統(tǒng)進行解耦、拆分、橫向擴展,構建分布式系統(tǒng)成為當前互聯(lián)網(wǎng)業(yè)務的首選。
互聯(lián)網(wǎng)警務系統(tǒng)的核心設計思想就是用分布式結構來實現(xiàn)低成本、高并發(fā)、高可擴展要求。主要的技術手段就是對信息系統(tǒng)進行縱向解耦和橫向拆分,將3層結構解耦為客戶端、接入層、Web前端、接口網(wǎng)關層、微服務、緩存層、數(shù)據(jù)庫層6層結構。在Web層、接口網(wǎng)關層使用負載均衡,做成高可用集群;在微服務層,將業(yè)務邏輯進行解耦,將應用系統(tǒng)功能進行解耦,拆分為最小服務單位,由管理中心進行統(tǒng)一調度和維護,向下層請求數(shù)據(jù),向上層提供服務;在緩存層,使用集群存儲熱點數(shù)據(jù),以提高I/O讀寫;在數(shù)據(jù)庫層,使用分庫分表技術,將結構化數(shù)據(jù)和非結構數(shù)據(jù)分離,將一個海量數(shù)據(jù)庫拆分成多個數(shù)據(jù)庫,提高數(shù)據(jù)讀寫速度。
用戶接入層設計主要是滿足分散在不同地域、不同網(wǎng)絡的用戶快速訪問Web服務的需求。根據(jù)這一目的,我們使用內(nèi)容分發(fā)技術(CDN)在不同區(qū)域部署Web服務器,提供靜態(tài)頁面元素的訪問。
將應用層劃分為Web前端、接口網(wǎng)關以及微服務3層。其中,Web前端僅僅負責Html、JavaScript等頁面元素的緩存、解析和加載,直接與用戶瀏覽器進行交互。需要與服務器交互的工作都提交給后端接口網(wǎng)關。Web層采取負載均衡集群部署的方式,對外提供一個虛擬IP,提供用戶訪問。負載均衡的基本思想是把高并發(fā)的訪問平均分配到每一個服務器節(jié)點上,從而減小每一個節(jié)點的壓力。
接口網(wǎng)關部署于Web前端之后、微服務之前,是外界系統(tǒng)和內(nèi)部系統(tǒng)之間的一道門,所有的客戶端請求通過網(wǎng)關訪問后臺服務。接口為了應對高并發(fā)訪問,接口服務網(wǎng)關通常做成Nginx負載均衡集群。外部請求經(jīng)過負載均衡后路由到網(wǎng)關集群中服務,由網(wǎng)關服務轉發(fā)到后臺微服務進行業(yè)務處理。服務網(wǎng)關作為內(nèi)部系統(tǒng)的邊界,它有以下基本能力:
(1)動態(tài)路由
動態(tài)的將請求路由到所需要的后端服務集群。
(2)限流和容錯
為每種類型的請求分配容量,當請求數(shù)量超過閥值時拋掉外部請求,限制流量,保護后臺服務不被大流量沖垮; 當內(nèi)部服務出現(xiàn)故障時直接在邊界創(chuàng)建一些響應,集中做容錯處理,而不是將請求轉發(fā)到內(nèi)部集群,保證用戶良好的體驗。
(3)身份認證和安全性控制
對每個外部請求進行用戶認證,實現(xiàn)安全控制。
(4)監(jiān)控和日志
網(wǎng)關可以監(jiān)控系統(tǒng)運行狀態(tài)、收集訪問日志信息,通過分析日志內(nèi)容,對后臺系統(tǒng)做進一步優(yōu)化。
我們可以采用Spring Cloud Netflix框架的開源組件Zuul來實現(xiàn)網(wǎng)關服務。
微服務設計就是進行應用軟件功能分解,將系統(tǒng)不同職能的模塊分成不同的服務、分布在不同的服務器上,各個服務之間通過統(tǒng)一的注冊管理中心進行相互調用和對外服務。例如將一個在線商店系統(tǒng)劃分成訂單管理中心、客戶信息管理中心、商品管理中心等多個服務中心。微服務模塊通過接口網(wǎng)關集群對外服務,內(nèi)部通訊可以采取兩種通訊框架:一是基于HTTP協(xié)議的同步機制(REST、RPC),典型代表是阿里巴巴開源的分布式服務框架Dubbo;二是基于消息隊列的異步分布式消息處理系統(tǒng),例如Kafka、RabbitMQ。這種分布式的通訊機制保障了Web服務高并發(fā)訪問能力。
使用Memcache,Redis等緩存數(shù)據(jù)庫作為緩存層,存儲數(shù)據(jù)庫熱點數(shù)據(jù)以及不常改變數(shù)據(jù),直接在內(nèi)存中快速讀取數(shù)據(jù),從而避免從硬盤多次讀寫數(shù)據(jù),大大提升響應速度。
對于互聯(lián)網(wǎng)業(yè)務常常需要提交的圖片以及其他非結構化附件文檔,采取文件服務器或對象存儲專門存放,減少網(wǎng)絡數(shù)據(jù)流量,提升系統(tǒng)可用性。
數(shù)據(jù)庫服務為上層Web應用提供關系式或結構化的數(shù)據(jù)存儲與查詢支持,是整個系統(tǒng)核心所在。互聯(lián)網(wǎng)數(shù)據(jù)庫通常采用開源MySQL、PostgreSQL等數(shù)據(jù)庫。在數(shù)據(jù)庫架構上,在業(yè)務負載較低時可以采取主備模式,當負載上升后,應用采用一主多從的分布式集群,進行讀寫分離、業(yè)務分擔。在數(shù)據(jù)庫設計上,可以進行數(shù)據(jù)分散存儲,一是業(yè)務分庫,按照業(yè)務模塊將數(shù)據(jù)分散到不同的數(shù)據(jù)庫服務器中,每臺服務器負責一個業(yè)務子庫,降低單庫數(shù)據(jù)容量,提升讀寫效率;二是數(shù)據(jù)分表,使用垂直分表或水平分表技術,將單表數(shù)據(jù)量減少。垂直分表一般是將數(shù)據(jù)表中不常用的字段分離出去,減少磁盤讀寫量;水平分表是按照某種算法如時間、范圍、hash函數(shù)等將數(shù)據(jù)表切分成多個同樣結構的數(shù)據(jù)表,提升單表查詢性能。
通過分布式改造,整個系統(tǒng)框架從應用到數(shù)據(jù)、從前端到后端,都是以微服務和大集群的方式對外提供服務,只需要橫向增加服務器就能夠線性提升處理能力,滿足海量用戶高并發(fā)訪問需求,為互聯(lián)網(wǎng)警務系統(tǒng)提供堅實支撐。基于這一系統(tǒng)架構設計,我們建設了江西省為民服務網(wǎng)上辦事系統(tǒng),為全省5000萬群眾提供互聯(lián)網(wǎng)辦事服務,實現(xiàn)了江西公安警務服務的智能化、便利化。