作为FIFO工作的Microsoft Azure服务总线队列
本文关键字:服务 总线 队列 Azure Microsoft FIFO 工作 作为 | 更新日期: 2023-09-27 17:57:50
我正在为azure开发两个WebJob:一个使用主题将消息放入服务总线队列,另一个使用相同主题订阅ServiceBusTrigger。
消息会正确发送到服务总线队列,但当运行订阅ServiceBusTrigger的WebJob时,这些消息不会以FIFO为基础进行处理。
将消息放入服务总线队列的WebJob的代码如下:
NamespaceManager namespaceManager = NamespaceManager.Create();
// Delete if exists
if (namespaceManager.TopicExists("SampleTopic"))
{
namespaceManager.DeleteTopic("SampleTopic");
}
TopicDescription td = new TopicDescription("SampleTopic");
td.SupportOrdering = true;
TopicDescription myTopic = namespaceManager.CreateTopic(td);
SubscriptionDescription myAuditSubscription = namespaceManager.CreateSubscription(myTopic.Path, "ImporterSubscription");
TopicClient topicClient = TopicClient.Create("SampleTopic");
for(int i = 1; i <= 10; i++)
{
var message = new BrokeredMessage("message"+i);
topicClient.Send(message);
}
topicClient.Close();
订阅到服务总线触发器的WebJob具有以下代码:
namespace HO.Importer.Azure.WebJob.TGZProcessor
{
public class Program
{
static void Main(string[] args)
{
JobHostConfiguration config = new JobHostConfiguration();
config.UseServiceBus();
JobHost host = new JobHost(config);
host.RunAndBlock();
}
public static void WriteLog([ServiceBusTrigger("SampleTopic", "ImporterSubscription")] string message,
TextWriter logger)
{
Console.WriteLine(message));
}
}
}
如何实现将队列中的消息作为FIFO进行处理?
提前感谢!
使用SessionId或PartitionKey,这将确保消息由同一消息代理处理。
请参阅:https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning
"SessionId:如果消息设置了BrokeredMessage.SessionId属性,则服务总线将此属性用作分区键。这样,属于同一会话的所有消息都由同一消息代理处理。这使服务总线能够保证消息顺序以及会话状态的一致性。"
虽然Azure服务总线提供FIFO功能(会话),但最好不要在基于代理的排队系统中采取这种行为。Ben Morris在Azure Service Bus中发表了一篇很好的文章"不要假设消息排序",内容是假设使用异步消息排序几乎是一种谬论,以及原因。