分布式计算实验4 随机信号分析系统

news2024/11/25 2:54:26

一、实验要求

利用MOM消息队列技术实现一个分布式随机信号分析系统,具体要求:

1.随机信号产生器微服务每隔100毫秒左右就产生一个正态分布的随机数字,并作为一个消息发布。
2.一个随机信号统计分析微服务,对信号进行如下分析:

  (1) 计算过去N个随机信号的均值和方差(N为常量,可设置);

  (2) 计算所有历史数据中的最大值和最小值;

  (3) 定时地将分析结果打包成一个新消息并通过MOM发布出去。

3.一个实时数据显示微服务:

  (1) 实时绘制过去一段时间内随机信号的折线图;

  (2) 实时显示随机信号统计分析结果。

二、设计说明

1. 面向消息的中间件MOM

  MOM(Message Oriented Middleware)是面向消息的中间件,使用消息提供者来协调消息传送操作。这种松耦合的通信机制有助于降低客户端和远程服务之间的依赖性。

  生产者负责向分布式消息队列中发送消息,消费者从队列中取出消息。生产者不必关心消费者是谁,反之亦然,这降低了分布式节点之间的耦合度,提升了系统的通信效率。当消费者未上线或者消费者速度慢于生产者时,生产者可以将消息先缓存于消息队列中,待消费者上线后,消费者可以继续从队首取出消息,这种模式提高了系统的容错能力。

2. ActiveMQ

  ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件,完全兼容JMS(Java Message Service),能够为多种编程语言提供客户端API。本实验主要基于ActiveMQ和JMS实现了题目相关要求。

3. 基于ActiveMQ的随机信号分析系统

(1) 设计思想

   (a) 随机信号发生微服务作为生产者,每隔100ms生成一个高斯分布随机值并且作为消息发布出去,主题名为RandGaussian

   (b) 信号分析微服务作为消费者,订阅主题名为RandGaussian的消息,每次从消息队列中取出一个随机信号加入自己维护的数组中,然后对数组中的元素进行处理,得到信号的统计分析结果(均值、方差、最小值、最大值等等)。与此同时,该分析器还作为生产者,每隔2s将先前得到的信号分析结果以空格隔开,打包成字符串形式的消息发布出去,主题名为AnalysisRes

   © 分析结果可视化微服务同样作为消费者。由于题目要求将过去一段时间的信号动态显示出来,也要求把信号分析结果显示出来,因此我让信号分析微服务在发送消息时,把当前的信号值也封装在消息中,这样可视化微服务只需要订阅主题为AnalysisRes的消息即可获取全部所需数据。在获取到所需数据后,我利用tablesaw可视化工具提供的折线图绘制功能将数据可视化到了网页页面中,一幅折线图中集成了当前信号值、过去N个数的均值以及历史最大最小值,且用不同颜色加以区分,可以达到一个比较好的视觉效果。

