我了解MS Azure队列服务文档http://msdn.microsoft.com/en-us/library/windowsazure/dd179363.aspx表示无法保证首次输出(FIFO)行为。
但是,我们的应用程序是必须以FIFO顺序读取和处理所有消息。任何人都可以建议如何使用Azure队列服务实现有保证的FIFO?
谢谢。
答案 0 :(得分:4)
最新的Service Bus版本提供可靠的消息队列排队:Queues, topics and subscriptions
答案 1 :(得分:1)
添加到@RichBower答案...查看此... Azure存储队列与Azure服务总线队列
http://msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx
答案 2 :(得分:1)
您只需按照以下步骤确保消息订购。:
1)创建一个session enabled = 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,但它会自动确保订单并提供有序的消息。
谢谢!
答案 3 :(得分:1)
docs对Azure存储队列说:
存储队列中的消息通常是先进先出,但有时它们可能会出现故障;例如,当一条消息时 可见性超时持续时间到期(例如,由于a 客户端应用程序在处理期间崩溃)。当能见度 超时到期后,消息在队列中再次可见 另一名工人将其出列。那时,新的可见消息 可能会在消息之后放入队列(要再次出列) 最初在它之后排队。
也许这对你来说足够好了?否则使用服务总线。
答案 4 :(得分:0)
如前所述https://www.jayway.com/2013/12/20/message-ordering-on-windows-azure-service-bus-queues/除了使用有风险的接收和删除模式外,服务总线也不保证订购
答案 5 :(得分:0)
我不知道您希望处理消息的速度有多快,但如果您需要拥有真正的FIFO,请不要让Azure的队列在一个消息中获取多条消息时间。
在你的&#34; program.cs&#34;在功能的顶部。
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毫秒。
这与记录器webjob完美配合,可以将文件信息写入文件。
答案 6 :(得分:0)
不幸的是,许多答案误导了服务总线队列,但我认为问题与提到的标签中的存储队列有关。在 Azure Storage Queues
中,不保证 FIFO ,而在 Service Bus
中,FIFO 消息排序是有保证的,而且只有使用称为会话的概念强>.
一个简单的场景可能是,如果任何消费者从队列中收到一条消息,当您是第二个接收者时,您将看不到该消息。所以你假设你收到的第二条消息实际上是第一条消息(FIFO失败的地方:P)
如果这不是您的要求,请考虑使用服务总线。