如何检查是否已调用DELETE API

时间:2018-04-13 05:27:00

标签: java service message-queue

我有一项任务是实现像Amazon SQS这样的分布式排队系统。

如果有GET请求,我必须从主队列向用户传递消息,并将消息放入不可见队列。并且应立即发出DELETE请求,我应该从不可见队列中删除该消息。

如果没有DELETE请求,我应该增加重新传递计数并将消息发送回主队列。这将发生,直到重新传递计数变为5,之后我将永久删除该消息。

现在我怀疑是,我如何知道没有DELETE请求,这意味着我应该将消息发送回主队列?

我的程序适用于DELETE请求遵循GET请求的情况。我正在使用java进行此实现。

1 个答案:

答案 0 :(得分:1)

首先,在设计层面,get和delete应该在一个动作中完成。请注意,in the JDKpull() Queue的操作会获取并删除。如果您坚持单独的操作,至少应支持可选的获取和删除请求类型。

现在,当您想要检测没有发生的操作时会出现问题,因为它可能永远“可能在将来发生”。所以你需要设置一个时间窗口,然后你决定不会发生预期的动作。

通常做的是你将一个“收到”时间戳附加到请求(并重新传递计数),然后将它放入不可见的队列(一个更好的名称将是“待删除请求”队列)你可以包装添加属性的自定义java类中的请求。

实际上,我不认为队列是集合的好选择。当删除请求到来时,您需要随机访问该请求。所以也许哈希地图是更好的选择。

您需要实现一个每隔x秒调用一次任务的Timer。任务将扫描pendingDeleteRequests地图,查看在允许的时间窗口内未接收删除的请求,并从地图中删除。

最后一点:某些邮件系统具有"dead letter"功能,该功能是发送失败邮件通知的目的地。这将有助于调试问题。