《基于 Kafka + Quartz 实现时限质控方案》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 背景技术
    • 发明目的
    • 具体方案
      • 消息中心的搭建
      • 构建时限质控核心服务
      • 实现时限质控辅助板块
      • 展示一些实际案例
      • 流程图:时限质控任务生成
      • 流程图:时限质控任务关闭
      • 时限质控系统总结
    • 方案特征
    • 总结陈词

CSDN.gif

写在前面的话

本篇文章分享一下博主所在公司的时限质控系统的解决方案。
主要是基于Kafka + Quartz实现,由于涉及公司隐私,内容主要以方案介绍为主,有需要探讨的可以留言。
好,让我们开始。


背景技术

1、医院质控信息系统,要求医护人员在日常工作中,需按时完成相应的病历书写任务,同时必须遵循时效性上的要求,该任务的完成情况,通常也会被加入绩效考核评估结果。针对上述工作要求,从而衍生的功能模块也称为时限质控模块。时限质控主要是对针对入科、取消入科、转科、取消转科、出院、取消出院、病情变化、完成病历书写等业务场景,根据对应的病历类型是否完成书写任务,以及是否满足时效性要求,进行提醒、统计和评分。通过时限质控提醒,医护人员可以更直观的接收到病历的书写的时限,并在时限内完成病历,医务部则可以通过有无超时书写病历来进行质控评分。
2、传统的时限质控系统,通常采用“程序定时器轮询”或“数据库触发器”实现,两者在实现时限质控功能的同时,也都存在若干缺陷。
2.1、程序定时器轮询方式,通过定时服务不断轮询关键业务数据表,当查询到符合要求的数据则触发时限质控,该方式无论从配置和实现上看都不灵活,同时耗费服务资源,效率较低。
2.2、数据库触发器方式,主要通过监听程序执行的DML语句以做出相应操作,但触发执行的逻辑功能比较单一,只适合于简单的场景,无法运行复杂程序。


发明目的

本方案的发明目的是基于Kafka + Quartz 实现低耦合、易扩展、高及时性和高灵活性的时限质控方案。通过预先针对时限质控规则进行规则维护、事件管理、质控类别维护等,利用相应的触发机制,生成或关闭相应任务,最终实现时限质控要求。
本方案摒弃了传统的程序定时器轮询或数据库触发器实现方式带来的缺陷,将时限质控涉及的临床业务节点定义成一个个事件,事件交由具体业务代码在完成相应操作的同时触发消息中心,而时限质控的生成任务和关闭任务的服务,仅需要被消息中心对应事件主题订阅即可实现。
各业务系统和时限质控系统只需要专注于自身业务逻辑,模块之间的通讯统一交由消息中心完成,最终达到模块解耦的目的。引入消息中心和事件驱动机制后,时限质控的流程是这样的,入院模块只需要关注自身逻辑,完成入院逻辑后,调用消息中心,消息中心负责触发时限质控的生成任务服务,生成相应文书的书写任务并分发给指定用户。当用户完成相应病历文书的书写工作时,病历书写模块在完成自身逻辑后,也会触发消息中心,消息中心也会负责订阅时限质控的关闭任务服务,针对用户的任务按实际时限进行处理。
可以看出,整个过程中,时限质控系统和各个业务系统都是充分解耦的,同时事件主题的发布/订阅模式,可以不仅仅局限于时限质控板块,也适用于其他更多的业务需求。


具体方案

消息中心的搭建

采用 Kafka + Zookeeper 集群作为核心中间件,时限质控涉及的相关临床业务事件作为 Topic,院内的HIS和EMR系统作为消息生产者,时限质控服务作为消费者,整体采用Kafka的发布订阅模式。
1、事件模块准备步骤:
分析医院信息系统中涉及与时限质控相关的临床业务,将这些临床业务定义为一个个事件,事件包含事件编号、事件名称、病历文书类型、以及其他关键业务属性等。当信息系统中的临床业务触发后,可以通过消息中心,快速通知或触发其他系统执行相应操作,这个过程是联动并且解耦的。
2、生产者模块实现步骤:
创建生产者模块服务,该服务提供对外开放接口。当消息中心被调用后,执行生产者校验功能,包含利用XSD进行消息入参格式校验、依据消息唯一编号进行消息查重校验、以及验证事件的有效性等。校验通过后,利用生产者单例去完成消息发送,具体就是以指定的事件编号作为Topic,投递消息到Kafka。
3、消费者模块实现步骤:
创建时限质控的消费者组服务,该服务会不断从集群上拉取消息,当拉取到订阅消息后,将启动新的工作线程进行相应的逻辑处理,具体逻辑是调用时限质控核心服务,生成或关闭相应任务。

