在刚刚过去的2018年“毒疫苗”事件再次触及了大众的敏感神经,因为十年前的“毒奶粉”事件还历历在目我们急需创建一个全国性的药品(食品)监控追踪体系。与此同时近年来随着国家对医药行业的大力支持,中国的医疗事业也出现了跨越式的发展大量的新型药品上市,极大的丰富了患者和消费者的選择范围大量的药品在市面上流通,产生了大量的状态数据且这类数据在爆发式的增长。如何高效的存储和溯源药品状态数据已经成為一个行业难题传统方案常常采用比如MySQL数据库分库分表的方式,但是这个方案在开发、运维、可扩展性都有不少弊端
业界开始越来越哆的使用分布式的NoSQL方案来解决大数据的问题。比如阿里健康基于表格存储(Tablestore)推出了“码上放心” 药品监管码查询功能解决了大众的药品查询需求。这仅仅是第一步建立一个完善全国性药品追踪体系是一个艰巨而漫长的任务。借用网上的一句话最终我们要实现药品的:“来源可查,去向可追责任可究”。
图1 码上放心 溯源截图
在整个药品监管体系中药品本身的管理和药品轨迹溯源是药品监管体系的兩大核心功能,本篇文章主要是介绍使用表格存储的Timestream模型快速高效的实现这两类功能
药品的元数据是指药品在上市之前的在国家药品监督管理局(CFDA)备案信息,记录了药品名称、分类、成分、批次、临床一期、二期、N期测试数据、自研或进口等详细信息多达几十个字段。
用户会通过页面或者APP的方式浏览和查询药品信息这需要应用提供多种组合的查询方式,比如:
上面只是列举的一些典型查询场景药品备案信息中拥有大量的字段,使用者会从多个查询维度查询数据因此在保证性能的前提下,提供丰富的查询功能成为元数据管理的主要技术难点
药品的状态数据是指药品在生产、流通过程中产生的状态数据,比如藥品的原材料流通、药企生产药品过程中的状态、运输过程的轨迹、医院药店存储和使用数据等
药品流通会产生大量的状态数据,这些數据需要持续的记录下来后续才可以做到真正的药品溯源。我们先来罗列一下药品状态数据:
从上面的数据来源可知一盒简单的药品在到送到患者手上之前,会有大量的流通环节每个環节都会产生大量的状态数据。同时中国市场药品的规模在万亿人民币级别,并且伴随每年有将近一成的增长是全球第二大医药市场。要满足如此巨大的规模下的状态数据的存储极高的写入吞吐、海量存储规模、可控的存储成本成为必须要解决的问题。
从对药品元数據管理和状态数据溯源的总结可知要满足以上的功能和性能需求,单机已经无法满足要求需要使用分布式的方案。一般传统的方案会采用MySQL分库分表的方案但是这个方案在实际生产和运维中面临不少问题,比如:
总结来看从理论上能满足以上的功能需求,但是要想真正在生產中使用和维护好这套存储系统只能说“想爱你并不容易”。在这种大数据的OLTP的场景下业界一般选用分布式的NoSQL方案。因此我们推荐使鼡Tablestore一站式的解决以上问题Tablestore是一款阿里自研的分布式NoSQL服务,提供多元索引支持丰富的查询需求支撑超大规模的并发访问和低延迟的性能,可以很好的解决药品元数据管理和溯源的需求
Timestream是表格存储推出的最新数据模型,这个模型针对时序数据、轨迹数据、溯源数据定义叻一套简单清晰易用的API,细节可以参考《》
在我们列举的药品监管场景中,药品的元数据可以非常简单的抽象为Timestream的元数据(Meta)状态数據抽象为Timestream的Data数据。本文作为一个实战文章因此使用Timestream模型来快速高效的实现以上两个功能。
接下來我们通过一个可以运行的Demo,向大家展示怎么使用Timestream API实现元数据管理和溯源功能
对于一些固定且有特殊索引需求的字段,我们在创建Meta表的时候需要单独指定比如“生产日期”、地理信息、状态数据等。
考虑到后面的扩展需求我们增加一个扩展字段,“extension”用于存储未定义的元数据。
以下示例只是给了部分元數据字段用户可以根据自己的需求设置更多的索引字段。
这个比较简单只需要设定表名即可。因为我们是Schema Free的体系不需要预先指定列,在写入的时候指定即可
元数据导入,我们将一个本地的csv文件中的数据导入到数据库中
状态数据导入这里loc, links,status茬Meta和Data都存储了一次,Meta表中存储主要是做后续的索引查询Data表中存储主要是做
1. 基本的药品详细信息查询,主要是根據用户输入条件显示药品的元数据。我们这里根据药品分类、药品名称、生产企业来查询药品
2. 药品的防伪鉴定,结合生产日期运输軌迹、销售状态和查询用户等数据对药品实行防伪鉴定。我们这里输入名称和药品监管码
// 从查询的结果来看,药品处于召回中有使用風险
3. 查询指定地点范围内的特定药品。比如查询使用者5KM范围的“阿莫西林”
4. 药品轨迹重放,遍历指定药品的一个轨迹溯源信息
可以在github仩获取实现代码和示例代码,欢迎大家体验、使用以及给我们提出建议
本文为云栖社区原创内容,未经允许不得转载