(2) 具体实现步骤

 为了具体实现题目要求,我编写了3个.java文件,分别为Publisher.javaAnalyzer.javaVisualizer.java,这3个模块分别负责实现随机信号产生器微服务、随机信号统计分析微服务和实时数据显示微服务。

  Publisher.java文件中只有一个Publisher类。首先定义实例构造函数Pulisher(String topicName),通过该函数我们可以实例化一个新的、绑定名为topicName(本实验中即为RandGaussian)的主题的publisher对象并且启动与MOM的连接。其次,我定义了一个sendNum(double mu ,double sigma)函数,功能是根据用户输入的高斯分布的均值和方差产生一个符合该分布的随机数值,并利用producer.send()将该数值的字符形式当成消息发布出去。最后,还定义了一个sendAnalysis(int num, int N, double value, double mean, double var, double min, double max)函数,该函数负责将信号分析结果封装成以空格分隔的字符串消息并发布出去。在Publisher类的主方法中,首先需要用户输入高斯分布的均值和方差,然后程序循环生成随机数并发布,间隔100毫秒后发布下一条消息。

  Analyzer.java文件中有两个类,第一个是public class Analyzer类,主要实现对消费者对象的初始化(绑定主题RandGaussian)、获取用户输入的N值以及设置消息监听器,最后启动与MOM的连接。另一个类是MyListener1,即消息监听类。在该类中我重写了onMessage函数,使其能够实现题目的要求:开辟一个动态数组,每隔一段时间从消息队列中取得一个随机数并加入该数组,然后利用该数组即可求出过去N个信号的均值和方差,也可以求出全局的最小值和最大值。在得到一次分析的所有结果后,只需实例化一个publisher2对象,再调用Publisher类提供的sendAnalysis方法即可将分析结果打包成字符串发布出去(主题设为AnalysisRes)。

  Visualizer.java文件中有两个类,public class Visualizer类负责初始化消费者对象(订阅主题为AnalysisRes的消息)、设置监听器以及开启连接。另一个类是MyListener2,即消息监听类。在onMessage函数中,首先需要对得到的消息进行解包,这里我利用的是String.split(" ")函数对字符串进行分解,再将结果传入analysis数组中。解包之后,便可以将各类统计数据分别add到相应的动态数组中保存,便于后续的可视化操作。最后,设置一个Thread.sleep(2000),即实现每隔2s从消息队列中取一个随机信号进行分析。

   在可视化模块,我采用的是tech.tablesaw工具包中的Plot.show(LinePlot)函数。由于我想在同一幅图中将若干统计结果一起绘制出来,则需要将各个统计结果的横轴数值数组、纵轴数值数组和类型名数组分别合并到3个大数组中,这导致有一部分的代码显得比较冗长。由于在Visualizer.java中设置了Thread.sleep(2000),因此在可视化模块中只需要不断地取出统计分析结果,即可实现每隔2s显示可视化结果。如果sleep时间设置得太短,则会导致瞬间产生很多统计图表,人眼看不过来,所以为了简洁,我将sleep时间设为了2s,可以起到接近实时的效果。

三、实验结果