构建时限质控核心服务

时限质控核心服务主要负责时限质控相关任务的生成和关闭,该服务订阅了消息中心相应主题,当相应业务主题被触发时,消费者将调用时限质控核心服务。
时限质控核心服务包含生成任务服务、关闭任务服务、和任务中心三大板块。
1、生成任务服务的实现步骤:
1)解析消息入参,进行合法性校验,提取关键信息,例如:事件主题、患者信息、医生信息等,存储至临时变量;
2)根据事件主题读取相关时限质控规则配置信息,根据规则构建相应任务主表,任务属性包含但不限于“单次/连续配置”、“超时配置”、“关闭配置”、“提醒配置”、“触发配置”等等;
3)读取上述规则配置中的接收人配置,使用入参传递的患者和医生信息,动态替换,得出相应接收人列表;
4)利用 Quartz 产生生成时限质控任务的相应定时器,当定时器符合触发要求时,将调用任务中心进行后续操作;
2、关闭任务服务的实现步骤:
1)解析消息入参,进行合法性校验,提取关键信息,例如:事件主题、患者信息、病历类型等,存储至临时变量;
2)根据事件主题读取相关时限质控规则配置信息,根据病历类型和患者信息,判断任务是否达到完成标准;
3)若符合标准,则对任务进行关闭操作,并根据完成的时间和情况对任务状态进行更新;
4)利用 Quartz 产生关闭时限质控任务的相应定时器,当定时器符合触发要求时,将调用任务中心进行后续操作;
3、任务中心的实现步骤:
1)任务中心是最终控制时限质控任务生成和关闭的枢纽,质控核心服务中的生成任务和关闭任务服务,仅触发相应定时器,符合要求时,触发任务中心,任务中心也负责与前端的交互。
2)当任务生成服务的定时器达到触发要求,任务中心将根据预置的任务生成配置模板和相应业务入参信息,生成相应的任务,构建时限质控任务细表数据,并使用 WebSocket 等技术推送至前端,至此,任务生成完毕。
3)当任务关闭服务的定时器达到触发要求,任务中心将根据患者信息预置的任务关闭配置模板,查找符合要求的待关闭任务列表,更新时限质控任务细表数据,使用 WebSocket 等技术推送至前端,对已产生的任务进行关闭操作,至此,任务关闭完成。

实现时限质控辅助板块

