《基于 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://www.mzph.cn/pingmian/47765.shtml

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

相关文章

学习分布式事务遇到的小bug

一、介绍Seata 在处理分布式事务时我用到是Seata,Seata的事务管理中有三个重要的角色: TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器…

PHP pwn 学习 (2)

文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中,我们学习了一些PHP extension for C的基本内容,下面结合一…

Open3D Ransac算法拟合点云球面

目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2拟合后点云 前期试读,后续会将博客加入该专栏,欢迎订阅 Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述 RANSAC&a…

【Chatgpt大语言模型医学领域中如何应用】

随着人工智能技术 AI 的不断发展和应用,ChatGPT 作为一种强大的自然语言处理技术,无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成,还是语音识别、计算机视觉等方面,ChatGPT 都有着广泛的应用前景。特别在临床医学领…

pycharm如何debug for循环里面的错误值

一般debug时,在for循环里面的话,需要自己一步一步点。如果循环几百次那种就比较麻烦。此时可以采用try except的方式来解决 例子如下 #ptyhon debug for循环的代码 num[1,2,3,s,4] ans0 for i in num:try:ansiexcept:print(错误) print(ans) 结果如下&a…

HTML+echarts.js实现的炫酷金色风格可视化组件

模板下载地址: 炫酷金色风格可视化组件 (bootstrapmb.com)https://www.bootstrapmb.com/item/14888 一款炫酷金色风格可视化组件,统计图表使用Echarts.js,整体风格采用金黄色看起来很大气,设计是通用型的,可以用作任…

自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍

文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例5.1 典型场景1:前方车辆压线5.2 典型场景2:相邻车道有大型车辆5.3 典型场景3:它车近距离cut in 6. 总结与展望 1. 背景介绍 随着汽车技术的发展,智能巡航…

springboot开发实用篇

一、Mongodb (1)简介 MongoDB是一个开源、高性能、无模式的文档型数据库。NoSQL数据库产品中的一种,是最像关系型数据库的非关系型数据库。 数据库:永久性存储,修改频率极低 Mongodb:永久性存储与临时存…

Cxx Primer-Chap4

表达式可以没有操作符,但一定有操作数:理解表达式中含有多个操作符时涉及操作符的优先级、关联性以及操作数的计算顺序:如果操作符需要的操作数类型不同,则会发生一些默认的类型转换:什么叫Overloaded Operators&#…

跨平台应用进程cpu与内存监控的搭建说明

1. 前言: 随着科技的进步,互联网发展,能网上办理的就网上办理,按装一个app客户端,连接后台服务,只要是有网络就OK.便捷,快速,省事.但随之而来的是pc端上安装的应用越来越多,系统资源越来越不够用.这也一定程度上对应用程序有一定的要求,除了实现其功能外,性能也是需要关注的. …

python如何输入矩阵

使用numpy创建矩阵有2种方法,一种是使用numpy库的matrix直接创建,另一种则是使用array来创建。 首先导入numpy: (1)import numpy (2)from numpy import * (3)import …

【JVM】JVM调优练习-随笔

JVM实战笔记-随笔 前言字节码如何查看字节码文件jclasslibJavapArthasArthurs监控面板Arthus查看字节码信息 内存调优内存溢出的常见场景解决内存溢出发现问题Top命令VisualVMArthas使用案例 Prometheus Grafana案例 堆内存情况对比内存泄漏的原因:代码中的内存泄漏并发请求问…

MenuToolButton自绘控件,带下拉框的QToolButton,附源码

MenuToolButton自绘控件,带下拉框的QToolButton 效果 下拉样式可自定义 跟随QToolButton的Qt::ToolButtonStyle属性改变图标文字样式 使用示例 正常UI文件创建QToolButton然后提升,或者直接代码创建都可以。 // 创建一个 QList 对象来存储 QPixm…

TDC 5.0:多集群统一纳管,构建一体化大数据云平台

近期,星环科技数据云平台Transwarp Data Cloud(简称TDC)5.0版本正式发布,TDC5.0架构屏蔽底层多个TDH集群的差异,采用统一操作模式,新增一个多集群抽象与管理层,能够实现多集群网络互通、跨集群资…

QT纯代码实现滑动开关控件

开关按钮大家应该很熟悉,在设置里面经常遇到,切换时候的滑动效果比较帅气。通常说的开关按钮,有两个状态:on、off。大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度…

dhtmlx-gantt甘特图数据展示

官网文档&#xff1a;甘特图文档 实现效果&#xff1a; 首先需要下载 dhtmlx-gantt组件 npm i dhtmlx-gantt //我项目中使用的是"dhtmlx-gantt": "^8.0.6" 这个版本&#xff0c;不同的版本api或是文档中存在的方法稍有差异 界面引用 <template>&l…

目标检测算法与应用算法 DS集成 接口相关_v0.1

目录 文章目录 目录0. 目标GPS信息、速度、加速度、航向角信息的输出1. 目标检测算法接口1.1 模型相关1.2 检测结果相关 2. 应用算法接口2.1 bool cross_line; //跨线&#xff08;变道压线检测&#xff09;2.2 bool break_in; //闯入&#xff08;目标闯入&#xff09;2.3 bool …

Linux HOOK机制与Netfilter HOOK

一. 什么是HOOK&#xff08;钩子&#xff09; 在计算机中&#xff0c;基本所有的软件程序都可以通过hook方式进行行为拦截&#xff0c;hook方式就是改变原始的执行流。 二. Linux常见的HOOK方式 1、修改函数指针。 2、用户态动态库拦截。 ①利用环境变量LD_PRELOAD和预装载机…

STM32自己从零开始实操:PCB全过程

一、PCB总体分布 以下只能让大家看到各个模块大致分布在板子的哪一块&#xff0c;只能说每个人画都有自己的理由&#xff1a; 电源&#xff1a;从外部接入电源&#xff0c;5V接到中间&#xff0c;向上变成4V供给无线&#xff0c;向下变成3V供给下面的接口&#xff08;也刻意放…

每日一练 - BGP 路由表中的团体属性

01 真题题目 下面一台路由器的输出信息&#xff0c;关于这段信息描述正确的是? A.目的网段 1.1.1.0/24 所携带的团体属性值是 NO-EXPORT&#xff0c; 表明该路由条目不能通告给任何 BGP 邻居 B.目的网段 1.1.1.0/24 所携带的图体属性值是 NO-EXPORT&#xff0c; 表明试路由…