Amazon QLDB 驱动程序中的常见错误 - Amazon Quantum Ledger Database (Amazon QLDB)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon QLDB 驱动程序中的常见错误

本节描述了 Amazon QLDB 驱动程序在与 QLDB 会话 API 交互时可能引发的运行时错误。

下面是驱动程序返回的常见异常列表。每个异常都包括特定的错误消息,然后是简短的描述和可能的解决方案建议。

CapacityExceededException

消息:容量已超出

Amazon QLDB 拒绝了该请求,因为它超出了分类账的处理能力。QLDB 对每个分类账强制执行内部扩展限制,以维护服务的运行状况和性能。此限制因每个请求的工作负载大小而异。例如,如果请求执行效率低下的数据事务,例如由非索引限定查询产生的表扫描,则该请求的工作负载可能会增加。

我们建议您在重试请求之前等待。如果您的应用程序一直遇到此异常,请优化您的语句并降低发送到分类账的请求的速率和数量。语句优化的示例包括每个事务运行更少的语句和调优表索引。要了解如何优化语句和避免表扫描,请参阅 优化查询性能

建议使用最新版本的 QLDB 驱动程序。驱动程序具有默认的重试策略,该策略使用指数回退和抖动来自动重试此类异常。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。

InvalidSessionException

消息:事务 transactionId 已过期

事务已超过其最长生命周期。在提交之前,事务最多可运行 30 秒。超过此时间限制后,QLDB 会拒绝在事务完成的任何工作,并丢弃运行该事务会话。此限制通过启动事务(而不提交或取消事务)以保护客户端免遭泄漏会话。

如果这是应用程序中常见的异常,那么很可能是事务运行时间过长。如果事务运行时间超过 30 秒,请优化您的语句以加快事务速度。语句优化的示例包括每个事务运行更少的语句和调优表索引。有关更多信息,请参阅优化查询性能

InvalidSessionException

消息:会话 sessionId 已过期

QLDB 放弃了会话,因为它已超过其最大总生命周期。无论事务是否处于活动状态,QLDB 都会在 13-17 分钟后丢弃会话。会话丢失或受损的原因有很多,如硬件故障、网络故障或应用程序重启。因此,QLDB 对会话强制使用最长生命周期,以确保客户端软件能应对会话故障。

如果您遇到此异常,我们建议您获取一个新的会话并重试该事务。我们还建议使用最新版本的 QLDB 驱动程序,该驱动程序代表应用程序管理会话池及其运行状况。

InvalidSessionException

消息:没有这样的会话

客户试图使用不存在的会话与 QLDB 进行事务处理。假设客户端正在使用先前存在的会话,则由于以下原因之一,该会话可能不再存在:

  • 如果会话涉及内部服务器故障(即 HTTP 响应代码 500 错误),那么 QLDB 可能会选择完全放弃该会话,而不是允许客户使用状态不确定的会话进行事务。然后,对该会话的任何重试尝试都会失败,并出现此错误。

  • 过期的会话最终会被 QLDB 遗忘。然后,任何继续使用会话的尝试都会导致此错误,而不是初始 InvalidSessionException

如果您遇到此异常,我们建议您获取一个新的会话并重试该事务。我们还建议使用最新版本的 QLDB 驱动程序,该驱动程序代表应用程序管理会话池及其运行状况。

RateExceededException

消息:已超出速率

QLDB 根据调用者的标识对客户端进行节流。QLDB 使用令牌桶节流算法在每个区域、每个账户的基础上强制执行节流。QLDB 这样做是为了帮助提高服务的性能,并确保所有 QLDB 客户的公平使用。例如,尝试使用 StartSessionRequest 操作获取大量并发会话可能会导致节流。

为了保持应用程序的运行状况并缓解进一步的节流,您可以使用指数回退和抖动来重试此异常。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。建议使用最新版本的 QLDB 驱动程序。驱动程序具有默认的重试策略,该策略使用指数回退和抖动来自动重试此类异常。

如果您的应用程序持续受到 QLDB 的 StartSessionRequest 调用节流,那么最新版本的 QLDB 驱动程序也可以提供帮助。驱动程序维护着一个跨事务重复使用的会话池,这有助于减少应用程序发出的 StartSessionRequest 调用次数。要请求提高 API 节流限额,请联系 AWS Support 中心

LimitExceededException

消息:已超出会话限制

分类账的活跃会话数量超过了其配额(也称为限制)。此配额在 Amazon QLDB 资源中的限额和限制 中定义。分类账的活动会话计数最终是一致的,并且始终在配额附近运行的分类账可能会定期看到此异常。

为了保持应用程序的运行状况,我们建议重试此异常。为避免出现这种异常,请确保在所有客户端上为单个分类账配置的并发会话不超过 1,500 个。例如,您可以使用适用于 Java 的 Amazon QLDB 驱动程序maxConcurrentTransactions 方法来配置驱动程序实例中的最大可用会话数。

QldbClientException

消息:流结果仅在父事务打开时有效

事务已关闭,无法用于从 QLDB 检索结果。事务在提交或取消时关闭。

当客户端直接处理 Transaction 对象,并且在提交或取消事务后尝试从 QLDB 检索结果时,就会发生此异常。为了缓解此问题,客户端必须在关闭事务之前读取数据。