鄒大畢 黃倚佳 溫曉麗 謝振東 李靖凱


摘? 要:隨著越來(lái)越多的羊城通記名卡用戶希望可以實(shí)時(shí)獲悉交易信息,并可以隨時(shí)查看過(guò)往的每一筆消費(fèi)記錄,作為自己的乘車憑據(jù)。因此,為了搭建羊城通記名卡交易實(shí)時(shí)推送系統(tǒng),提出基于RabbitMQ+Redis+MongoDB為核心的解決方案,該方案可以滿足交易數(shù)據(jù)的需求。當(dāng)用戶使用記名卡乘坐公交地鐵時(shí),用戶可以通過(guò)羊城通官方APP準(zhǔn)實(shí)時(shí)收到相應(yīng)的交易記錄信息。此外,該系統(tǒng)也支持用戶隨時(shí)隨地在查詢自己的歷史消費(fèi)記錄。此系統(tǒng)的搭建及相關(guān)服務(wù)的推出,進(jìn)一步提升了羊城通記名卡的服務(wù)水平,提高了用戶的滿意度。
關(guān)鍵詞:羊城通記名卡;RabbitMQ;Redis;MongoDB;羊城通官方APP
中圖分類號(hào):TP311.5 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2020)03-0017-03
Abstract:As more and more users of Yangchengtong registered card want to know the transaction information in real time,and can view every past consumption record at any time as their own riding credentials. Therefore,in order to build a real-time push system for Yangchengtong registered card transaction,a solution based on RabbitMQ + Redis + MongoDB is proposed,which can meet the needs of transaction data. When the user uses the registered card to take the subway,the user can receive the corresponding transaction record information in real time through the official APP of Yangchengtong. In addition,the system also supports users to query their historical consumption records anytime and anywhere. The establishment of this system and the introduction of related services further improve the service level of Yangchengtong registered card and improve the satisfaction of users.
Keywords:Yangchengtong named card;RabbitMQ;Redis;MongoDB;Yangchengtong APP
0? 引? 言
羊城通卡是廣州市的交通卡,其使用范圍覆蓋了公交、地鐵、水上巴士等全方位公共交通出行領(lǐng)域,其具有不記名、不掛失的特點(diǎn)。近年來(lái),鑒于掛失需求的不斷顯現(xiàn),羊城通卡推出與用戶的實(shí)名信息綁定的記名卡,此記名卡具有可掛失、可補(bǔ)辦、可注銷、余額可轉(zhuǎn)移的特點(diǎn),得到了廣大用戶的歡迎,其發(fā)行量和使用量也在迅速增加。
鑒于公交卡應(yīng)用場(chǎng)景的特殊性,其交易主要為脫機(jī)驗(yàn)證交易,用戶想要獲知實(shí)時(shí)交易記錄、實(shí)時(shí)余額以及歷史交易時(shí),需要利用安卓NFC手機(jī)貼卡查詢或者到自助機(jī)、人工客服點(diǎn)查詢,具有較多的限制,不易使用,用戶體驗(yàn)差。
隨著網(wǎng)絡(luò)環(huán)境、羊城通卡受理終端設(shè)備等相關(guān)基礎(chǔ)設(shè)施服務(wù)水平的提升,羊城通卡的脫機(jī)交易可以準(zhǔn)實(shí)時(shí)上傳到后端系統(tǒng)。基于此,鑒于羊城通記名卡與用戶信息進(jìn)行了綁定,可以較好地確認(rèn)卡與用戶的關(guān)聯(lián),為了提升用戶持卡服務(wù)體驗(yàn),本文基于高可靠并發(fā)架構(gòu)技術(shù)構(gòu)建了羊城通記名卡交易查詢與實(shí)時(shí)推送系統(tǒng)。用戶只需要下載羊城通官方APP并綁定自己的記名卡就能隨時(shí)隨地收到記名卡交易推送或查詢記名卡歷史交易記錄,極大地提高用戶的體驗(yàn)感和便利性。
1? 相關(guān)技術(shù)概述
近幾年,互聯(lián)網(wǎng)各個(gè)中間件技術(shù)發(fā)展速度非常快,其中,因?yàn)镽abbitMQ、Redis、MongoDB這三個(gè)中間件的功能和性能日益完善和穩(wěn)定,更是受到大量互聯(lián)網(wǎng)項(xiàng)目開發(fā)者的青睞。記名卡消費(fèi)記錄查詢和實(shí)時(shí)推送系統(tǒng)就是以這三個(gè)中間件為核心來(lái)搭建的。下面將逐一介紹這三個(gè)中間件的特點(diǎn)和大致原理。
1.1? RabbitMQ
RabbitMQ是消費(fèi)-生產(chǎn)者模型的一個(gè)典型的代表,消息生產(chǎn)者(producer)往消息隊(duì)列中不斷寫入消息,而另一端的消息消費(fèi)者(consumer)則可以讀取或者訂閱隊(duì)列中的消息,是一款基于AMQP協(xié)議可復(fù)用的企業(yè)消息系統(tǒng)。業(yè)務(wù)上,可以實(shí)現(xiàn)服務(wù)提供者和消費(fèi)者之間的數(shù)據(jù)解耦,提供高可用性的消息傳輸機(jī)制,在實(shí)際生產(chǎn)中應(yīng)用相當(dāng)廣泛。
在羊城通系統(tǒng)中,RabbitMQ存放的是記名卡交易記錄;producer包括刷卡終端和羊城通卡核心交易系統(tǒng),其中刷卡終端準(zhǔn)實(shí)時(shí)上送羊城通卡消費(fèi)記錄,核心交易系統(tǒng)則推送羊城通卡充值記錄等;consumer為本系統(tǒng)的交易數(shù)據(jù)處理及推送組件。
1.2? Redis
Redis是一個(gè)開源的,使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。同時(shí)Redis也是一個(gè)Key-Value存儲(chǔ)系統(tǒng),更是一個(gè)高性能的Key-Value數(shù)據(jù)庫(kù)。最主要的是Redis還支持主從同步。
Redis核心對(duì)象RedisObject包含了數(shù)據(jù)結(jié)構(gòu)、編碼方式、指針、虛擬內(nèi)存等,如圖1所示。數(shù)據(jù)類型包括string、hash、list、set、sorted set;編碼方式包括raw、int、ht、zipmap、linkedlist、ziplist、intset。
1.3? MongoDB
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),由C++編寫,旨在為Web應(yīng)用提供可擴(kuò)展、高性能的數(shù)據(jù)存儲(chǔ)解決方案。它是一個(gè)介于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系型數(shù)據(jù)庫(kù)中功能最豐富、最像關(guān)系型數(shù)據(jù)庫(kù)的。在高負(fù)載情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器的性能。
MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB文檔類似于JSON對(duì)象,字段值可以包含其他文檔、數(shù)據(jù)和文檔數(shù)組。
2? 記名卡交易實(shí)時(shí)推送系統(tǒng)
基于前述中間件,本文提出的記名卡交易實(shí)時(shí)推送系統(tǒng)的架構(gòu)如圖2所示。
如圖所示,系統(tǒng)主要組件及數(shù)據(jù)流程是:
(1)刷卡終端機(jī),負(fù)責(zé)準(zhǔn)實(shí)時(shí)將羊城通卡交易記錄上傳到后端系統(tǒng);
(2)記名卡系統(tǒng)集群,負(fù)責(zé)接收終端交易記錄,并作為producer將記錄傳送給RabbitMQ消息服務(wù)系統(tǒng);
(3)RabbitMQ集群,消息隊(duì)列服務(wù)集群系統(tǒng);
(4)數(shù)據(jù)接收服務(wù)器集群,作為consumer將RabbitMQ中的消息提取出來(lái);
(5)Redis服務(wù)器集群,是一個(gè)緩存服務(wù)系統(tǒng),用于交易記錄的緩存;
(6)數(shù)據(jù)主動(dòng)獲取服務(wù)器集群,負(fù)責(zé)交易數(shù)據(jù)的主動(dòng)獲取和處理服務(wù),它從緩存中獲取數(shù)據(jù)并存入MongoDB,同時(shí)將實(shí)時(shí)記錄同步到推送服務(wù)器;
(7)MongoDB集群,負(fù)責(zé)交易記錄的持久化存儲(chǔ);
(8)推送服務(wù)器,負(fù)責(zé)將實(shí)施交易記錄推送到APP前端系統(tǒng);
(9)羊城通APP,與用戶實(shí)現(xiàn)交互的前端應(yīng)用服務(wù)系統(tǒng),支持實(shí)時(shí)交易記錄的接收與展示,支持歷史交易記錄查詢等。
3? 記名卡交易實(shí)時(shí)推送系統(tǒng)分析
3.1? 海量交易數(shù)據(jù)上送處理
由于記名卡用戶的基數(shù)大且日漸增加,記名卡的交易數(shù)據(jù)量以及交易上送服務(wù)的QPS會(huì)非常大,而http協(xié)議的性能相對(duì)較差,因此本系統(tǒng)選擇使用的RabbitMQ消息集群系統(tǒng)作為傳輸輔助工具。
這種方法的好處是支持動(dòng)態(tài)橫向擴(kuò)容系統(tǒng),即隨著記名卡數(shù)據(jù)量的日益增加,當(dāng)達(dá)到性能瓶頸時(shí),可以通過(guò)增加RabbitMQ節(jié)點(diǎn)來(lái)支持性能提升。
3.2? 海量交易數(shù)據(jù)存儲(chǔ)和推送處理
羊城通記名卡交易數(shù)據(jù)到達(dá)羊城通APP的服務(wù)器之后,由于數(shù)據(jù)量大,若收到一條數(shù)據(jù)就馬上進(jìn)行入庫(kù)和推送操作,會(huì)非常消耗網(wǎng)絡(luò)性能。
因此,本系統(tǒng)設(shè)計(jì)時(shí),數(shù)據(jù)會(huì)先放入Redis集群服務(wù)器作為緩存,另外啟動(dòng)一個(gè)主動(dòng)獲取數(shù)據(jù)的服務(wù)定時(shí)批量從Redis服務(wù)集群提取交易數(shù)據(jù),并批量插入MongoDB數(shù)據(jù)庫(kù)和推送服務(wù)器,最終到達(dá)用戶。
當(dāng)用戶需要查詢歷史交易記錄的時(shí)候,只需要直接查詢MongoDB數(shù)據(jù)庫(kù)就可以完成這個(gè)操作,由于MongoDB橫向擴(kuò)展非常方便,所以不用擔(dān)心數(shù)據(jù)量日益巨大帶來(lái)的性能瓶頸。
4? 結(jié)? 論
隨著羊城通記名卡的普及率越來(lái)越高,提高用戶體驗(yàn)、讓記名卡服務(wù)更人性化,已經(jīng)成為一項(xiàng)迫在眉睫的工作。基于此需求背景,本文提出了基于RabbitMQ+Redis+MongoDB的記名卡記錄實(shí)時(shí)推送系統(tǒng),此系統(tǒng)可以有助于解決記名卡用戶消費(fèi)無(wú)感知和查詢歷史交易記錄成本高的問(wèn)題,提升用戶持卡服務(wù)滿意度。
目前該系統(tǒng)完成搭建,正處于友好試運(yùn)行階段,后續(xù)將對(duì)該系統(tǒng)進(jìn)行持續(xù)優(yōu)化完善工作。
參考文獻(xiàn):
[1] 黃健宏.Redis設(shè)計(jì)與實(shí)現(xiàn) [M].北京:機(jī)械工業(yè)出版社,2014.
[2] 陳德森,楊祖元.基于MongoDB的文本分類研究 [J].無(wú)線互聯(lián)科技,2017(5):96-98.
[3] 駱文亮.基于異步消息處理的RabbitMQ運(yùn)行原理探討 [J].數(shù)碼世界,2017(11):400.
作者簡(jiǎn)介:鄒大畢(1981.12-),男,漢族,廣東湛江人,系統(tǒng)架構(gòu)設(shè)計(jì)師,移動(dòng)互聯(lián)網(wǎng)發(fā)展部副部長(zhǎng),碩士,研究方向:互聯(lián)網(wǎng)軟件技術(shù)、網(wǎng)絡(luò)與信息安全技術(shù)。