1、实时推送
时限质控任务的生成和关闭,都要和用户前端进行实时交互,当任务产生的时候,需要告知用户前台界面,并实时展示出来;当任务关闭的时候,也需要告知用户前台界面,将相应任务进行删除处理。
这种效果,可以采用诸如 WebSocket 等的长连接推送模式,在浏览器和服务器完成一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。
使用 WebSocket 等推送模式,要考虑其高可用性,建立完善的功能机制,包含但不限于如下:心跳机制、断网自动重连、消息补发机制、离线消息处理、历史消息查询、消息的压缩机制等。
2、任务看板
在医护人员登入之后的前台主界面,需要一个专门的组件,用于时限质控信息展示,该组件可以是一个独立的使用iframe嵌套的html界面。
该组件可以用于展示该用户未完成的时限任务,例如:如XX患者,首次病程需在入院后8小时内完成(超时x小时/x小时候超时),用户点击该任务,即可跳转到该病人的病历书写界面,进行病历的创建。
当任务关闭的时候,前台界面收到推送消息,也可以在该组件针对该任务做出响应,例如:添加删除线效果。
3、质控统计
时限质控的数据表,将会收集到所有产生的用户任务的处理情况,需要针对此类数据,做出统计分析功能,才可以利用时限质控带来的效果,例如用于作为输出报表或作为绩效扣分的依据。
质控系统的时限质控统计界面,应该包含但不限于如下功能:按不同维度查询各类数据、导出各类报表、生成统计图表,针对质控情况进行评分,质控任务的闭环信息查看,以及对后续情况进行预测分析。
统计页面的关键信息包含但不限于:时限任务的基本规则属性、参与人员、开始时间、完成的时间、超时完成/超时未完成的时间、任务完成状态等,方便质控员清晰地看出病历的整体书写情况。
4、评分判定
时限质控的最终目的是为了规范医疗人员的日常行为,引导其满足及时性要求,因此,通过需要与绩效评分挂钩。
在质控的方案管理界面通过将评分规则与时限质控规则进行绑定,在时限质控统计界面,对医生超时完成/超时未完成的时限规则进行快速评分。
5、数据修正与定时补推
借助消息中心事件驱动机制实现的实现的时限质控效果,在达到解耦灵活的同时,我们也需要充分考虑由于消息中间件稳定性引发的数据丢失,以及对应的处理方案。
针对时限质控的数据丢失,可以考虑增加数据修正功能。在质控的数据修正界面,记录了触发失败的时限规则,可以对其进行一个重试操作,还可以对时限任务进行关闭操作,保障了当有配置错误或程序问题导致的任务提醒或关闭异常,进行一个手动的修复。
与此同时,也可以考虑增加定时补推机制,利用定时服务,定时去判断是否存在应该生成但是没生成的,例如通过日志捕捉业务方触发了相关埋点,这种情况给予生成;判断应该关闭但是没关闭的,例如已经书写了病历,但任务没被关闭,针对这种情况,直接将任务给予关闭。
6、统一定时规则配置
提供统一的质控任务定时规则配置界面,不依赖于业务方,针对单次指定时间、连续固定时间、连续不规则频率等定时任务产生规则,进行统一的配置。针对任务关闭,也支持设置业务根据组合Key、互斥关闭等高级功能。

展示一些实际案例

案例1:关于“首次病程记录在入院8小时内完成”的时限质控流程
1)护士为患者办理“入院登记”,该业务的后端接口,将在完成相应入院逻辑后,触发消息中心的“入院”事件;
2)由于该“入院”事件,订阅了“时限质控 - 生成服务”,当该事件对应主题,有消息产生时,消息中心消费者将拉取相应消息,帮触发该时限质控服务;
3)该“时限质控 - 生成服务”,会产生相应的病历文书的时限质控书写任务,其中包含“首次病程记录在入院8小时内完成”,同时利用消息入参信息,查询到该患者的主管医生,通过 WebSocket 等实时推送机制,将产生的时限质控任务详情推送给指定医生前端系统,进而在该医生的工作桌面上,将接收到这一推送消息,在任务看板等展示组件中,生成“首次病程记录在入院8小时内完成”任务;
4)当该主管医生完成了该患者的首次病程记录的书写,在点击“确认完成”按钮的同时,将在完成相应书写任务完成的逻辑后,还将触发消息中心的“完成病历书写”事件;
5)由于该“完成病历书写”事件,订阅了“时限质控 - 关闭服务”,同样的,在该事件对应主题,有消息产生时,消息中心消费者将拉取相应消息,帮触发该时限质控服务;
6)该“时限质控 - 关闭服务”,将从消息入参里,提取该份病历的患者基本信息、病历类型等元素,进而判断是否关闭已产生的病历书写任务,若符合关闭要求,则根据完成时间针对已产生任务做出时效性评价,同时,通过 WebSocket 等推送机制,将关闭任务的信息推送至指定医生的前端系统,做出相应处理,例如自动关闭该任务。

流程图:时限质控任务生成

image.png

流程图:时限质控任务关闭

image.png

时限质控系统总结

