分布式家庭医生服务系统与区块链电子病历*
2020-11-25夏伦腾
吴 飞 张 莉 夏伦腾
(1中南民族大学生物医学工程学院 武汉 430074 2中南民族大学检测与仪器校级工程中心 武汉430074)
1 引言
随着“互联网+医疗健康”发展提速,家庭医生签约成为重要一环。政府大力推行家庭医生制以实现基层首诊、分级治疗目的,可有效缓解大型医院看病难、看病贵问题[1-2]。现在大多数家庭医生服务系统为传统集中式系统,即由1台或多台主计算机组成中心节点集中存储数据,且整个系统所有业务单元集中部署于该中心节点上。集中式系统具较明显缺点:一是中央计算机需要执行所有运算,当终端较多时会导致响应速度变慢。二是如果终端用户有不同需求,需针对每个用户程序和资源进行单独配置,在集中式系统中进行该操作较困难且效率较低、灵活性差[3]。分布式系统是一个硬件或软件组件分布在不同网络计算机上,通过消息传递进行通信和协调的系统。本研究结合区块链和传统关系型数据库开发新型电子病历独立部署在家庭医生服务系统中。经测试成功部署分布式系统,区块链电子病历核心模块成功通过黑盒测试。
2 系统设计
2.1 功能需求
本系统分为用户端、医生端和管理员端,见图1。用户端具有用户注册登录、我的医生、体检预约、查看体检报告、健康咨询、查看健康档案和区块链跳转等模块;医生端具有我的病人、医生登录、病人咨询、查看病人档案、预约设置和区块链跳转等模块;管理端具有用户管理、医生管理、体检设置、统计分析和区块链浏览等模块。
图1 系统需求
2.2 体系架构
2.2.1 概述 本系统由区块链网络、后端客户端和独立前端3部分组成。采用浏览器/服务器(Browser/Server,B/S)架构[4],整体架构为3层设计,主要由Web客户端、Web服务端和数据库3部分组成,见图2。
图2 系统架构
2.2.2 Web客户端 以HTML5页面形式展示在微信公众号上。基于手机浏览器开发,相当于采用传统B/S开发模式,将编写的HTML5页面根据手机尺寸进行调节,然后将页面内嵌到应用程序中,例如通过微信公众号访问HTML5页面。这种开发方式不需要针对不同手机系统分别进行开发,只需要开发一个版本就能在不同手机上正常访问。
2.2.3 Web服务端 采用模型、视图、控制器(Model View Controller,MVC)框架模式进行编写[5]。第1层的模型层主要负责与数据库交互,用来为视图层和数据持久层准备数据并处理从视图层以及数据持久层接收到的数据。第2层的视图层负责显示数据处理结果与状态,从模型层获得数据并展示给用户,相当于提供页面供用户进行人机交互。第3层的控制器层用来控制应用程序和处理视图所发出请求。当控制器接收到用户请求后,将用户数据和模型相映射,然后控制器会选择用于响应的视图把模型更新后的数据展示给用户,即所谓的接、调、存、转。
2.2.4 数据库层 分为Mysql数据库和区块链两部分。使用Fabric搭建区块链网络用来存储用户隐私数据。框架依靠实用拜占庭容错算法(Practical Byzantine Fault Tolerance,PBFT)保证各节点数据的一致性,开发人员在使用框架进行开发的过程中可不必关注区块链底层模块构建,提高开发效率。
2.3 功能架构(图3)
图3 系统功能架构
Dubbo是Alibaba开源的分布式服务框架,其最大特点是按照分层方式进行架构,使各层之间解耦合。使用Dubbo抽取核心业务作为独立服务,逐渐形成稳定服务中心,可用于提高业务复用灵活性,使前端应用更快速响应多变的市场需求。前后端开发人员协议规定交互数据字段,通过Ajax和JSON则可以实现。前后端分离设计模式可使系统实现高内聚低耦合,提高系统维护性。服务器端采用SSM框架设计,为用户端提供健康评估服务、预约服务等接口,用户端通过POST方式向服务器端发送请求。
3 分布式系统
3.1 优势
3.1.1 高度可靠性 数据分散存储在网络中不同主机上,系统中存在数据冗余,当一台机器发生故障时可使用另一台主机的备份。
3.1.2 均衡负载 每台主机可缓存本地最常用数据,不需要频繁访问服务器,减轻服务器负担,减少网络流量。服务器也可对任务进行分配和优化,突破几种系统中央计算机资源紧张的瓶颈。
3.1.3 满足不同需要 用户可根据需要安装不同操作系统、应用软件以使用不同服务,解决集中式计算机系统受限于中央计算机功能问题。基于以上分析,家庭医生服务系统采用面向服务 (Service-Oriented Architecture, SOA)分布式架构可解决模块之间耦合度高、开发效率低、扩展性差、不能灵活进行分布式部署等问题[4]。
3.2 分布式服务框架
3.2.1 概述 当项目规模较小时使用简化增删改查工作量的数据访问框架——对象关系映射(Object Relational Mapping,ORM),达到减少部署节点和缩减成本的目的,但性能扩展困难。当规模逐渐变大单一应用架构无法满足项目需求时,使用Web框架MVC,将应用拆分成数个独立应用,提升效率,但公用模块无法重复利用。当垂直应用越来越多,应用之间交互困难,简单、垂直的应用架构无法满足需求时,可使用分布式服务框架远程过程调用(Remote Procedure Call, RPC)[6]。
3.2.2 分布式应用架构 Dubbo将远程方法调用透明化,只需简单配置,没有任何应用程序接口(Application Programming Interface,API)侵入。软负载均衡及其容错机制可在内网替代F5等硬件负载均衡器,减少成本和单点。本系统中Dubbo采用Spring配置方式,透明化接入应用,无API侵入,Dubbo基于Spring的Schema扩展进行加载[7]。服务提供方称为生产者(Provider),调用远程服务的消费方称为消费者(Consumer)。用户Web、商品Web、订单Web都是生产者部署在A服务器上,用户服务、商品服务、订单服务则是消费者部署在B服务器上,见图4。消费者可远程调用生产者提供的服务。当服务不断增多时消费者对生产者的调用关系越来越复杂,消费者调用服务时需了解由哪台服务器提供,也就是IP(Internet Protocol)地址与服务名称对应关系,需要注册中心实现。本系统使用 Zookeeper注册中心。Dubbo服务生产者在Zookeepper上创建一个临时节点,暴露自己的IP和端口,消费者调用服务时在Zookeepper上找到服务生产者,通过IP和端口对服务进行调用。如果生产者宕机,Zookeepper可通过心跳机制检测到宕机机器,将其IP和服务名称对应关系从服务提供列表中删除,以免消费者误调用。
图4 分布式应用架构
3.3 服务调用流程(图5)
图5 服务调用流程
本系统中将用户管理Web、医生管理Web、病历管理Web、预约管理Web、健康咨询管理Web作为生产者。当服务运行容器启动时服务生产者随之启动,生产者启动后在注册中心(Zookeepper)进行注册。服务消费者启动时向注册中心订阅所需服务,注册中心为其返回服务生产者地址列表,消费者从中调用所需服务。内存中的调用次数和时间统计后定时发送至监控中心。
3.4 服务调用测试
Dubbo管控台可对注册到Zookeepper注册中心的服务或者服务消费者进行管理。通过管理平台可清晰看到服务生产者的机器IP和状态、服务消费者的机器IP和应用名等。服务生产者部署在容器apache-tomcat-7.0,端口20880,进入Dubbo管控台可看到提供者信息。启动服务消费者,进入Dubbo管控台可看到服务消费者信息。生产者成功提供服务,消费者成功调用服务,Dubbo服务框架搭建成功。
4 区块链电子病历设计
4.1 电子病历数据存储方式
传统在万维网上运行的数据库通常使用客户端-服务器架构,权限用户(客户端)可更改存储在中央服务器上的数据。依赖人为管理,如果访问权限出现错误或管理员操作不当数据将有泄露风险。相对于传统关系型数据库,区块链可视为一种去中心化分布式数据库,区块之间通过复杂的密码学算法连接,数据记录在每一个区块上,每一个区块通过计算前一区块的哈希值、新交易区块和随机数得来,保证区块唯一性[8]。当区块足够多时,如果想篡改其中一个区块的数据,则需要对被篡改区块之后的所有区块重新进行密码学证明,保证区块链不可篡改性。每次数据改动都会通过数字签名合法记录在区块链上[9],即数据公开性和可溯源性。基上述优点区块链成为医疗数据存储的重要方式。传统区块链存储方式是将患者所有数据存储到区块链上,将加大系统开支,吞吐量问题难以解决。同时犹豫区块链性能对于患者隐私的保护,医疗数据分享成为难题[10]。为解决该问题,本系统将传统关系性数据库与区块链结合,将患者个人信息与病历详细信息分开存储[11]。
4.2 架构设计
4.2.1 电子病历模块 基于区块链的电子病历分为登录、病历生成、诊治信息存储以及查询等模块。电子病历的区块链网络单独存储于整个家庭医生服务系统中,设立单独登录模块,患者通过就诊卡ID(Identity document)登录,没有注册模块,见图6。患者第1次登录成功后会生成一对公私匙。
图6 区块链电子病历模块
4.2.2 病历存储 使用非对称加密公匙加密用户病历上的个人隐私数据[12],私匙加密病历上的诊疗信息。将公匙保存到数据库,私匙储存在患者就诊卡中,区块链网络根据患者公匙生成的地址创建患者数据,见图7。由于已经将病历上的个人信息和诊治信息分离,且诊治信息数据量大、操作频繁,所以将诊治信息数据存储到Mysql数据库中,解决数据所有权错权问题并减小区块链网络吞吐量。患者病历上的个人信息涉及个人隐私且操作不频繁。患者的诊治信息单独拥有唯一主键ID,系统将患者的个人信息通过对称加密后和数据库中的诊治信息主键ID加载到区块链网络中[13],组成患者的电子病历数据。区块链中只有患者的诊治信息主键ID而不包含个人信息,既保护了患者的隐私也减少了区块链的吞吐量[14]。
图7 区块链网络病历存储
4.2.3 病历查询 分为患者查询和医生查询。由于诊治信息数据保存在Mysql数据库中,医生查询时可直接搜索公开的诊治信息。患者就诊时可使用就诊卡ID进入查询系统查询病历信息。系统使用私匙进行解密后通过诊治信息的主键ID查询数据库中具体数据,整理后返回给患者,见图8。
图8 患者查询病历
4.2.4 病历生成 医生根据患者主诉请求填写病历信息,完成后提交给服务器,校验成功后将数据上传,提取患者信息同时创建诊治信息数据摘要,使用患者私匙进行签名,向区块链发送更新患者病历的请求,链代码解析请求并且更新患者数据[15],将病历表上的诊治信息主键ID和数据摘要信息更新到电子病历中。
4.3 核心功能测试
对区块链电子病历的核心功能分成3部分进行测试,即用户登录、病历生成和病历查询测试,每部分再分为数个测试单元,采用黑盒测试方法。测试结果,见表1。针对将病历数据全部储存到区块链的传统方式,通过区块链与传统关系型数据库的有效结合,达到减小区块链网络吞吐量的目的,同时使诊治信息数据与患者个人隐私分开,解决了所有权错位问题,可更好地分享医疗数据。
表1 核心功能测试结果
5 结语
该分布式家庭医生服务系统分别开发了用户端、医生端和管理端,既有传统家庭医生服务系统的签约医生、预约体检、健康咨询、健康档案等功能,同时部署区块链电子病历。针对传统集中式家庭医生服务系统低耦合性、灵活性差等缺点,该系统采用分布式系统架构,将核心模块分别部署在不同服务器上,解决应用耦合性高的问题,提高系统可靠性和开发效率,面对用户需求变化系统后期更易扩展。区块链与传统数据库的结合,一方面保护患者隐私,另一方面减少区块链网络压力,同时解决医疗数据所有权错权问题。经测试分布式系统被成功部署,区块链电子病历核心功能成功通过黑盒测试。该系统的开发为医疗机构、医生和用户提供联系平台,为“互联网+医疗健康”增添动力,为家庭医生制的推行奠定基础。