本页介绍了在 Cloud Healthcare API 中存储大量 FHIR 数据的选项。
导入 FHIR 资源
使用 fhirStores.import
方法将 FHIR 资源从 Cloud Storage 加载到 Cloud Healthcare API。当将数据加载到没有其他应用干扰的空 FHIR 存储区时,此方法的性能最佳。
如需调用 fhirStores.import
,请参阅使用 Cloud Storage 导入和导出 FHIR 资源。
在决定是否使用 fhirStores.import
方法时,请考虑以下特性。如果 fhirStores.import
不适合您的应用,请考虑使用 fhir.executeBundle
方法加载数据。如需了解如何调用 fhir.executeBundle
,请参阅使用 FHIR 软件包管理 FHIR 资源。
fhirStores.import
方法接受大于fhir.executeBundle
上的 50 MB 限制的软件包。不过,软件包中每个单独资源的大小不得超过 10 MB。使用
fhirStores.import
可消除执行大型 FHIR 软件包的复杂性,例如:- 将 FHIR 软件包拆分为较小的软件包
- 管理多个软件包时间表
- 管理可在资源级或软件包级重试的暂时性错误
这些优势通常比使用软件包的优势更大。
输入中的每个资源都必须包含由客户端提供的 ID。不论 FHIR 存储区中的
enableUpdateCreate
设置如何,每个资源都使用所提供的 ID 进行存储。无论 FHIR 存储区上的
disableReferentialIntegrity
设置如何,导入过程都不会强制执行参照完整性。不强制执行参照完整性后,您可以导入具有任意依赖项的资源,而无需考虑分组或排序。如果输入数据包含无效参照,或者某些资源无法导入,则 FHIR 存储区的状态可能违反参照完整性。如果具有给定 ID 的资源已在存储区中,则该资源的最新版本会被覆盖,而不创建新的历史版本。不论 FHIR 存储区上的
disableResourceVersioning
设置如何,它都会被覆盖。如果导入期间发生暂时性故障,则成功导入的资源可能会被覆盖多次。除非输入数据包含多个 ID 相同但内容不同的有效资源,否则导入操作具有幂等性。在这种情况下,导入完成后,存储区中仅有一个包含每个 ID 的资源,但重复条目可以包含任何版本的内容。例如,如果导入具有相同 ID 的 100 万个资源,则只会在存储区中写入一个资源。
操作结果计数器不会将重复 ID 计为错误。输入中的每个资源都计为一次成功。这可能会导致成功计数大于 FHIR 存储区中的资源数量。导入在由
Patient-everything
生成的软件包中整理的数据时,通常会发生这种情况,其中每个软件包都包含自己的资源副本(如Practitioner
),可能会被多个患者资源引用。如果某些资源因解析错误等原因而无法导入,则系统不会回滚已成功导入的资源。例如,如果 100 个资源中有 5 个导入失败,则其余的 95 个资源将导入到 FHIR 存储区中。
使用
BUNDLE
格式时,导入方法会拒绝Bundle.type
为history
.的软件包。导入方法不会对批量或事务软件包应用软件包处理语义。与fhir.executeBundle
不同的是,事务软件包不会作为单个事务执行,且不会重写软件包内部引用。该软件包被视为Bundle.entry.resource
中提供的要被写入的资源集合,将忽略Bundle.entry.request
。例如,这可以让您导入由 FHIR 搜索或Patient-everything
操作生成的搜索集软件包。
使用 FHIR 软件包
如需了解 FHIR 软件包的概览,请参阅 FHIR 软件包。
何时使用 FHIR 软件包
在决定是否使用 fhir.executeBundle
方法存储 FHIR 资源时,请考虑使用该方法的以下特性和优势:
- 如果构建一个流水线来将数据存储在 Cloud Storage 中,然后使用
fhirStores.import
导入数据的费用(无论是结算费用还是网络带宽费用)过高,请使用fhir.executeBundle
。 - 执行软件包时,可以强制执行事务完整性。
- 在执行软件包时,可以强制执行 FHIR 配置文件验证。
- 如果您需要在发生 FHIR 创建、更新或删除操作时发送 Pub/Sub 通知,请使用
fhir.executeBundle
。使用fhirStores.import
导入 FHIR 资源时,系统不会发送 Pub/Sub 通知。 - 如果必须处理特定 FHIR 资源的时间以秒或分钟为单位,请使用
fhir.executeBundle
。如果必须在几小时或几天内处理特定 FHIR 资源,请使用fhirStores.import
。 - 如果您的 Google Cloud 项目有许多现有的长时间运行的操作 (LRO) 正在执行其他任务,那么与
fhirStores.import
相比,使用fhir.executeBundle
可能会获得更好的性能。 如果管理
fhirStores.import
操作的应用没有针对以下情况的良好策略,请使用fhir.executeBundle
:- 处理批量错误
- 解决部分 FHIR 资源或整个批次的失败问题
何时不应使用 FHIR 软件包
在确定是否使用 fhir.executeBundle
存储 FHIR 资源时,请考虑 fhir.executeBundle
的以下限制:
软件包具有等效的配额,并且系统会对软件包内的操作应用与在软件包外执行操作相同的结算方式。例如,如果软件包包含 10 个
POST
操作、5 个GET
操作和 1 个DELETE
操作,则应用于该软件包的配额和结算方式与这些操作单独执行时相同。因此,降低配额限制和 FHIR 操作费用并非使用软件包而非
fhirStores.import
的原因。大型事务捆绑包可能更容易出现事务冲突,从而导致数据争用和操作失败。如需了解这些问题的出现方式以及如何解决这些问题,请参阅防止出现
429 Resource Exhausted operation_too_costly
错误。您可以使用批处理软件包实现并保持高数据吞吐量,这有助于您避免数据争用。但是,批处理软件包不具备事务一致性功能,例如引用完整性
如果软件包很大,即使是批量软件包,您也可能会发现数据吞吐量降低。如需了解详情,请参阅避免创建大型事务分块。