请求延迟时间和错误处理最佳实践

本页面介绍了 Cloud Healthcare API 中优化请求延迟时间和处理错误的最佳实践。在规划和设计系统架构时,请实施这些实践。

Google 提供了一份服务等级协议 (SLA),其中定义了 Cloud Healthcare API 服务的预期正常运行时间以及客户端如何处理错误。 如需了解详情,请参阅 Cloud Healthcare 服务等级协议 (SLA)

实现重试逻辑和超时

为了处理因请求失败而导致的延迟和错误,请实现适当的重试逻辑和超时。设置超时时长时,请留出足够的时间来执行以下操作:

  • 让 Cloud Healthcare API 处理请求。
  • 确定错误是源自服务还是客户端。

您可以重试某些错误,但其他错误无法重试,并且会在多次重试后仍然存在。例如,如果请求数据格式不正确,服务器会返回 400 Bad Request 状态代码。在您修正数据之前,相应请求不会成功。

为了应对这些情况,您需要规划最终错误状态

如需详细了解重试逻辑和超时,请参阅重试失败的请求

处理多个层级的错误

当中间件与 Cloud Healthcare API 交互时,请在客户端和中间件中实现重试逻辑和超时。如果客户端遇到的错误超过了重试次数上限,您必须能够确定错误是发生在客户端、中间件还是底层 Cloud Healthcare API 服务中。在规划最终错误状态时,这一点尤为重要。

请考虑以下场景:

  1. 中间件在发送请求时从 Cloud Healthcare API 收到 500 Internal Server Error 错误。
  2. 中间件层会再重试 5 次请求,达到其限制,然后停止重试。
  3. 客户端收到最终的 500 Internal Server Error 错误。

请务必了解,此错误源自 Cloud Healthcare API,而不是中间件。为了简化调试,请在返回给客户端的错误中提供此信息。

下图展示了以下场景:中间件代理在将客户端的请求转发到 Cloud Healthcare API 时收到 500 Internal Server Error 错误。客户端和代理均实现了错误处理和重试。

图示:在客户端/中间件/服务器堆栈中,应在何处处理错误。
图 1. 您需要在客户端代理这两个层中实现重试逻辑和超时。

图 1 显示了以下步骤:

  1. 客户端通过中间件代理向 Cloud Healthcare API 发送有效请求。
  2. 代理服务器将请求转发给 Cloud Healthcare API。
  3. Cloud Healthcare API 会向代理返回 500 Internal Server Error 错误。代理会再重试 5 次请求,直到达到重试次数上限。
  4. 代理向客户端返回最终错误状态 500 Internal Server Error

    根据前面显示的建议,您可以让代理向客户端返回以下错误,从而调试最终的错误状态:

    Error with underlying FHIR store in Cloud Healthcare API after 5 retries: 500 Internal Server Error

    添加有关 Cloud Healthcare API 返回的错误的更多信息。

有时,客户端或代理会收到超出重试次数上限的 500 Internal Server Error 错误,并且无法再次重试。在这种情况下,可能需要人工干预来诊断错误是来自代理还是 Cloud Healthcare API。

选择要重试哪些错误

根据系统架构,您可以重试某些错误,而忽略其他错误。以下是可重试的 Cloud Healthcare API 错误代码(非完整清单):

  • 408 Request Timeout
  • 425 Too Early
  • 429 Too Many Requests
  • 500 Internal Server Error
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout

这些错误通常不会以相同的频率出现,有些可能永远不会出现。

系统架构效果

系统的架构会影响您重试错误的方式和时间。

例如,在直接的客户端-服务器架构中,如果客户端从 Cloud Healthcare API 收到 401 UNAUTHENTICATED 错误,可以重新进行身份验证并重试其请求。

假设某个系统在客户端和 Cloud Healthcare API 之间有一个中间件层。如果客户端已正确完成身份验证,但过期身份验证令牌导致了问题,则中间件必须刷新令牌并重试请求。

分析最终错误状态后,您可以根据自己的发现调整客户端重试的错误。

规划最终错误状态

即使在实现重试逻辑和超时后,客户端或中间件也可能会收到错误,直到重试次数用尽为止。在重试和超时用尽之前返回的最后一个错误是最终错误状态。您可能会遇到数据一致性错误的最终错误状态。

有时,最终错误状态需要人工干预。尝试实现一种解决方案,以解决请求的最终错误状态。 否则,记录最终错误状态,以便人工审核。

在规划如何处理最终错误状态时,请考虑以下事项:

  • 是否存在处理依赖项,如果 FHIR 事务或软件包无法成功完成,则需要停止这些依赖项。
  • 如果许多虚拟机 (VM) 实例开始永久性失败,客户端必须报告失败的请求。问题修复后,客户端必须重试请求。
  • 监控、提醒系统和服务等级目标 (SLO) 对于确保系统稳定性至关重要。如需了解详情,请参阅测试和监控

规划延迟时间增加的情况

Cloud Healthcare API 是一项可伸缩且性能出色的服务,但请求延迟时间仍可能会因以下原因而有所不同:

  • 即使请求之间的差异看起来微不足道,也可能会导致额外的处理时间。
  • 类似请求的延迟时间可能不同。 例如,如果两个向数据存储区添加记录的类似请求中,有一个请求跨越了触发额外任务(例如分配更多存储空间)的阈值,则这两个请求的延迟时间可能会有所不同。
  • Cloud Healthcare API 可以同时处理多个请求。客户端发送请求的时间(以秒的小数表示)可能恰好与 Cloud Healthcare API 的负载比平时更重的时间重合。
  • 如果 Cloud Healthcare API 物理资源(例如磁盘)正在处理许多请求,则需要先完成排队的任务,然后才能处理其他请求。
  • 有时,Cloud Healthcare API 会在服务器端重试错误,这可能会增加客户端的延迟时间。
  • 在单区域或多区域位置中,不同数据中心内的数据可能存在多个副本。如果您的请求在多个数据中心之间路由(无论是原始请求还是重试请求),延迟时间可能会增加。

使用百分位延迟时间进行规划

您可以通过分析请求的百分位延迟时间来规划延迟时间增加的情况。以下示例介绍了第 50 百分位延迟时间第 99 百分位延迟时间

  • 第 50 百分位延迟时间是指所有请求中处理速度最快的 50% 的最长延迟时间(以秒为单位)。例如,如果第 50 百分位的延迟时间是 0.5 秒,则表示 Cloud Healthcare API 在 0.5 秒内处理了 50% 的请求。第 50 百分位延迟时间也称为“延迟时间中位数”。
  • 第 99 百分位延迟时间是指所有请求中处理速度最快的 99% 的最长延迟时间(以秒为单位)。例如,如果第 99 百分位的延迟时间是 2 秒,表示 Cloud Healthcare API 在 2 秒内处理了 99% 的请求。

如果您在 Cloud Healthcare API 仅处理少量请求的时间段内分析百分位延迟时间,那么百分位延迟时间可能无法反映整体性能,因为异常请求可能会产生很大影响。

例如,假设 Cloud Healthcare API 中的某个进程在 100 分钟内处理了 100 个请求。这 100 分钟的第 99 百分位延迟时间将基于单个最慢的请求。仅使用单个请求进行延迟时间测量不足以了解是否存在性能问题。

在更长的时间段(例如 24 小时)内收集更大的请求样本,可以更深入地了解系统的整体行为。您可以使用这些示例来确定系统对高流量的响应方式。