2015-02-24 92 views
3

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

这只是我缺少的一个设置吗?我尝试从我的C#客户端发送100条消息,并且订阅者获得了消息错误的命令。任何提示,将不胜感激。 谢谢!

+0

不熟悉Azure。但是对于WCF,您可以用以下方式来修饰您的合同:[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Single,)]也许Azure有类似的东西吗? – 2015-02-24 17:46:46

+0

什么“错误的顺序”? – 2015-02-24 18:00:06

+0

我发布消息的主题与数据被messageId从0到99.在接收端,用户表明他们已经收到93之前91等 – Rajesh 2015-02-24 18:10:57

回答

2

您应该能够通过财产SupportOrdering设置为实现这一真正的

// 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); 
+0

我发现这个链接似乎说SupportOrdering只适用于一个消费者。如果是这样的话,我们又回到了Azure服务总线队列,我们​​不是吗? https://social.msdn.microsoft.com/Forums/windowsserver/en-US/cb32114e-17ba-4acd-84f3-51abb81d2195/does-service-bus-topics-guarantee-ordered-message-delivery?forum=servbus – Rajesh 2015-02-24 22:09:10

+0

是的......如果是这种情况,你可能会想使用其他方法。但你有没有测试过这个? – 2015-02-24 22:56:17

+0

我做到了。而FIFO似乎与多个消费者一起工作于同一主题。再次感谢!有点奇怪,我无法从Microsoft SupportOrdering标志中找到任何真实的文档。 – Rajesh 2015-02-25 18:17:30

3

您可以使用会话来获得一个蓝色的主题,以提供FIFO排序,但这与保证邮件处理的顺序不同

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

为什么文档可能在这个领域有点光明的原因之一是它不是一个常见的用例。消息传递关于解耦,尽管异步通信和排序保证会在应用程序之间创建时间耦合。

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

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