【发布时间】:2011-11-17 19:19:51
【问题描述】:
我了解 MS Azure 队列服务文档 http://msdn.microsoft.com/en-us/library/windowsazure/dd179363.aspx 表示不保证先出 (FIFO) 行为。
但是,我们的应用程序要求所有消息都必须按 FIFO 顺序读取和处理。谁能建议如何使用 Azure 队列服务实现有保证的 FIFO?
谢谢。
【问题讨论】:
标签: azure azure-storage
我了解 MS Azure 队列服务文档 http://msdn.microsoft.com/en-us/library/windowsazure/dd179363.aspx 表示不保证先出 (FIFO) 行为。
但是,我们的应用程序要求所有消息都必须按 FIFO 顺序读取和处理。谁能建议如何使用 Azure 队列服务实现有保证的 FIFO?
谢谢。
【问题讨论】:
标签: azure azure-storage
docs 表示 Azure 存储队列:
存储队列中的消息通常是先进先出的,但有时它们可能会乱序;例如,当一条消息的 可见性超时持续时间到期(例如,由于 客户端应用程序在处理过程中崩溃)。当能见度 超时到期,消息在队列中再次可见 另一个工人将其出队。此时,新可见的消息 可能在消息后被放入队列(再次出队) 最初排在它之后。
也许这对你来说已经足够了?否则使用服务总线。
【讨论】:
最新的 Service Bus 版本提供可靠的消息队列:Queues, topics and subscriptions
【讨论】:
添加到@RichBower 答案...看看这个... Azure 存储队列与 Azure 服务总线队列
MSDN(链接已停用) http://msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx
docs.microsoft.com https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-azure-and-service-bus-queues-compared-contrasted
【讨论】:
您只需要按照以下步骤来确保消息排序。:
1) 创建一个启用会话的队列=false。 2)在队列中保存消息时,提供如下会话ID:-
var message = new BrokeredMessage(item);
message.SessionId = "LB";
Console.WriteLine("Response from Central Scoring System : " + item);
client.Send(message);
3) 在为恢复消息创建接收器时:-
queueClient.OnMessage(s =>
{
var body = s.GetBody<string>();
var messageId = s.MessageId;
Console.WriteLine("Message Body:" + body);
Console.WriteLine("Message Id:" + messageId);
});
4) 会话ID相同的情况下,会自动保证顺序并给出有序消息。
谢谢!!
【讨论】:
我不知道您希望多快处理消息,但如果您需要真正的 FIFO,请不要让 Azure 的队列一次获取多于一条消息。
在函数顶部的“program.cs”中使用它。
static void Main()
{
var config = new JobHostConfiguration();
if (config.IsDevelopment)
{
config.UseDevelopmentSettings();
}
config.Queues.BatchSize = 1; //Number of messages to dequeue at the same time.
config.Queues.MaxPollingInterval = TimeSpan.FromMilliseconds(100); //Pooling request to the queue.
JobHost host = new JobHost(config);
....your initial information...
// The following code ensures that the WebJob will be running continuously
host.RunAndBlock();
这将一次收到一条消息,等待时间为 100 毫秒。
这与记录器网络作业完美配合,可将 traze 信息写入文件。
【讨论】:
不幸的是,许多答案误导了服务总线队列,但我认为问题是关于提到的标签中的存储队列。在 Azure Storage Queues 中,不保证 FIFO,而在 Service Bus 中,FIFO 消息顺序是有保证的,而且只有使用称为 Sessions 的概念。
一个简单的场景可能是,如果任何消费者从队列中接收到一条消息,那么当您是第二个接收者时,您将看不到它。所以你假设你收到的第二条消息实际上是第一条消息(FIFO失败的地方:P)
如果这不是您的要求,请考虑使用服务总线。
【讨论】:
正如这里提到的https://www.jayway.com/2013/12/20/message-ordering-on-windows-azure-service-bus-queues/ 在服务总线中也不能保证订购,除非使用有风险的接收和删除模式
【讨论】: