使用一个或多个标准FIFO队列实现延迟队列

Rav*_*pta 2 c# algorithm queue azure azure-storage-queues

延迟队列是一个队列,其中每个消息都有一个与之关联的延迟时间,并且只有在其延迟到期时才能获取消息.队列的头部是那个过去延迟到期的消息.如果没有延迟到期,则没有头,而dequeue将返回null.

实际上,我正在使用Azure编写云应用程序,而在Azure中,只有FIFO队列可用,而不是优先级/延迟队列.所以我来到这里看是否有人可以给我一些指示,从我可以从正确的方向开始.我google了很多,但只发现了Java中的延迟队列实现,而没有标准的教程/研究论文,一般性地谈论延迟队列.

编辑:

我有什么代码?
实际上,我必须首先设计这些东西并将它呈现给我的经理,一旦我们完成设计,那么只有我才能开始编码.

关于场景的更多细节
它是基于主/从模型的分布式应用程序.主服务器生成消息并将它们放入Azure Service Bus队列,并且有多个从服务器(在多台计算机上运行)从队列中读取并进行处理.如果主机发生故障,则其中一个从机充当主机并开始生成消息.我不想在主服务器中存储任何状态信息,因为如果主服务器关闭,所有状态信息也将随之而来.

Dav*_*gon 10

Windows Azure队列消息具有在将消息插入队列时指定的延迟(以秒为单位).在达到超时延迟之前,将不会显示消息.请参阅此MSDN文章以查看API详细信息.

隐形超时也在各种语言SDK实现中实现.由于你正在使用C#,这就是AddMessage()调用的样子.注意第3个参数AddMessage()指定了不可见性超时:

        var acct = CloudStorageAccount.DevelopmentStorageAccount;
        var queueClient = acct.CreateCloudQueueClient();
        var queue = queueClient.GetQueueReference("myqueue");
        queue.CreateIfNotExist();

        var msg = new CloudQueueMessage("test message");
        queue.AddMessage(msg, TimeSpan.FromHours(2), TimeSpan.FromMinutes(30));
Run Code Online (Sandbox Code Playgroud)