java - 如何在 SQS 上将重试延迟 4 小时?
问题描述
TL;DR:如何模仿rabbitMQ的调度功能保持消费者:
- 无国籍
- 无需管理预定消息
- 在接收消息和最终在正确的预定时间使用它之间免于从预定的消息中进行无用的重试
我有一个 SQS 队列,在创建时具有默认属性。消费者处理一条消息的平均时间是 1~2s。但是有一些消息需要处理两次,在 4 小时的窗口之间。这些消息称为 B,其他消息称为 A。
假设我的队列中有以下消息:A1, A2, B1, A3, B2
(5 条消息,最多 10 秒来消耗它们)在这些表的开头:
time | what should happen
---------|-------------------
now | consumer connected to queue
now+10s | all As were consumed successfully and deleted from queue
Bs had their unsuccessful first try and now they are waiting for their retry in 4h
between | nothing happens since no new messages arrived and old ones are waiting
now+4h4s | Bs successfully consumed during second retry and due that, deleted from queue
我有一个Spring
应用程序,当我找到类型B
消息时可以抛出异常。由于简单性和可扩展性,我希望有一个单线程消费消息,需要 1~2 秒来消费每条消息。
这样,我不能像这个答案所建议的那样挂起消息处理。我也不需要 SQS',Delivery delay
因为它只会推迟到达队列的消息而不是重试。如果可能的话,我想继续使用长轮询@JmsListener
,并避免在我的内存应用程序上保留任何状态。如果可能的话,我想避免这种情况
解决方案
您可以将消息 B 发送到 Step Functions 状态机并进入等待状态以等待 4 小时,然后再将其发送到队列。状态机将为您保留状态,您可以从 Step Functions 直接向 SQS 发送消息,因此您无需编写任何代码。
推荐阅读
- c# - 使用 C# 中安装在 IIS 上的 SSL 证书的私钥解密
- javascript - 如何正确格式化此日期/时间?(Moment.js)
- c# - Java List.of() 的 C# 等价物是什么?
- python - 如何将 Python pandas 中的 2 个条形图与 2 个 y 轴结合起来?
- java - 如何使用 mapToDouble 将 ArrayList 中的多个对象字段“流式传输”到 double 数组?
- roomle - Onchange 更新第二个子组件
- react-native - react-native-image-crop-picker 裁剪框高度在限制后固定
- python - 将 PDF 转换为文本:Adobe Reader 与 Python 库
- java - 您使用哪个模拟来测试 HttpClient?
- c# - c#用许多“x”替换字符串