基于Vert.x的实时Web监控系统
zhezhongyun 2025-01-19 01:53 87 浏览
摘 要: 创新性地使用最新的Vert.x框架,利用其异步、非阻塞、实时性、高并发的工作模式,对现有的工业过程监控系统进行全面改造,极大提升了系统的响应速度,实时性得到显著提高,完全满足大量客户端并发的实时请求。
0 引言
工业生产监控系统的Web化[1]已成为标准,客户端只使用浏览器即可实现对监控数据的实时显示,不需要安装各种监控组件,简化了监控系统维护。实现监控数据的实时传输和显示技术也在不断地出现,从传统HTTP请求/响应模式,到AJAX的Comet及HTML5的WebSocket,采用数据推送技术,使得Web监控系统的实时性得到极大提高。然而监控服务器在面对大量客户连接的并发请求时,实时性难以满足。无论JavaEE,还是NET都如此,它们的多线程工作模式是根源所在。为解决此问题,Vert.x框架[2-3]应运而生,它采用全新工作模式,特别适合开发实时性要求极高的系统。
Vert.x是用于下一代异步、可伸缩、并发应用的框架,轻量级的高性能JVM应用平台,适合开发各种移动及企业应用。它彻底解决了业界遭遇C10K问题,即当并发连接超过一万以上时,传统技术会引发暂停。以Tomcat为例,它在超过100个并发长请求就堵塞,而Vert.x可支持超10万个并发请求。
本文采用Vert.x对现有的供热监控系统进行改造,对监控服务器端和客户端进行重构。在服务器端使用Vert.x的Web服务器取代现有Tomcat7,采用Vert.x TCP读取西门子PLC300的监控数据。用户端采用Vert.x的Event Bus Bridge技术,实时接收服务器端监控数据,改造后的监控系统的性能和响应速度比原有系统有显著的提高。
1 Vert.x框架概述
Vert.x核心采用与Node.js相同的事件驱动的异步工作模式,使用单线程的事件循环机制实现高并发的请求处理,而不像传统的服务器采用多线程的模式。
Vert.x的核心组件是Verticle,运行在Vert.x实例中。Vert.x启动后,根据服务器CPU的内核数,自动创建对应的Vert.x实例,并发运行Verticle。
Vert.x采用事件驱动的异步编程模式,通过触发事件以及注册事件处理器完成所有编程任务。Verticle之间不能直接调用,只能发送和接收事件实现协作。
Vert.x的核心是事件总线,Verticle在事件总线发送和接收事件。事件总线是分布式的,能连接服务器和客户端。事件总线支持点对点和发布-订阅模式的事件传输,监控系统中服务器向所有连接的客户端发送监控数据就使用发布订阅模式,使得所有客户端浏览器都能实时接收到监控数据。
2 实时监控系统设计与实现
大连柳树供热公司监控系统现场采用西门子PLC S7-300[4],通过屏蔽双绞线连接到中心机房的核心交换机上,中心监控主机CPU采用志强8核服务器,可并发运行8个Vert.x实例,能支持十几万个并发请求。页面采用最新的Bootstrap模版技术[5],自动适应不同尺寸的屏幕显示,包括手机、平板等。
2.1 读取PLC监控数据TCP编程
西门子S7-300采用TCP FETCH WRITE通信方式[6],该模式下通过TCP协议的Socket,主机可与PLC进行数据交换。
Vert.x内置TCP Client方法,如下是TCP客户端读取PLC数据的代码:
var vertx=require(′vertx′);//获得Vert.x运行实例
var eb=require(′vertx/event_bus′)//获得Event Bus对象
var client=vertx.createNetClient;//创建TCP客户端
client.reconnectAttempts(1000);//设置连接尝试次数
client.reconnectInterval(500);//设置尝试间隔时间
//连接PLC Socket端口,并定义回调函数
client.connect(config.port,config.ip,function(err,socket){//定义接收到PLC数据的事件处理器
socket.dataHandler(function(buffer){
var data=JSON.parse(buffer);
//将接收的数据发布到Evnet Bus上
eb.publish("rtdata.in.receive",{info:data},function(result){});
//使用定时器,每间隔0.5 s发送请求数据指令到PLC
var timer=vertx.setPeriodic(500,function(timerID){sock.write("datain");});
}});
客户端定时发送数据指令,PLC数据到达后,Socket上的事件监听器工作,从回调函数中取得监控数据,并转换为JSON格式,使用总线方法publish发布事件。总线上监听的Web客户端都能同步接收监控数据。Vert.x采用推模式实现数据传输,由Vert.x服务器主动发送数据,不需客户端请求,节省了网络带宽,提高了传输速度,满足了监控系统实时性。监控系统的总体架构如图1所示。
在Vert.x服务器中,可启动多个TCP客户端Verticle,实现多路监测数据的并发读取,如下代码展示主服务器依次启动Http Web Server和TCP Client监控Verticle等实例。
//获得Vert.x实例容器
var container=require("vertx/container");
//启动Web服务器
container.deployVerticle("HttpServer.js");
//启动PLC TCP客户端
container.deployVerticle("TCPClient.js",{port:2201,ip:192.168.1.101});
2.2 监控Web服务器的编程
系统采用Vert.x的服务器模块web-server~2.0,实现功能强大的Web服务器,并使用异步模式接收客户端浏览器的HTTP请求,支持客户高并发的HTTP连接请求,示意代码如下。
var container=require("vertx/container");
container.deployModule("io.vertx~mod-web-server~2.0.0-final",{port:80,host:"localhost",
bridge:true,
inbound_permitted:[
{address:′rtdata.in.receive′},
{address:′rtdata.out.receive′}
]);
Vert.x通过deployModule载入Web模块,Web模块自动将目录/web作为站点发布目录,在/web目录中存储站点的页面文件。
代码中bridge:true表示将服务器端的事件总线延伸到Web客户端,实现服务器和客户端的数据传输。每个Verticle都可以在Event Bus注册事件处理器,以此实现数据的接收和发送。
2.3 监控客户端编程
客户端使用普通的HTML即可,不需要动态页面。为实现与Vert.x服务器的Event Bus通信,客户端页面需要引入Vert.x的Event Bus Bridge的库文件vertxbus-2.1.js。
监控数据显示使用<div>,使用Bootstrap框架布局,将<div>悬浮在图片指定位置。监控客户端页面的数据接收和显示代码如下:
$(document).ready(function{
var eb=new vertx.EventBus(′localhost/eventbus′);
eb.onopen=function{
eb.registerHandler("rtdata.in.receive",function(args){var data=args.data;
$("#rt1010").html(data);});
};});
代码中关键是取得Vert.x的Event Bus对象,通过事件总线提供的vertx.EventBus,使用Javascript创建一个实例即可。如果与服务端的Event Bus连接成功,则eb.onopen回调函数工作。在此方法内,通过Event Bus的registerHandler对指定的地址进行监听,当有此地址的事件event到达时,定义的回调函数function(args)开始运行,参数args为事件中包含的JSON数据,解析出JSON数据,使用jQuery的函数html将数据显示在指定的 <div>元素内,实现监控数据的实时显示。实时监控系统监控界面如图2所示。
3 结论
Vert.x具有的实时通信、全新的异步响应式工作模式和分布式Event Bus等特性,使其必将在实时系统开发中得到广泛应用。与Node.js相比,Vert.x以其性能压倒性的绝对优势,必将推动实时Web的飞速发展,进而引起Web领域颠覆性的革命,彻底淘汰以AJAX为主的Web2.0,引领新的Web发展趋势。
参考文献
[1] 李玉珠,吴敏,徐福仓.基于Web的炼焦实时监视系统设计与实现[J].自动化与仪表,2009(4):1-4.
[2] PARVIAINEN T.Real-time Web application development using Vert.x 2.0[M]. Birmingham-Mumbai: Packt Publishing,2013.
[3] Vert.x[EB/OL]. http://vertx.io/.
[4] 潜立标,杨马英,俞立,等.基于Web和S72300 PLC的远程控制实验室系统[J].浙江工业大学学报,2007(2):73-77.
[5] 陈群.基于ASP.NET AJAX新型Web Scada的设计与实现[J].工业控制计算机,2009(6):42-44.
[6] 赵佳宝,付羽.基于SVG的实时监控流程图实现技术[J].工业控制计算机,2009(6):10-12.
相关推荐
- Python入门学习记录之一:变量_python怎么用变量
-
写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...
- python变量命名规则——来自小白的总结
-
python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...
- Python入门学习教程:第 2 章 变量与数据类型
-
2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...
- 绘制学术论文中的“三线表”具体指导
-
在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...
- Python基础语法知识--变量和数据类型
-
学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...
- 一文搞懂 Python 中的所有标点符号
-
反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...
- Python变量类型和运算符_python中变量的含义
-
别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...
- 从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序
-
在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...
- Python中下划线 ‘_’ 的用法,你知道几种
-
Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...
- 解锁Shell编程:变量_shell $变量
-
引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...
- 一文学会Python的变量命名规则!_python的变量命名有哪些要求
-
目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...
- 更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for
-
src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...
- C++第五课:变量的命名规则_c++中变量的命名规则
-
变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....
- Rust编程-核心篇-不安全编程_rust安全性
-
Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...
- 探秘 Python 内存管理:背后的神奇机制
-
在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- opacity 属性 (32)
- transition 属性 (33)
- 1-1. 变量声明 (31)
