我有一个系统,其中交易最初在关系数据库中标记为“待处理”,如果支付网关未立即成功支付交易,我需要从支付网关获取最新状态。目前,我有一个每 15 分钟运行一次的 cron,它会扫描表中的待处理交易并从支付网关获取最新状态,我想优化我们轮询网关以获取这些状态的方式。
我不想每 15 分钟轮询一次相同的事务,而是想实施重试策略,其中:
以高效且可扩展的方式实施这种重试策略的最佳方式是什么?具体来说,如何构建轮询机制,使其不会过于频繁地重复检查每个待处理事务,同时仍确保及时获取状态更新?
一种常见的方法是更频繁地运行作业,例如每分钟运行一次,并向待处理记录添加两个字段:not_before(时间戳)和 number_of_attempts(整数)。
该作业选择 not_before 小于或等于当前时间戳的所有记录,重试它们,并在必要时根据可用数据计算新的 not_before。
此方法需要最少的更改,并且不需要额外的基础设施。或者,您可以部署支持延迟消息的流或消息服务,类似于 https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-timers.html