当前位置: 首页 > news >正文

docker版jxTMS使用指南:数据采集系统的高可用性

本文讲解4.6版jxTMS中数据采集系统的高可用性,整个系列的文章请查看:4.6版升级内容

docker版本的使用,请查看:docker版jxTMS使用指南

4.0版jxTMS的说明,请查看:4.0版升级内容

4.2版jxTMS的说明,请查看:4.2版升级内容

4.4版jxTMS的说明,请查看:4.4版升级内容

standalone构型转为了分布式构型,就自然而然的会出现一个高可用性的问题。传统上,高可用性有三种,即所谓的负载均衡、双机热备、双机冷备。

但这三者的概念以今天的技术水平来看都很过时了,所以笔者作了自己的修正:分布式系统、在线热备、在线冷备。

三者的共性都是通过增加冗余的备份机以在某台正在提供服务的服务器失效后能自动的由备份机接管服务,最大化的减少服务中断时间、尽可能的提高服务的可用性。

三者的区别是:

1、分布式系统,所有机器同时工作,无分主次

优点是所有服务器同时提供服务,浪费率低,抗冲击性好,服务宕机时影响面小,理论上的故障间隔最小。

缺点是系统需要专门的调度管理将服务请求较平均的分散到所有服务器上,这就需要复杂的服务跟踪、管理与调度,建设成本会高很多。此外,提供的最好是无状态服务,这样就不需要考虑服务交接时的复杂性来。

但这样的要求对业务的限制太多、效率太低;而如果提供有状态的服务,那就需要采取多种技术手段来确保状态的维持,如基于状态/连接的服务分发、采用高速缓存、服务事务化等等。

总的来说,分布式的优缺点都比较鲜明,需要针对应用的特点进行细致的调教,一般都是高投入的专用系统,不太适合jxTMS所期望的低成本、通用性与开箱即用的要求。

2、在线热备,分为主机与备份机,主机工作备份机不工作,在主机故障时,备份机可直接接管服务

3、在线冷备,分为主机与备份机,主机工作备份机不工作,在主机故障时,备份机丢弃现有服务请求后接管服务

可以看出,热备与冷备的区别在于对待正在处理服务请求的响应机制:热备需要从机保持切换前的主机服务状态;冷备则直接丢弃主机的服务状态,从零开始提供服务。

热备可以用高速缓存甚至数据库来实现,但其缺点和分布式是一样的:阶段性的中间数据全部要放入缓存以实现服务的事务化,性能影响较大而且服务编写较为复杂【自然成本就高】。

冷备则非常简单,明确所提供的服务存在失效的可能,这样在请求方请求服务超时或返回无效请求后,再次请求即可,即用会话的复杂性来对冲服务的可靠性承诺。

想实现完美的带状态接管,必须使用持久化的高速缓存完整记录服务请求、服务状态并将服务事务化,以及服务的请求异步化,这都会导致成本高、性能低且应用编写繁琐。

综上,我们可以用两个公式来概括这三者的关系:

在线热备 = 在线冷备 + 服务事务化基础上的状态同步
分布式 = 在线热备 + 服务管控与调度

相比来说,在线冷备实现起来简便、可靠、坚固,适用面广、技术门槛低、系统开销也小的多。缺点就是服务存在失效的可能,所以需要将服务请求会话化,即保留服务请求的现场,检查服务请求的执行结果,当请求失败后重新发起服务请求或进行容错处理。但相对复杂的服务状态同步来说,会话管理的技术难度与实现成本都非常低。

考虑到这一点,所以jxTMS依托catalogService实现的就是在线冷备方案。

但docker版jxTMS所展示的数据采集与处理系统却自然而然的成了在线热备。这是基于如下两点:

1、数据采集是天然的无状态。即本次所接收到的数据,和之前接收到的历史数据无关

2、前面强调过多次的,通过数据总线将数据采集与数据应用切分开来。所以,哪怕数据应用的部分是有状态的,但因为是和采集部分隔离的,所以不会影响到数据采集与处理的无状态性

