如何使用Azure服务总线主题完成FIFO

时间:2015-02-24 17:12:05

标签: c# azure azureservicebus

一直在寻找具有发布/订阅功能的消息总线。发现AWS SQS不支持FIFO,因此不得不放弃它。使用Azure Service总线,发现队列确实支持FIFO,但似乎主题不支持FIFO。主题是我们需要的,他们的pub-to-many-sub模型:(

这只是我失踪的一个场景吗?我尝试从我的C#客户端发送100条消息,订阅者以错误的顺序收到消息。任何提示将不胜感激。 谢谢!

2 个答案:

答案 0 :(得分:7)

您可以使用session来获取Azure主题以提供FIFO排序,但这与保证消息处理的顺序并不完全相同。

这里的会话不够保证。例如,如果您使用PeekLock模式,则超时的消息将返回到队列并无序处理。您可以使用ReceiveAndDelete模式来解决此问题,但这意味着您将失去邮件处理的事务性质。

文档可能对这一领域有点启发的原因之一是它不是一个常见的用例。消息传递是关于解耦虽然异步通信和排序保证在应用程序之间创建时间耦合。

理想情况下,您应该设计有效负载,以便排序无关紧要。如果失败,请使用允许您丢弃无序接收的消息的时间戳。

在此处详细讨论:Don’t assume message ordering in Azure Service Bus

答案 1 :(得分:3)

您应该可以通过将属性SupportOrdering设置为true来实现此目的

    // Configure Topic Settings
    TopicDescription td = new TopicDescription("TestTopic");
    td.SupportOrdering = true;

    // Create a new Topic with custom settings
    string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

    var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
    namespaceManager.CreateTopic(td);