在Visualizer主类的命令行中,是实时显示的统计分析结果(过去N个信号的均值、方差和全局最小值最大值等):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jDRqXp3-1659514489233)(https://s1.ax1x.com/2022/08/03/vZEd5d.png#pic_center)]
浏览器页面在不断实时显示随机信号统计分析的可视化折线图,各种统计量的变化一目了然:
vZED2t.png
补充说明:可视化部分我采用的工具tablesaw在渲染HTML页面时调用的是https://cdn.plot.ly/plotly-latest.min.js提供的JavaScript代码,而该CDN节点有时存在不稳定的情况,可能导致页面渲染失败,但仍能从网页源代码处看到图表背后的数据,例如:
在这里插入图片描述

源码:分布式计算实验4 随机信号分析系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开发工具 - vscode】vscode配置C/C++运行环境

【开发工具 - VSCode】vscode配置C/C环境 准备工作第一步 下载vscode第二步 下载mingw第三步 将mingw添加至系统变量中第四步 打开VsCode安装一下必要的插件 正式开始配置第一步 新建个存放C/C文件的文件夹,并新建个cpp文件配置方法一 借助run code 插件的配置方法 …

c语言平方(c语言平方怎么打)

C语言中怎么求平方 a^6 是a和6的异或,并不是5的6次幂。 你的程序会如下计算: 5是101 ,6是110,你的答案你一定是011,也就是3~C语言中^是指抑或运算符,不是求幂的。你要求平方就 ba*a;6次方就乘6次。#include…

java调用chatgpt接口,实现专属于自己的人工智能助手

文章目录 前言导包基本说明请求参数响应参数创建请求和响应的VO类 代码编写使用最后说明 前言 今天突然突发奇想,就想要用java来调用chatget的接口,实现自己的聊天机器人,但是网上找文章,属实是少的可怜(可能是不让发吧)。找到了…

Unity鼠标带动物体运动的三种方法

目录 第一种:物体跟随鼠标移动。 第二种:鼠标拖动物体运动。 第三种:鼠标点到哪,物体运动到哪。 第一种:物体跟随鼠标移动。 描述:鼠标左键点击物体,将物体拾起,松开鼠标左键&…

每日一练蓝桥杯C语言:2020年真题题集(B组)

在这里我给大家推荐一款不错刷算法学习网站:点击这处链接牛客网;牛客网作为国内内容超级丰富的 IT 题库,各种东西看的我眼花缭乱,题库面试学习求职讨论大厂内推等等服务,堪称"互联网求职神器"。它好就好在不…

MySQL(九):MVCC能否解决幻读问题

尺有所短,寸有所长;不忘初心,方得始终。 请关注公众号:星河之码 幻读【前后多次读取,数据总量不一致】 同一个事务里面连续执行两次同样的sql语句,可能导致不同结果的问题,第二次sql语句可能会返…

CSS3动画属性 animation详解(看完就会)

CSS3动画属性 animation 文章包含个人理解错误请指出 往期文章 【css高级】变量详解 轮播图swiper框架的基本使用【Transform3D】转换详解(看完就会)【css动画】移动的小车 【CSS3】 float浮动与position定位常见问题(个人笔记&#xff09…

MySQL入门安装(一步一图)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

三极管工作原理介绍(动画图解)

三极管BJT 各位社区的小伙伴们大家好,相信大家也像我一样,因为上学的时候学过,但是呢,出社会不怎么用,久而久之就忘了,今天来给大家巩固一下,我对三极管的通俗易懂的工作原理介绍! 半…

怎样提高报表呈现的性能

报表的性能很重要,是一个总被谈及的问题,跑的慢的报表用户体验恶劣,无法忍受。解决这些慢的性能问题,也成了项目方和工程师头疼的事情。一出状况,就得安排技术好的,能力强的工程师去救火,本来利…

『赠书活动 | 第二期』《元宇宙Ⅱ:图解元技术区块链、元资产与Web3.0、元人与理想国(全三册)》

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 『赠书活动 | 第二期』 本期书籍:《元宇宙Ⅱ:图解元技术区块链、元资产与Web3.0、元人与理想国》 赠书规则:评论区&…

齐全且实用的MySQL函数使用大全

目录 一、MySQL函数介绍 二、MySQL函数分类 (一)单行函数 ①字符串函数 ②数学函数 ③日期函数 ④流程控制函数 ⑤系统信息函数 ⑥其他函数 (二)聚合函数 三、函数使用示例 (一)字符函数 ①le…

【K8S系列】深入解析etcd

序言 时间永远是旁观者,所有的过程和结果,都需要我们自己去承担。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器…

WeIdentity智能合约源码分析

WeIdentity智能合约 介绍 本文结合WeIdentity智能合约文档对其源码进行阅读分析。当前,WeIdentity合约层面的工作目标主要包括两部分: WeIdentity DID智能合约,负责链上ID体系建立,具体包括生成DID(Distributed IDe…

【C++】vector类详细总结(包括vector二维数组)(持续更新中)

目录 一、vector的初始化(9种) 二、vector的访问和遍历 2.1 访问(3种) (1)使用下标运算符[]访问和修改 (2)使用迭代器访问 (3)使用at()函数访问 &#…

Spring Boot配置多数据源的四种方式

1、导读 在日常开发中我们都是以单个数据库进行开发,在小型项目中是完全能够满足需求的。 但是,当我们牵扯到像淘宝、京东这样的大型项目的时候,单个数据库就难以承受用户的CRUD操作。 那么此时,我们就需要使用多个数据源进行读写…

centos上使用yum安装redis

使用yum install -y redis时报错,没有找到安装包 解决办法: 下载fedora的epel仓库,yum添加epel源:执行 yum install epel-release 回车 再次:yum install redis 回车 开启redis服务 service redis star…

C语言设计扫雷(保姆级教学)

目录 引入: 游戏思路与逻辑: 游戏具体实现过程 整个程序的大体逻辑: 游戏的执行逻辑: game.h头文件内容: 具体函数讲解 menu(菜单函数) Initboard(初始化棋盘函数&#xff09…

Ubuntu 22.04安装Cuda11.7和cudnn8.6

这篇文章记录了如何在Ubuntu22.04上安装CUDA11.7和cudnn8.6。按照步骤理应可以安装成功。如果还有问题,可以留言。 安装显卡驱动 打开‘软件和更新。 点击附加驱动安装显卡驱动 如果已经安装显卡驱动,请忽略上面的步骤。 安装gcc 新安装的Ubuntu22…

微软 New Bing AI 申请与使用保姆级教程(免魔法)

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 最近的 AI 技术实在火爆,从 OpenAI 的 ChatGPT,到微软的 New Bing,再到百度的文心一言,说明 AI …