文章
Tete Zhang · 九月 14 阅读大约需 5 分钟

集成平台消息相关的常见存储问题

  1. 从消息查看器看到清除周期以外的消息没有被正常清除

这种情况先抽查这些消息所处的会话中是否有未完成操作周期的消息(状态为除“Completed”“Error”“Discarded”之外的状态)。如有,且定期清除任务配置了“KeepIntegrity”,且该环境并不需要保留这些消息,可通过关闭清除任务中的“KeepIntegrity”配置清除这些会话和包含的消息。如果有这类消息,但是定期清除任务未配置“KeepIntegrity”,可能是定期清除任务的逻辑或消息数据问题导致清楚任务查找的时候没有覆盖这些消息,请联系WRC帮助排查具体原因。

有关定期清除任务的更多信息请参见文档

Purging Production Data | Managing Productions | InterSystems IRIS for Health 2022.1

  1. 从消息查看器看不到清除周期之外的消息,但是^%GSIZE显示有global占据了很大的磁盘空间

这种情况需要具体排查每个较大的global。可能有以下原因:

  • 系统定义的global占用很大空间。您可以联系WRC帮助排查具体原因。
  • 自定义的global占用很大空间。这可能是消息中嵌套的持久化数据或流数据,或者是和消息没有直接关系的独立的表里面的数据。请对创建这种global的代码进行复盘,找到创建逻辑并增加相应的数据管理逻辑。
  1. 孤立消息 (Orphan Messages)

孤立消息是指不存在配套Message Header的所有消息对象。

定期清除任务会根据Message Header里的时间信息和状态信息去判断一条消息是否符合清除条件。Message Header是在消息从一个组件发向另一个组件的时候被创建的。所以,当我们创建将被永久存储的对象之前,我们都要思考:这个对象会被保存吗?被保存后会被发送到另一个组件吗?如果不会被发送,该对象将不存在配套的Message Header,也就不会被定期清除。这种情况我们需要开发相应的自定义逻辑去定期管理该表中的数据,或确保该对象被发送到某个组件以创建Message Header。消息对象中嵌套对象或流的情况要尤其注意,对每一个嵌套的对象或流都要定义相对应的%OnDelete()删除逻辑。

在测试阶段我们可以做如下的测试:

  1. 测试前跑^%GSIZE报告并检查磁盘存储
  2. 跑一套测试消息
  3. 用清除任务删除系统上所有的消息(DaysToKeep=0)
  4. 跑^%GSIZE报告并检查磁盘存储

如果对比前后的^%GSIZE报告和磁盘空间之后,发现清除任务完成后没有遗留多余的数据,那么这就证明我们的逻辑中对消息及相关嵌套数据进行了很好的管理。反之如果发现了遗留数据,我们可以在研发测试阶段就对问题进行排查,尽量避免开放生产环境以后出现磁盘满或数据库过大的问题。

如果发现了环境中有孤立消息的问题,请联系WRC进行排查和消息清除管理。

  1. HL7v2:孤立字段(Orphan Segment)

HL7v2在数据库中的存储逻辑如下。

EnsLib.HL7.Message对象存在以下两个global里:

^EnsLib.H.MessageD

^EnsHL7.Segment

 

示例:

HL7v2消息 (^EnsLib.H.MessageD global):

1:           ^EnsLib.H.MessageD        =        1257406

2:           ^EnsLib.H.MessageD(1257406)        =        $lb("","","2.3:ORU_R01",0,"2019-06-03 15:28:38.819","2.3.1","C:\Support\inarchive\testoru.txt_2019-06-03_11.28.38.814","","")

3:         ^EnsLib.H.MessageD(1257406,"segs")        =        5

4:         ^EnsLib.H.MessageD(1257406,"segs",1)        =        "11612,25"

5:         ^EnsLib.H.MessageD(1257406,"segs",2)        =        "11612,26"

6:         ^EnsLib.H.MessageD(1257406,"segs",3)        =        "11612,27"

7:         ^EnsLib.H.MessageD(1257406,"segs",4)        =        "11612,28"

8:         ^EnsLib.H.MessageD(1257406,"segs",5)        =        "11612,29"

其中, 125706是该HL7v2消息的Object ID。Global值"11612,25","11612,26"指向相应的HL7v2字段。

HL7v2字段 (^EnsHL7.Segment global):

1:        ^EnsHL7.Segment(11612)   =        30

2:        ^EnsHL7.Segment(11612,25)         =          "|^~\&MSH|^~\&||GA0000||VAERS PROCESSOR|20010331605||ORU^R01|20010422GA03|T|2.3.1|||AL|"

3:        ^EnsHL7.Segment(11612,25,0,1257406)   =        ""

其中,11612是创建该HL7v2消息的进程 ID (PID)。^EnsHL7.Segment(11612,25) 存储了该字段的具体数据。^EnsHL7.Segment(11612,25,0,1257406) 中的第四个值(1257406)是这个字段所属消息的Object ID。

 

从以上示例可以看出,HL7v2字段数据存储于^EnsHL7.Segment global。所以在^%GSIZE中看到^EnsHL7.Segment global比 ^EnsLib.H.MessageD global大是正常现象。使用平台自带的逻辑在最新版本上目前也没有已知问题会导致孤立字段。如果您持续观察^%GSIZE报告,发现^EnsHL7.Segment global的大小出现异常增长,可以联系WRC排查是否有孤立字段的情况。

2
0 22
讨论 (0)1
登录或注册以继续