注:数据采集系统的热备并不意味着主机故障到从机接管之间的数据不会丢失。但由于目前jxTMS的数据采集主要通过mqtt推送,而mqtt也是具备数据保持能力甚至数据持久能力的,如果调整这方面的配合,以及优化服务保活间隔的设置,是可以实现最小化的数据丢失率的。甚至,理论上,是可以以部分性能的损失为代价实现0数据丢失的服务接管能力

在线热备的关键性支撑

1、服务的状态检测

catalogService提供了保活机制,即各服务必须先注册,注册成功后必须以可自定义的间隔向catalogService发送keeplive消息。

当超过三次未收到当前已注册的服务的keeplive消息,catalogService即认为该服务已经失联,就会将其从目录中删除掉,其它服务就可以再次注册了。

2、一致性保证

主机宕机,从机接管,中间出现数据丢失是可以接受的【取决于业务需要与零丢失所需成本之间的平衡】,但系统必须保证主从的一致性。即从机的行为不能与主机行为不一样。

而影响主从一致性的是三个方面:

  • 代码的一致性,这是通过代码管理、版本管理来实现的,不在本文讨论范围之内

  • 配置的一致性,以前的docker版jxTMS主要采用本地文件的配置方式,这时想要保持配置的一致性,只要保证两服务器上的配置文件一致即可。但目前已经将配置逐步迁移到基于数据总线,所以配置一致性的保持就较为复杂了【需要考虑前文所提到的水平切片、单服务器上运行多种服务等等】,但由于笔者目前也没有太复杂的应用场景,所以目前这一部分比较简单,并没有对请求方以及请求参数做任何的识别与处理

  • 管理命令执行结果的一致性,以前的docker版jxTMS主要通过服务来进行管理,但我们正在讨论的在线备份方案中从机根本就没有注册到系统中来,所以管理命令或者迁移到基于数据总线来做;或者还是通过服务发送给主机来执行,但在主机执行完毕后需要通过数据总线广播给从机进行同步。笔者更倾向于后者

注1:目前的数据总线中已经实现了缓存功能,所以管理命令执行结果的一致性可通过主机执行完管理命令后刷新相应的缓存即可实现。即管理命令的执行结果需要存放到数据库中或基于数据总线上的缓存中,这就自动实现了主从在一致性方面的实时同步

注2:这里只讲了系统层面的一致性,还有应用层面各功能模块的一致性【本质上其实就是工作数据的同步】。而各功能模块的一致性保证,本质上就是热备与冷备的区别,所以其基本原则是:如果应用层面的一致性难以保证,那就应以冷备模式工作

3、检测到主机失联后,从机立即接管服务

当主机所注册的服务因为超时没有keeplive而被catalogService从目录中被删除掉后,以同样间隔持续向catalogService进行注册的从机再次注册时,catalogService就会批准本次注册,然后从机会接收到注册通过的响应,就可以执行接管服务的准备动作了。

服务接管

从机的服务接管主要包括两部分内容:

1、主机失联后会取消对服务地址的监听,而从机在接管服务后会向消息系统注册对服务地址的监听

每个服务都有一个服务监听地址:{服务类型}.{服务名}。已经完成注册的主机会监听该地址,一方面通过消息系统为客户提供服务;另一方面则是通过该地址接受jxTMS主系统发出的管理命令。

2、执行所有受主从切换影响的模块注册的模块相关的服务开关命令

有的功能模块不受主从切换的影响,始终处于就绪待命状态,如用户授权、设备等模块;有的模块则受主从切换的影响,如mqtt模块,只有主机才能从mqtt服务器订阅主题接收数据,从机则不能订阅【包括主机失去和MQ的连接但没有失去到mqtt的连接这种极端情况,当出现这种情况时会切换到从机,应取消订阅】;又如site站点模块,从机是不会接收数据的,所以必须停止通过钉钉发送站点失联告警。

这些会受到主从切换影响的模块在启动时需要注册两个事件通知:注册到catalogService、和catalogService失联。我们以mqtt模块来举例说明,其相应的代码是:

