一、實驗要求
利用MOM消息隊列技術(shù)實現(xiàn)一個分布式隨機信號分析系統(tǒng),具體要求:
1.隨機信號產(chǎn)生器微服務(wù)每隔100毫秒左右就產(chǎn)生一個正態(tài)分布的隨機數(shù)字,并作為一個消息發(fā)布。
2.一個隨機信號統(tǒng)計分析微服務(wù),對信號進行如下分析:
??(1) 計算過去N個隨機信號的均值和方差(N為常量,可設(shè)置);
??(2) 計算所有歷史數(shù)據(jù)中的最大值和最小值;
??(3) 定時地將分析結(jié)果打包成一個新消息并通過MOM發(fā)布出去。
3.一個實時數(shù)據(jù)顯示微服務(wù):
??(1) 實時繪制過去一段時間內(nèi)隨機信號的折線圖;
??(2) 實時顯示隨機信號統(tǒng)計分析結(jié)果。
二、設(shè)計說明
1. 面向消息的中間件MOM
??MOM(Message Oriented Middleware)是面向消息的中間件,使用消息提供者來協(xié)調(diào)消息傳送操作。這種松耦合的通信機制有助于降低客戶端和遠(yuǎn)程服務(wù)之間的依賴性。
??生產(chǎn)者負(fù)責(zé)向分布式消息隊列中發(fā)送消息,消費者從隊列中取出消息。生產(chǎn)者不必關(guān)心消費者是誰,反之亦然,這降低了分布式節(jié)點之間的耦合度,提升了系統(tǒng)的通信效率。當(dāng)消費者未上線或者消費者速度慢于生產(chǎn)者時,生產(chǎn)者可以將消息先緩存于消息隊列中,待消費者上線后,消費者可以繼續(xù)從隊首取出消息,這種模式提高了系統(tǒng)的容錯能力。
2. ActiveMQ
??ActiveMQ是Apache軟件基金會所研發(fā)的開放源代碼消息中間件,完全兼容JMS(Java Message Service),能夠為多種編程語言提供客戶端API。本實驗主要基于ActiveMQ和JMS實現(xiàn)了題目相關(guān)要求。
3. 基于ActiveMQ的隨機信號分析系統(tǒng)
(1) 設(shè)計思想
?? (a) 隨機信號發(fā)生微服務(wù)作為生產(chǎn)者,每隔100ms生成一個高斯分布隨機值并且作為消息發(fā)布出去,主題名為RandGaussian
。
?? (b) 信號分析微服務(wù)作為消費者,訂閱主題名為RandGaussian
的消息,每次從消息隊列中取出一個隨機信號加入自己維護的數(shù)組中,然后對數(shù)組中的元素進行處理,得到信號的統(tǒng)計分析結(jié)果(均值、方差、最小值、最大值等等)。與此同時,該分析器還作為生產(chǎn)者,每隔2s將先前得到的信號分析結(jié)果以空格隔開,打包成字符串形式的消息發(fā)布出去,主題名為AnalysisRes
。
?? ? 分析結(jié)果可視化微服務(wù)同樣作為消費者。由于題目要求將過去一段時間的信號動態(tài)顯示出來,也要求把信號分析結(jié)果顯示出來,因此我讓信號分析微服務(wù)在發(fā)送消息時,把當(dāng)前的信號值也封裝在消息中,這樣可視化微服務(wù)只需要訂閱主題為AnalysisRes
的消息即可獲取全部所需數(shù)據(jù)。在獲取到所需數(shù)據(jù)后,我利用tablesaw
可視化工具提供的折線圖繪制功能將數(shù)據(jù)可視化到了網(wǎng)頁頁面中,一幅折線圖中集成了當(dāng)前信號值、過去N個數(shù)的均值以及歷史最大最小值,且用不同顏色加以區(qū)分,可以達(dá)到一個比較好的視覺效果。
(2) 具體實現(xiàn)步驟
??為了具體實現(xiàn)題目要求,我編寫了3個.java文件,分別為Publisher.java
、Analyzer.java
和Visualizer.java
,這3個模塊分別負(fù)責(zé)實現(xiàn)隨機信號產(chǎn)生器微服務(wù)、隨機信號統(tǒng)計分析微服務(wù)和實時數(shù)據(jù)顯示微服務(wù)。
??Publisher.java
文件中只有一個Publisher類。首先定義實例構(gòu)造函數(shù)Pulisher(String topicName)
,通過該函數(shù)我們可以實例化一個新的、綁定名為topicName
(本實驗中即為RandGaussian
)的主題的publisher對象并且啟動與MOM的連接。其次,我定義了一個sendNum(double mu ,double sigma)
函數(shù),功能是根據(jù)用戶輸入的高斯分布的均值和方差產(chǎn)生一個符合該分布的隨機數(shù)值,并利用producer.send()將該數(shù)值的字符形式當(dāng)成消息發(fā)布出去。最后,還定義了一個sendAnalysis(int num, int N, double value, double mean, double var, double min, double max)
函數(shù),該函數(shù)負(fù)責(zé)將信號分析結(jié)果封裝成以空格分隔的字符串消息并發(fā)布出去。在Publisher類的主方法中,首先需要用戶輸入高斯分布的均值和方差,然后程序循環(huán)生成隨機數(shù)并發(fā)布,間隔100毫秒后發(fā)布下一條消息。
??Analyzer.java
文件中有兩個類,第一個是public class Analyzer
類,主要實現(xiàn)對消費者對象的初始化(綁定主題RandGaussian
)、獲取用戶輸入的N值以及設(shè)置消息監(jiān)聽器,最后啟動與MOM的連接。另一個類是MyListener1
,即消息監(jiān)聽類。在該類中我重寫了onMessage
函數(shù),使其能夠?qū)崿F(xiàn)題目的要求:開辟一個動態(tài)數(shù)組,每隔一段時間從消息隊列中取得一個隨機數(shù)并加入該數(shù)組,然后利用該數(shù)組即可求出過去N個信號的均值和方差,也可以求出全局的最小值和最大值。在得到一次分析的所有結(jié)果后,只需實例化一個publisher2對象,再調(diào)用Publisher類提供的sendAnalysis
方法即可將分析結(jié)果打包成字符串發(fā)布出去(主題設(shè)為AnalysisRes
)。
??Visualizer.java
文件中有兩個類,public class Visualizer
類負(fù)責(zé)初始化消費者對象(訂閱主題為AnalysisRes
的消息)、設(shè)置監(jiān)聽器以及開啟連接。另一個類是MyListener2
,即消息監(jiān)聽類。在onMessage
函數(shù)中,首先需要對得到的消息進行解包,這里我利用的是String.split(" ")
函數(shù)對字符串進行分解,再將結(jié)果傳入analysis數(shù)組中。解包之后,便可以將各類統(tǒng)計數(shù)據(jù)分別add到相應(yīng)的動態(tài)數(shù)組中保存,便于后續(xù)的可視化操作。最后,設(shè)置一個Thread.sleep(2000)
,即實現(xiàn)每隔2s從消息隊列中取一個隨機信號進行分析。
?? 在可視化模塊,我采用的是tech.tablesaw
工具包中的Plot.show(LinePlot)
函數(shù)。由于我想在同一幅圖中將若干統(tǒng)計結(jié)果一起繪制出來,則需要將各個統(tǒng)計結(jié)果的橫軸數(shù)值數(shù)組、縱軸數(shù)值數(shù)組和類型名數(shù)組分別合并到3個大數(shù)組中,這導(dǎo)致有一部分的代碼顯得比較冗長。由于在Visualizer.java
中設(shè)置了Thread.sleep(2000)
,因此在可視化模塊中只需要不斷地取出統(tǒng)計分析結(jié)果,即可實現(xiàn)每隔2s顯示可視化結(jié)果。如果sleep時間設(shè)置得太短,則會導(dǎo)致瞬間產(chǎn)生很多統(tǒng)計圖表,人眼看不過來,所以為了簡潔,我將sleep時間設(shè)為了2s,可以起到接近實時的效果。文章來源:http://www.zghlxwxcb.cn/news/detail-424880.html
三、實驗結(jié)果
在Visualizer主類的命令行中,是實時顯示的統(tǒng)計分析結(jié)果(過去N個信號的均值、方差和全局最小值最大值等):
瀏覽器頁面在不斷實時顯示隨機信號統(tǒng)計分析的可視化折線圖,各種統(tǒng)計量的變化一目了然:
補充說明:可視化部分我采用的工具tablesaw在渲染HTML頁面時調(diào)用的是https://cdn.plot.ly/plotly-latest.min.js提供的JavaScript代碼,而該CDN節(jié)點有時存在不穩(wěn)定的情況,可能導(dǎo)致頁面渲染失敗,但仍能從網(wǎng)頁源代碼處看到圖表背后的數(shù)據(jù),例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-424880.html
源碼:分布式計算實驗4 隨機信號分析系統(tǒng)
到了這里,關(guān)于分布式計算實驗4 隨機信號分析系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!