我的任务是实现一个分布式排队系统,类似于Amazon。
如果有GET请求,我必须将消息从主队列传递给用户,并将消息放在不可见队列中。并且应该立即发出删除请求,而我应该从不可见队列中删除消息。
如果没有删除请求,我应该增加重发计数并将消息发送回主队列。这将发生,直到重发计数变为5之后,我将永久删除该消息。
现在我的疑问是,我怎么知道没有删除请求,这意味着我应该将消息发送回主队列?
我的程序适用于删除请求跟随GET请求的情况。在这个实现中,我使用java。
发布于 2018-04-13 06:30:47
首先,在设计级别,get和delete应该在一个动作中完成。请注意,在JDK,Queue的pull()操作将得到和删除。如果您坚持单独的操作,那么至少应该支持一个可选的获取和删除请求类型。
现在,当您想要检测没有发生的动作时,会出现一个问题,因为它可能永远“将来可能会发生”。因此,您需要设置一个时间窗口,确定预期的操作没有发生。
通常要做的是,在将其放入不可见队列(更好的名称是“待定删除请求”队列)之前,将“接收”时间戳附加到请求(以及重新传递计数)中,您可以将请求包装在添加属性的自定义java类中。
事实上,我不认为排队是一个很好的选择,一个集合。当删除请求出现时,需要对请求进行随机访问。因此,也许哈希映射是一个更好的选择。
您需要实现一个计时,它每隔x秒调用一次任务。这些任务将扫描pendingDeleteRequests地图,以查找在允许的时间窗口中没有重新删除并从地图中删除的请求。
最后注意:一些消息传递系统具有“死信”功能,它是发送失败传递通知的目的地。这将有助于调试问题。
https://stackoverflow.com/questions/49809861
复制相似问题