【问题标题】:How to accomplish FIFO with Azure service bus topics如何使用 Azure 服务总线主题完成 FIFO
【发布时间】:2015-04-26 10:39:36
【问题描述】:

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

这只是我缺少的设置吗?我尝试从我的 C# 客户端发送 100 条消息,但订阅者收到的消息顺序错误。任何提示将不胜感激。 谢谢!

【问题讨论】:

  • 不熟悉 Azure。但是使用 WCF,您可以使用以下方式装饰您的合同: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, )] 也许 Azure 也有类似的东西?
  • 我向topic发布了消息,数据为messageId从0到99。在接收端,订阅者显示他们在91之前收到了93等等。

标签: c# azure azureservicebus


【解决方案1】:

您应该能够通过将属性 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);

【讨论】:

  • 我发现这个链接似乎说 SupportOrdering 只适用于一个消费者。如果是这样,我们回到 Azure 服务总线队列,不是吗? social.msdn.microsoft.com/Forums/windowsserver/en-US/…
  • 是的...如果是这种情况,您可能需要使用其他方法。但是您对此进行了测试吗?
  • 我做到了。 FIFO 似乎确实适用于同一主题的多个消费者。再次感谢!有点奇怪,我在 SupportOrdering 标志上找不到任何来自 Microsoft 的真实文档。
【解决方案2】:

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

在这里,会话不足以保证。例如,如果您使用PeekLock 模式,那么超时的消息将返回队列并被乱序处理。您可以使用ReceiveAndDelete 模式来应对这种行为,但这意味着您失去了消息处理的事务性质。

文档可能对这方面的内容不太了解的原因之一是它不是一个常见的用例。消息传递是关于通过异步通信和排序保证在应用程序之间创建临时耦合来解耦。

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

这里有更详细的讨论:Don’t assume message ordering in Azure Service Bus

【讨论】:

  • 我已经问了一个后续问题,您的担忧仍然有效stackoverflow.com/questions/69950471/…。为什么超时返回队列的消息会被乱序处理?你能提供任何参考来确认吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 2019-07-25
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多