時曉旭 賴俊業(yè) 謝江 余燁 黃逸飛
摘要:隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)處理的需求不斷增長,尤其是對傳感器產(chǎn)生的海量數(shù)據(jù)的處理需求,以及數(shù)據(jù)生產(chǎn)和消費之間的速度不同步問題日益突出。同時數(shù)據(jù)安全問題日益受到關(guān)注,國產(chǎn)操作系統(tǒng)的應(yīng)用也逐漸增多。因此在國產(chǎn)操作系統(tǒng)環(huán)境下,需要一款國產(chǎn)大數(shù)據(jù)中間件解決數(shù)據(jù)生產(chǎn)和消費之間速度差的問題?;贘ava技術(shù),采用發(fā)布-訂閱模型作為設(shè)計模式,實現(xiàn)了消息的發(fā)送者和接收者可以獨立地演化和擴(kuò)展,解耦數(shù)據(jù)的發(fā)送和接收過程,有效平衡數(shù)據(jù)生產(chǎn)和消費之間速度差。
關(guān)鍵詞:大數(shù)據(jù);數(shù)據(jù)交換中間件;國產(chǎn)操作系統(tǒng);傳感器數(shù)據(jù)
中圖分類號:TP311.1? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2024)08-0052-04
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID)
0 引言
隨著物聯(lián)網(wǎng)的迅速發(fā)展和傳感器數(shù)據(jù)的激增,數(shù)據(jù)生產(chǎn)和消費之間的速度不同步問題日益突出。傳統(tǒng)的數(shù)據(jù)緩沖方式之一是將數(shù)據(jù)暫時存放在數(shù)據(jù)庫。然而,由于不同的應(yīng)用系統(tǒng)需要調(diào)用數(shù)據(jù)庫中數(shù)據(jù),可能導(dǎo)致存在數(shù)據(jù)泄露的風(fēng)險,存在安全隱患[1]。同時,頻繁的I/O操作也會導(dǎo)致數(shù)據(jù)庫讀寫性能下降[2]。Kafka是目前業(yè)界常用的開源數(shù)據(jù)交換中間件,它由Apache軟件基金開發(fā),能夠進(jìn)行分布式流處理[3]。但其是由國外廠商開發(fā),對于中國特有的應(yīng)用場景可能存在一定的適配問題,并且可能會面臨技術(shù)授權(quán)的問題,進(jìn)而影響后續(xù)的軟件升級和服務(wù),同時也存在數(shù)據(jù)隱私和安全方面的風(fēng)險。因此,本文基于Java技術(shù),采用發(fā)布-訂閱模式,開發(fā)適用于國產(chǎn)操作系統(tǒng)的數(shù)據(jù)交換中間件。
1 中間件設(shè)計采用的相關(guān)技術(shù)和數(shù)據(jù)格式
1.1 Java
Java是一個廣泛應(yīng)用于軟件開發(fā)的編程語言。選擇Java作為開發(fā)語言最主要的原因是其具有跨平臺特性。Java的跨平臺特性源于其獨特的編譯和執(zhí)行方式。Java源代碼首先被編譯成字節(jié)碼而不是機(jī)器碼,然后在目標(biāo)平臺上由Java虛擬機(jī)(JVM) 解釋執(zhí)行字節(jié)碼。這種機(jī)制使得Java程序能夠在安裝了Java虛擬機(jī)的任何平臺上運行,而無須重新編譯[4]。
1.2 發(fā)布-訂閱模式
發(fā)布-訂閱模式是一種常用的軟件設(shè)計模式,用于實現(xiàn)組件之間的松耦合通信。在該模式中,通常存在兩個主要角色:發(fā)布者和訂閱者。發(fā)布者負(fù)責(zé)產(chǎn)生事件或消息,并將其發(fā)送到一個或多個訂閱者。訂閱者則注冊自己對特定類型的事件或消息感興趣,并在發(fā)布者發(fā)送相應(yīng)事件或消息時進(jìn)行相應(yīng)的處理。發(fā)布-訂閱模式的核心思想為解耦發(fā)布者和訂閱者之間的關(guān)系,使它們能夠獨立地演化。發(fā)布者不需要知道訂閱者的存在,也不需要關(guān)心具體的訂閱者是誰。同理,訂閱者也不需要知道發(fā)布者的存在,只需要注冊自己感興趣的事件或消息即可。這種解耦使得系統(tǒng)更加靈活和可擴(kuò)展[5]。在發(fā)布-訂閱模式中,發(fā)布者和訂閱者之間通過一個稱為消息隊列或事件總線的中介來進(jìn)行通信。發(fā)布者將事件或消息發(fā)送到消息隊列或事件總線中,而訂閱者則從中獲取感興趣的事件或消息進(jìn)行處理。這種中介的存在使得發(fā)布者和訂閱者之間的通信變得簡單和高效。發(fā)布-訂閱模式在許多領(lǐng)域都有廣泛的應(yīng)用,例如消息中間件、事件驅(qū)動系統(tǒng)、GUI開發(fā)等。它能夠有效地解耦組件之間的依賴關(guān)系,提高系統(tǒng)的可維護(hù)性和可擴(kuò)展性。同時,它還能夠?qū)崿F(xiàn)異步通信,提高系統(tǒng)的響應(yīng)性和性能。
1.3 數(shù)據(jù)格式
該中間件主要面對的數(shù)據(jù)為傳感器產(chǎn)生的檢測數(shù)據(jù)。在傳感器端的服務(wù)器中,會將數(shù)據(jù)進(jìn)行預(yù)處理操作,將數(shù)據(jù)格式轉(zhuǎn)化為JSON格式,每條數(shù)據(jù)將包含以下內(nèi)容:時間戳(記錄數(shù)據(jù)采集的時間點)、傳感器類型、采樣頻率、數(shù)據(jù)值和數(shù)據(jù)單位。
2 系統(tǒng)架構(gòu)設(shè)計
中間件總體結(jié)構(gòu)如圖1所示,主要由三大模塊構(gòu)成:生產(chǎn)者、消費者和數(shù)據(jù)交換池。生產(chǎn)者是向數(shù)據(jù)交換池發(fā)送數(shù)據(jù)的客戶端應(yīng)用程序,同時對外提供開發(fā)和調(diào)用接口,開發(fā)者可以調(diào)用其中包含的接口,向數(shù)據(jù)交換池發(fā)送數(shù)據(jù)或者設(shè)置數(shù)據(jù)交換池參數(shù);消費者是一個從數(shù)據(jù)交換池中獲取數(shù)據(jù)的客戶端應(yīng)用程序,同時對外提供開發(fā)和調(diào)用接口,開發(fā)者可以調(diào)用其中包含的接口,從數(shù)據(jù)交換池拉取數(shù)據(jù);數(shù)據(jù)交換池部署于服務(wù)器中,主要作用為緩存數(shù)據(jù)和多線程處理數(shù)據(jù)讀寫任務(wù),是中間件的核心模塊。
2.1 生產(chǎn)者模塊
生產(chǎn)者模塊結(jié)構(gòu)如圖2所示。生產(chǎn)者是為開發(fā)者提供的接口集合,開發(fā)者通過調(diào)用生產(chǎn)者提供的接口,將數(shù)據(jù)發(fā)布到數(shù)據(jù)交換池相應(yīng)的Class中,通過配置消息分區(qū)方式和選擇合適的消息序列化器實現(xiàn)可靠性設(shè)置,包括確認(rèn)機(jī)制和重試策略。首先是開發(fā)者通過生產(chǎn)者創(chuàng)建Class,用戶向數(shù)據(jù)交換池發(fā)送帶有參數(shù)的請求,參數(shù)包括Class的名稱以及分區(qū)數(shù)量等,以便在數(shù)據(jù)交換池開辟空間和設(shè)定數(shù)據(jù)管理的模式,同時向Class目錄表添加新的Class記錄;數(shù)據(jù)分區(qū)Class創(chuàng)建完成后,開發(fā)者通過調(diào)用生產(chǎn)者程序向指定的Class里寫入數(shù)據(jù)。當(dāng)數(shù)據(jù)開始流入時,首先要經(jīng)過攔截器處理,攔截器的作用為:第一對數(shù)據(jù)的大小進(jìn)行限制,若超過規(guī)定大小就要進(jìn)行數(shù)據(jù)切分操作,第二對流入的每一條數(shù)據(jù)消息數(shù)據(jù)附加上事件時間戳(event time) 和UUID,形成每條數(shù)據(jù)的標(biāo)識id,后期將以標(biāo)識id作為數(shù)據(jù)的唯一標(biāo)識對數(shù)據(jù)進(jìn)行相關(guān)處理。
生產(chǎn)者與服務(wù)器的通信是基于Java的Socket通信和消息隊列來實現(xiàn)的。當(dāng)數(shù)據(jù)流出攔截器,會由sender線程發(fā)送到服務(wù)器,當(dāng)服務(wù)器通過應(yīng)答機(jī)制確認(rèn)收到數(shù)據(jù)后會反饋給sender然后繼續(xù)數(shù)據(jù)傳輸,若服務(wù)器沒有收到數(shù)據(jù)服務(wù)器也會反饋給sender,sender就會重新發(fā)送數(shù)據(jù),這里sender中設(shè)置最大重試次數(shù)和最大重試延遲時間。
應(yīng)答機(jī)制具體內(nèi)容:該應(yīng)答機(jī)制支持三種模式,1) 當(dāng)參數(shù)為0:生產(chǎn)者將不會等待任何確認(rèn)信號,直接將消息發(fā)送到數(shù)據(jù)交換池并認(rèn)為發(fā)送成功。這種方式是最快的,但是也最不可靠,因為如果消息未處理成功,則無法得知。2) 當(dāng)參數(shù)為1:生產(chǎn)者會等待來自數(shù)據(jù)交換池中分區(qū)的確認(rèn)信號。當(dāng)分區(qū)成功寫入消息后,生產(chǎn)者會收到確認(rèn)信號。這種方式比參數(shù)0更可靠,但仍可能出現(xiàn)數(shù)據(jù)丟失的情況。3) 當(dāng)參數(shù)為all或者ac當(dāng)參數(shù)為-1:生產(chǎn)者會等待所有的副本都完成了消息的寫入才會收到確認(rèn)信號。這種方式是最可靠的,但同時也會影響性能,因為需要等待所有副本的確認(rèn)。
2.2 消費者模塊
消費者結(jié)構(gòu)如圖3所示。消費者是為開發(fā)者提供的接口集合,開發(fā)者通過調(diào)用消費者提供的接口,訂閱服務(wù)器中的Class,并從指定的Class中讀取消息,可以配置消息消費的起始偏移量、消費組等參數(shù)。開發(fā)者調(diào)用消費者接口向數(shù)據(jù)交換池發(fā)送消費數(shù)據(jù)請求,請求的參數(shù)包括要消費的Class名稱等。消費請求經(jīng)過Socket通信進(jìn)入請求隊列中等待服務(wù)器響應(yīng)。
數(shù)據(jù)交換池響應(yīng)后,首先到Class目錄表中查詢是否存在對應(yīng)的Class,若不存在則報錯,若存在,繼續(xù)查詢消費表中要消費的Class的分區(qū)是否正在被同一消費者組中的consumer消費。若該分區(qū)正在被消費,則需要在Class下選擇其他未被占用的分區(qū)進(jìn)行消費,同時在消費表中生成一條記錄,記錄包括本次消費的Class和分區(qū)的名稱,以及讀取的最后一條數(shù)據(jù)的內(nèi)容及時間等。數(shù)據(jù)讀出后經(jīng)過攔截器(這里的攔截器的主要作用為去除數(shù)據(jù)上的標(biāo)識id) ,然后傳遞到開發(fā)者手中。
2.3 數(shù)據(jù)交換池模塊
數(shù)據(jù)交換池結(jié)構(gòu)圖如圖4所示。數(shù)據(jù)交換池部署于中央服務(wù)器,數(shù)據(jù)交換池內(nèi)部的數(shù)據(jù)分類和分區(qū)設(shè)置是由開發(fā)者調(diào)用生產(chǎn)者相關(guān)接口進(jìn)行設(shè)置的。開發(fā)者通過生產(chǎn)者上傳的數(shù)據(jù)按照一定的規(guī)則存放在指定空間中,并按照開發(fā)者的設(shè)置定期清理數(shù)據(jù)。當(dāng)開發(fā)者通過消費者提出消費數(shù)據(jù)的請求時,數(shù)據(jù)交換池會按照請求準(zhǔn)備好相關(guān)數(shù)據(jù)。
數(shù)據(jù)交換池采用的存儲策略為時間窗口策略。當(dāng)任意一條數(shù)據(jù)進(jìn)入服務(wù)器時,其自身攜帶的標(biāo)識id已經(jīng)帶有自身的時間戳(event time),是每條數(shù)據(jù)的儲存標(biāo)識。用戶可以通過指定時間段,也可以使用中間件默認(rèn)的時間段,將同一時間段內(nèi)接收到的數(shù)據(jù)寫入同一個文件中。
在數(shù)據(jù)交換池內(nèi)部采用以下存儲模式:當(dāng)開發(fā)者通過調(diào)用生產(chǎn)者相應(yīng)接口,向數(shù)據(jù)交換池發(fā)送創(chuàng)建Class命令時,數(shù)據(jù)交換池會創(chuàng)建Class文件夾(Class名稱由用戶指定),在Class文件夾下又會建立幾個分區(qū)文件夾(數(shù)量由用戶決定),分區(qū)文件夾中存放著寫有數(shù)據(jù)的文本文件。每個數(shù)據(jù)文本文件的名稱以文件中所有數(shù)據(jù)里最小event time命名,分區(qū)文件夾名稱以分區(qū)文件夾中最小數(shù)據(jù)文本文件名稱命名。
數(shù)據(jù)交換池采取多種措施保障其安全、穩(wěn)定和可靠:1) 備份機(jī)制。為保障數(shù)據(jù)可靠性,為每個Class創(chuàng)建相同結(jié)構(gòu)的備份文件。2) 日志文件機(jī)制。數(shù)據(jù)交換池內(nèi)部存在兩張表,分別是Class目錄表和消費表,由數(shù)據(jù)交換池內(nèi)部的listener負(fù)責(zé)管理。Class目錄表記錄生產(chǎn)者所有的操作,以及服務(wù)器上所有Class的名稱、其創(chuàng)建的時間、最新一條數(shù)據(jù)的標(biāo)識id和哪些分區(qū)文件夾正在寫入,目的是快速地查詢所需的Class和內(nèi)部數(shù)據(jù)的更新情況,同時保證分區(qū)文件夾的負(fù)載均衡。消費表記錄消費者所有的操作,以及正在被消費的分區(qū)文件夾、正在消費的消費者信息、每個消費者每次消費的Class名稱和最后一條消費數(shù)據(jù)等消費信息,此表的目的是保證在任何時間點只有一個消費者可以處理特定的分區(qū)。3) 內(nèi)存緩沖讀寫機(jī)制。當(dāng)生產(chǎn)者對數(shù)據(jù)文本文件進(jìn)行寫操作時,為每個生產(chǎn)者在內(nèi)存中開辟一個長度可變的緩存空間。先將輸入的數(shù)據(jù)寫入緩存中,等待寫入操作完畢后再從內(nèi)存空間寫入數(shù)據(jù)文本文件,并回收內(nèi)存空間。這樣既能夠保證多并發(fā)操作,又不會降低寫入速度。4) 消費者組機(jī)制。若多個消費者消費同一個Class的數(shù)據(jù),則將這些消費者劃為同一個消費者組并分配group id,確保每個分區(qū)只被消費者組中的一個消費者消費。在任何時間點只有一個消費者可以讀取特定的分區(qū)文件夾,并且如果該消費者失敗或離線,則另一個消費者可以立即接管。5) 定期刪除機(jī)制。數(shù)據(jù)交換池會保存一定時間內(nèi)的數(shù)據(jù),并對過期數(shù)據(jù)進(jìn)行定期刪除,保存數(shù)據(jù)的時間可由開發(fā)者調(diào)用生產(chǎn)者相應(yīng)接口設(shè)置。6) 監(jiān)聽者機(jī)制。在交換池內(nèi)部設(shè)有一個監(jiān)聽程序(listener) ,主要負(fù)責(zé)監(jiān)控并記錄生產(chǎn)者和消費者的所有操作,以及對Class目錄和消費表的管理。
2.4 系統(tǒng)測試
服務(wù)器測試環(huán)境為麒麟銀河V10操作系統(tǒng),系統(tǒng)界面如圖5所示。測試環(huán)境通過VMware Workstation Pro軟件搭建,配置了2個處理器,每個處理器擁有4個內(nèi)核,分配了8GB內(nèi)存和50GB的硬盤。在此環(huán)境中部署中間件的交換池模塊,并創(chuàng)建用于測試的Class分區(qū)。
使用Java編寫一個隨機(jī)數(shù)據(jù)生成程序,通過調(diào)用生產(chǎn)者提供的相關(guān)接口向數(shù)據(jù)交換池中寫入數(shù)據(jù)。數(shù)據(jù)生成程序的可設(shè)定參數(shù)包括每秒生成數(shù)據(jù)條數(shù),數(shù)據(jù)格式為JSON,每條數(shù)據(jù)包含時間戳(記錄數(shù)據(jù)采集時間)、傳感器類型、采樣率、數(shù)據(jù)值和數(shù)據(jù)單位。測試結(jié)果如表1所示。
使用Java編寫程序,模擬實際情況中通過調(diào)用消費者提供的相關(guān)接口,從數(shù)據(jù)交換池中讀取數(shù)據(jù)。測試結(jié)果表2所示。
3 結(jié)束語
本文主要圍繞數(shù)據(jù)中間件的設(shè)計和功能實現(xiàn)展開論述,包括所采用的相關(guān)技術(shù)、理論概念,以及中間件的系統(tǒng)架構(gòu)設(shè)計和最終測試。該中間件具備適配國產(chǎn)操作系統(tǒng)的能力,能夠滿足本土化需求,為國內(nèi)相關(guān)企業(yè)在選擇同類型中間件時提供更多選擇。未來,該中間件的消費者模塊可擴(kuò)展鏈接不同數(shù)據(jù)庫的接口,使開發(fā)人員能夠更便捷地將數(shù)據(jù)直接存儲到數(shù)據(jù)庫中。
參考文獻(xiàn):
[1] 郭瓊.計算機(jī)數(shù)據(jù)庫的信息安全管理策略分析[J].電子技術(shù),2023,52(10):326-327.
[2] 張志強(qiáng),王偉鈞,周利軍,等.數(shù)據(jù)庫讀寫策略在文本挖掘中的優(yōu)化研究[J].成都大學(xué)學(xué)報(自然科學(xué)版),2015,34(3):262-265,274.
[3] 余建忠,譚任深.基于Kafka的海上風(fēng)電場數(shù)據(jù)傳輸系統(tǒng)設(shè)計與實現(xiàn)[J].科技創(chuàng)新與應(yīng)用,2023,13(31):26-31.
[4] 董正言.Java跨平臺特性的實現(xiàn)原理[J].科技資訊,2014,12(18):20-21.
[5] 吳雯君.基于模式挖掘的發(fā)布/訂閱分布式系統(tǒng)異常檢測技術(shù)研究[D].南京:東南大學(xué),2021.
【通聯(lián)編輯:謝媛媛】