#__init__函数中
#允许订阅有两种情况:没有启动服务以及启动服务并注册到了服务中
self._permit = False
mainService.registerConnectDual(self._name, self.permit, self.refuse, informDual=self._checkServiceState)#下面是三个事件响应函数与状态通知函数#服务是否启动
def _checkServiceState(self, state):if not state:#服务没有启动需要允许连接self.permit()#注册到catalogService
def permit(self):self._permit = Trueif self._connectted:for topic in self._mqttServerTopic:self._subscribe(topic)#和catalogService失联
def refuse(self):self._permit = Falseif self._connectted:for topic in self._mqttServerTopic:jxGo.log('info', f'mqttClient[{self._name}] unsubscribe topic[{topic}]')self._client.unsubscribe(topic)

上述代码已经非常直白了,所以我们介绍一下mainService模块中的registerConnectDual函数、

registerConnectDual(cls, connectDual, disconnectDual, delaySeconds=5, informDual=None)

注册主服务的连接与失联事件响应函数

参数:connectDual:注册到catalogService的事件响应函数,无参disconnectDual:和catalogService失联的事件响应函数,无参delaySeconds:延时多少秒后通知是否启动了服务informDual:服务状态通知函数,delaySeconds秒被调用
返回值:无
说明:informDual的签名是:informDual(state)state--服务是否启动,True:启动;False:未启动

设置informDual函数的原因在于,所有的功能模块,如mqtt,都必须在服务启动前完成初始化工作。这是由于jxTMS的服务会启动一个无限循环来实现注册与保活。

所以呢,所有的功能模块在初始化时都是不知道是否启动了服务的。启动了服务,自然会通过connectDual来切换到工作状态,但如果没有启动服务,又需要切换到工作状态才是,而这就需要informDual通过延时进行检测并发出通知了。

注意

本文所讲述的在线备份,属于系统部分失效后的抢救性措施。而在线备份能否抢救成功,关键是主从的一致性保证。而热备所要求的严格一致,需要的成本太高,只适合特定应用场景下的、高投入的自用系统。

jxTMS首先考虑的是低成本下的通用性,是以低的建设成本、低的开发成本、低的维护成本来快速构建自己的应用系统,所以提供的是简单、可靠、坚固的在线冷备模式,只有天然无状态的,如数据采集与处理系统,可工作于在线热备模式。

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld

相关文章:

docker版jxTMS使用指南:数据采集系统的高可用性

本文讲解4.6版jxTMS中数据采集系统的高可用性,整个系列的文章请查看:4.6版升级内容 docker版本的使用,请查看:docker版jxTMS使用指南 4.0版jxTMS的说明,请查看:4.0版升级内容 4.2版jxTMS的说明&#xff…...

vue如何禁止通过页面输入路径跳转页面

要禁止通过页面输入路径跳转页面,你可以使用Vue Router的导航守卫(navigation guards)来拦截导航并阻止不希望的跳转。 下面是一种常见的方法,你可以在全局导航守卫(global navigation guards)中实现这个功…...

mac,linux环境的基础工具安装【jdk,tomcat】

安装 一 linux环境一)、JDK安装卸载: 二)、 tomcat 安装1、[下载](https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.63/bin/apache-tomcat-8.5.63.tar.gz)后,在目录 /usr/local/tomcat下,解压缩2、配置tomca…...

chrome窗口

chrome 窗口的层次: 父窗口类名:Chrome_WidgetWin_1 有两个子窗口: Chrome_RenderWidgetHostHWNDIntermediate D3D Window // 用于匹配 Chrome 窗口的窗口类的前缀。 onst wchar_t kChromeWindowClassPrefix[] L"Chrome_WidgetWin_…...

某快递公司Java一面

1.平衡二叉树和红黑树的区别? 平衡二叉树是一种二叉搜索树,其左子树和右子树的高度差不超过1,以确保在最坏情况下的查找效率是O(log n)。而红黑树是一种自平衡二叉搜索树,通过引入颜色标记(红色和黑色)来维…...

【C++ Primer Plus学习记录】指针——声明和初始化指针

指针用于存储值的地址,因此,指针名表示的地址。*运算符被称为间接值或解除引用运算符,将其应用于指针,可以得到该地址处存储的值。 例如,假设manly是一个指针,则manly表示的是一个地址,而*manl…...

切换至root用户时,命令提示符颜色为白色,如何修改?

当我切换至root用户时,发现命令提示符里的内容全部为白色,如图所示: 这让人看着不愉快,上网先搜索下解决方案:【切换到 root 账户字体全是白的,怎么改颜色啊】- 百度贴吧,但是这个解决方案只是…...