一种基于事件驱动的时限质控系统,包括如下步骤:
1、业务系统异步触发消息中心的指定事件埋点;
2、消费者服务从消息中心拉取消息,触发时限质控服务;
3、时限质控服务根据事件类型和规则配置,判定任务操作是生成还是关闭,以此生成对应的定时器;
4、定时器满足触发条件后,调用任务中心服务,生成或关闭对应的任务,并推送至用户前台进行相应展示;


方案特征

1、基于Kafka + Quartz 实现时限质控方案:
本方案采用事件驱动架构,借助事件消息的通讯作为基础,构建完善的时限质控系统。摒弃了传统的程序定时器或数据库触发器实现方式带来的缺陷,将时限质控涉及的临床业务节点定义成一个个事件,事件交由具体业务代码在完成相应操作的同时触发消息中心,时限质控的生成任务和关闭任务的服务,仅需要被消息中心对应事件主题订阅即可实现,真正做到了低耦合、高内聚的模块化设计。
同时,利用 Quartz 作业调度框架,实现定时任务生成与关闭的效果。简化了定时任务的管理和调度,允许开发人员定义各种不同类型的任务,并在指定的时间点或间隔触发它们的执行。Quartz 提供了可靠的任务调度机制,确保任务按照预定的计划运行,并具备容错和持久化的能力,即使在应用程序重启后也能保持任务的状态。
2、时限质控任务的易扩展:
由于底层基于事件驱动架构实现,若需要增加其他相同或不同业务场景下的时限质控规则,无需修改任何时限质控服务代码,业务系统至多仅需要触发相应的消息中心事件埋点,订阅对应的时限质控服务,针对任务的基本属性进行配置即可实现。完全做到灵活便捷的扩展,让时限质控服务与业务系统解耦。


总结陈词

上文介绍了博主所在公司的《基于 Kafka + Quartz 实现时限质控方案》方案。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif

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

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

相关文章

OpenCv 如何在 Java 中使用

Java 项目引入 OpenCv 环境准备OpenCv介绍下载Maven 安装动态链接库 完成 环境准备 JDK 8 OpenCv 4.0.0 Maven 3.9 Windows 11 OpenCv 介绍 OpenCV(开源计算机视觉库)是一个功能强大的计算机视觉和机器学习库。它提供了广泛的工具和算法,用…

jquery实现文字点选验证码

jquery实现文字点选验证码 git地址:点击获取源码 一、功能说明(文字点选验证码) 词组库内存在大量3~6字随机词组,从词组库内随机找出一组词组,随机展现在显示区点击按钮,弹出验证码区域将词组内的随机数量…

4. docker镜像、Dockerfile

docker镜像、Dockerfile 一、docker镜像1、镜像介绍2、镜像核心技术 二、Dockerfile定制镜像1、Dockerfile使用流程1.1 编写Dockerfile1.2、构建镜像1.3 创建容器测试镜像定制操作 2、Dockerfile常用指令 一、docker镜像 1、镜像介绍 分层的文件系统 优势:节省空间…

vue3前端开发-小兔鲜项目-封装一下产品展示模块组件

vue3前端开发-小兔鲜项目-封装一下产品展示模块组件!因为这种产品展示信息的模块组件,后面我还会在其他的页面内反复使用到,所以,使用模块化开发的思路,把它单独设计成一个组件,这样可以代码复用。以后在其…

一建备考,五步形成闭环学习!

一建备考从7月份到考前是大部分人焦虑的时候,因为基础阶段结束,开始成套做真题了,第一遍做真题很多人分数都不太理想,很多同学直接失去信心,开始emo,这都是只听课不做题的结果。 现在很多同学都是这种情况…

STM32智能家居电力管理系统教程

目录 引言环境准备智能家居电力管理系统基础代码实现:实现智能家居电力管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居电…

【单片机毕业设计选题24072】-基于单片机的智能停车场管理系统

系统功能: 1.根据RFID卡卡号判断新老用户,老用户不计费直接放行,新用户放行时显示计费结果 2.显示屏显示车位剩余数量 3.检测车位有车亮红灯,无车亮绿灯,能够实现车位诱导 5.车辆出停车场时,能根据停车时间计算停车…

