优化从支付网关获取交易状态的重试间隔

问题描述 投票:0回答:1

我有一个系统,其中交易最初在关系数据库中标记为“待处理”,如果支付网关未立即成功支付交易,我需要从支付网关获取最新状态。目前,我有一个每 15 分钟运行一次的 cron,它会扫描表中的待处理交易并从支付网关获取最新状态,我想优化我们轮询网关以获取这些状态的方式。

我不想每 15 分钟轮询一次相同的事务,而是想实施重试策略,其中:

  • 如果交易仍处于待处理状态,则应在增加间隔后重试(例如,首先在 X 分钟后重试,然后在 5X 分钟后重试,然后在 15X 分钟后重试,等等)。
  • 这将有助于避免扫描整个“待处理”交易表并最大限度地减少冗余检查。

以高效且可扩展的方式实施这种重试策略的最佳方式是什么?具体来说,如何构建轮询机制,使其不会过于频繁地重复检查每个待处理事务,同时仍确保及时获取状态更新?

concurrency queue rdbms system-design high-level-architecture
1个回答
0
投票

一种常见的方法是更频繁地运行作业,例如每分钟运行一次,并向待处理记录添加两个字段:not_before(时间戳)和 number_of_attempts(整数)。

该作业选择 not_before 小于或等于当前时间戳的所有记录,重试它们,并在必要时根据可用数据计算新的 not_before。

此方法需要最少的更改,并且不需要额外的基础设施。或者,您可以部署支持延迟消息的流或消息服务,类似于 https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-timers.html

© www.soinside.com 2019 - 2024. All rights reserved.