设计模式——17. 状态模式

1. 说明 状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态发生改变时改变其行为。状态模式将对象的状态封装成不同的状态对象,并将状态切换时的行为委托给当前状态对象。这样,对象在不同状态下具有不同的行为,而无需在对象本身中使用大量的条件语…...

系统架构设计:14 论软基于架构的软件设计方法(ABSD)的软件开发

目录 1 基于架构的软件设计(ABSD) 2 基于架构的软件开发过程 2.1 架构需求过程 2.2 架构设计过程</...

如何在 Spring Boot 中进行文件上传

在 Spring Boot 中进行文件上传 文件上传是Web应用程序中常见的功能之一&#xff0c;它允许用户将文件从客户端上传到服务器。Spring Boot提供了便捷的方式来处理文件上传&#xff0c;并且整合了Spring框架的强大功能&#xff0c;使文件上传变得相对简单。本文将介绍如何在Spr…...

Python 图形化界面基础篇:将应用程序打包为可执行文件

Python 图形化界面基础篇&#xff1a;将应用程序打包为可执行文件 引言 PyInstaller 简介步骤1&#xff1a;安装 PyInstaller 步骤2&#xff1a;创建 Python GUI 应用程序步骤3&#xff1a;使用 PyInstaller 打包应用程序 完整示例代码解释结论 引言 在开发完一个图形用户界面…...

Android 13.0 蓝牙遥控器确认键弹不出输入法的解决方法

1.概述 在android13.0设备定制化开发时,遥控器是使用红外遥控器,也有使用蓝牙遥控器的,所以出现的问题不一定相同,今天遇到个问题就是蓝牙遥控器在输入数据时弹不出输入法的问题 首选排除输入法的问题,安装其他的输入法,也是同样的问题,这样就确定是系统EditText控件相关…...

spring boot面试50问

目录 前言&#xff1a; 1. 什么是 Spring Boot&#xff1f; 2. 为什么要用SpringBoot&#xff1f; 3. SpringBoot与SpringCloud 区别&#xff1f; 4. Spring Boot 有哪些优点&#xff1f; 5. Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1…...

条例24~25(设计与声明)

条例24 若所有参数皆需要类型转换&#xff0c;请为此采用非成员函数 有时候让类型内成员函数支持隐式类型转换是不妥善的。比如当我们想在类内实现operator *&#xff08;&#xff09; 模拟乘法的时候。通常情况下表现良好&#xff0c;但若你想额外实现混合式运算。例如 int…...

Spring5应用之事务处理

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…...

Python 中最常用的4种股票价格移动平均方法(三)

一、简介 移动平均线是各级交易者和投资者最广泛使用的技术指标之一。它们通过计算特定时期内的平均价格来帮助消除股票价格的固有波动性。移动平均线计算起来很简单,但也有更复杂的形式,旨在捕捉市场的更多细微差别。 这个由四部分组成的系列将讨论总共 4 种不同的移动平均方…...

Mybaits缓存踩的坑

记Mybaits缓存踩的坑 1.问题提出 最近开发一个记录操作前后修改内容的功能&#xff0c;获取修改前数据比较简单&#xff0c;直接从数据库获取&#xff0c;记录修改后的功能也比较简单&#xff0c;直接将用户修改的内容封装成po对象&#xff0c;然后两个比对就可以了&#xff…...

全国工商注册数据库的作用

随着经济的发展和市场竞争的加剧&#xff0c;越来越多的人开始关注公司的工商信息。这些信息不仅可以帮助人们了解公司的基本情况&#xff0c;还可以为投资者、合作伙伴、员工等提供决策依据。 工商数据库提供了全国范围内企业的基本信息。这些信息包括企业的名称、统一社会信用…...

【Linux】NTP时间服务器Chrony配置详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…...

今年的秋招面试,确实有点难。

不可否认的是&#xff0c;今年秋招确实有点难 从今年的形势来看&#xff0c;好的 offer 都掌握在少数人的手里&#xff0c;想要秋招找到理想的工作&#xff0c;要么学历好&#xff0c;要么技术功底很扎实&#xff0c;这两样都不占的话&#xff0c;就业压力就会比较大。 如何从…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...