【香橙派】Orange pi AIpro开发板使用之普通照片转换为卡通

前言 最近有幸收到一份新款 OrangePi AIpro 开发板,之前手里也捣鼓过一些板子,这次尝试从零开始部署一个简单的后端服务。OrangePi AIpro 采用昇腾AI技术路线,具体为4核64位处理器AI处理器,可配16GB内存容量,各种复杂应…

Facebook Dating:社交平台的约会新体验

随着社交媒体的普及和技术的发展,传统的社交方式正在经历革新,尤其是在约会这个领域。Facebook作为全球领先的社交平台,推出了Facebook Dating,旨在为用户提供一个全新的约会体验。本文将探讨Facebook Dating如何重新定义社交平台…

c语言题目之打印单身狗

文章目录 一、题目二、思路三、代码实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 二、思路 第一步 首先这里先了解两个有关于位操作符异或的知识点 ,异或操作符的规则是相同为0,相异为1 。 通过上面我们可以得…

双非一本嵌入式方向怎么学?

双非一本(非“985”和“211”工程重点建设的本科院校)的学生在学习嵌入式方向时,可以通过以下步骤和策略来系统地学习和提升自己。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学…

哈喽GPT-4o,程序员如何通过GPT-4o保护自己的合法权益

目录 一、法律研究Prompt:派遣合同和劳务外包合同有什么区别?详细说一下在被裁员时的区别? 二、法律条文检索Prompt:检索《劳动合同法》,以下情况属于第几条,如果公司进行技能考试,并以技能考试…

嵌入式物联网在医疗行业中的应用——案例分析

作者主页: 知孤云出岫 目录 嵌入式物联网在医疗行业中的应用——案例分析引言1. 智能病房监控1.1 实时患者监控系统 2. 智能医疗设备管理2.1 设备使用跟踪与维护 3. 智能药物管理3.1 药物分配与跟踪 4. 智能远程医疗4.1 远程患者监控与诊断 总结 嵌入式物联网在医疗行业中的应…

Rust Result 与可恢复的错误

Result 与可恢复的错误 大部分错误并没有严重到需要程序完全停止执行。有时,一个函数会因为一个容易理解并做出反应的原因失败。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。 回忆…

3112. 访问消失节点的最少时间 Medium

给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点&#xff0…

华清数据结构day3 24-7-18

基于昨天代码增加增删改查功能 zy.h #ifndef ZY_H #define ZY_H #define MAX 100 //最大容量 //定义学生类型 struct Stu {char name[20];int age;double score; }; //定义班级类型 struct Class {struct Stu student[MAX]; //存放学生的容器int size; //实际…

CH552的bootload程序IAP直接对ROM-flash修改数据(未尝试)

手动写bootload程序的可能 1,根据ch552g的使用手册内容查看到 2,在下面的参考文件的IAP文件夹中看到IAP文件 参考 下面程序中并没有跳转到厂家bootload的过程,这是直接通过控制有关的寄存器对FLSH进行直接写入和修改,这样可以认…

格式工厂,将所有的ts文件,合并为mp4

1、下载格式工厂 格式工厂 官方主页 - 免费多功能的多媒体文件转换工具 2、打开软件:视频合并&混流项 3、添加ts文件 4、点击【确定】,回到首页 5、首页中,点击【开始】开始转: 6、完成以后,会播放音乐并且右下…

Mysql中的几种常见日志

引言 本文是对Mysql中几种常见日志及其作用的介绍 一、error log(错误日志) MySQL 中的 error log(错误日志)是一种非常重要的日志类型,它记录了 MySQL 服务器在启动、运行及关闭过程中遇到的所有重要事件、错误信…

从零开始读RocketMq源码(五)Message的消费流程解析

目录 前言 准备 拉取服务和重平衡服务启动 初识PullRequest 重平衡服务 对重平衡资源进行排序 MessageQueue消息队列集合来源 Consumer消费者集合数据来源 确定分配资源策略 执行分配策略 初始化ProcessQueue 初始化PullRequest 内存队列填充PullRequest 消息拉取…