无$events操作的FHIR订阅错误恢复标准方案问询
针对主题式订阅模型下的错误恢复需求(排除$events操作),目前FHIR规范并未定义专门的标准操作,但可以通过以下更贴合FHIR设计规范的方式实现,替代自定义命名查询:
1. 为Subscription资源添加恢复查询扩展
服务器可以在Subscription资源中定义自定义扩展,直接暴露用于错误恢复的查询规则或入口,让客户端通过读取订阅资源本身获取恢复方式,无需硬编码命名查询。
示例扩展结构:
{ "resourceType": "Subscription", "id": "123", "extension": [ { "url": "http://hl7.org/fhir/StructureDefinition/subscription-recovery-search", "valueString": "?_query=subscriptionRecovery&subscriptionId=123&_since=" } ], // 其他订阅字段... }
客户端只需读取该扩展值,拼接上lastNotified时间参数即可发起恢复查询,这种方式符合FHIR扩展的标准模式,具备可发现性。
2. 复用FHIR $export批量导出操作
如果服务器支持FHIR的$export操作(属于标准批量操作),客户端可以结合_since参数,请求导出指定时间范围内符合订阅主题条件的资源。服务器内部将订阅主题的封装逻辑映射到导出过滤规则,客户端无需知晓主题内部的查询细节。
示例请求:
GET /Patient/$export?_since=2024-01-01T00:00:00Z&subscription=123 HTTP/1.1 Accept: application/fhir+json Prefer: respond-async
这种方式复用FHIR现有标准操作,无需自定义新的查询或操作类型,兼容性更好。
3. 在SubscriptionTopic中定义恢复逻辑扩展
对于基于SubscriptionTopic的订阅模型,可以在主题资源中添加扩展,明确该主题对应的恢复查询规则,比如指定对应的命名查询名称、搜索参数组合等。客户端通过查询SubscriptionTopic资源,获取恢复所需的查询模板。
示例扩展:
{ "resourceType": "SubscriptionTopic", "id": "patient-updates", "extension": [ { "url": "http://hl7.org/fhir/StructureDefinition/topic-recovery-query", "valueCode": "subscriptionRecovery" } ], // 其他主题字段... }
客户端据此调用对应的命名查询,同时携带subscriptionId和_since参数,这种方式将恢复逻辑与订阅主题绑定,更符合主题式模型的设计理念。
关于自定义命名查询的补充
你提到的命名查询方案(http://fhir.example.com/?_query=subscriptionRecovery&subscriptionId=123&_since=:lastNotified)是当前实践中常用的自定义实现方式,但不属于FHIR标准操作。如果选择这种方式,建议通过上述扩展方式将命名查询的入口暴露给客户端,而非让客户端硬编码查询路径,提升可维护性和规范性。
目前FHIR规范尚未针对主题式订阅的错误恢复定义专门的标准操作,因此基于FHIR扩展机制的实现是当前最贴近标准的解决方案。
内容的提问来源于stack exchange,提问作者Zoltan

