繁体   English   中英

Azure Service Bus主题订阅者收到订单

[英]Azure Service Bus Topic Subscriber receiving order

我正在使用azure服务总线主题作为解决方案的消息代理。 据我了解,对于每个订阅,Azure消息总线都会保留一个虚拟队列 ,因此在接收消息的结束顺序时不应受到干扰。

但实际上有点不同,在我的情况下

  • 输入大约每隔两秒钟一次,(时间戳是正确的,我已经验证了)
  • 如果我断开接收器的连接一段时间,则消息开始在Azure上针对订阅排队。
  • 然后,如果我再次连接接收者,接收代码会很快接收到消息,但是顺序是否保持不变?
  • 但是,如果我保持客户端连接状态,则会按顺序接收消息(两秒钟后有1条消息)

接收码

SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, topicname, subscription_name);

                // Configure the callback options.
                OnMessageOptions options = new OnMessageOptions();
                options.AutoComplete = false;
                options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

                // Callback to handle received messages.
                Client.OnMessage((message) =>
                {
                    try
                    {
                        // Process message from queue.
                        string payload = message.GetBody<string>();
                        var myData = JsonConvert.DeserializeObject<MyData>(payload);
                        if(myData != null)
                        {

                            //Timestamp is not in order, when I connect after few minutes
                            Debug.WriteLine("SBC ==> " + myData.Timestamp);

                        }
                        // Remove message from queue.
                        message.Complete();
                    }
                    catch (Exception)
                    {
                        // Indicates a problem, unlock message in queue.
                        message.Abandon();
                    }
                }, options);

输出量

SBC ==> 5/23/2017 1:06:43 PM
SBC ==> 5/23/2017 1:06:45 PM
SBC ==> 5/23/2017 1:07:23 PM
SBC ==> 5/23/2017 1:07:19 PM
SBC ==> 5/23/2017 1:07:27 PM
SBC ==> 5/23/2017 1:07:07 PM
SBC ==> 5/23/2017 1:06:49 PM
SBC ==> 5/23/2017 1:07:47 PM
SBC ==> 5/23/2017 1:06:47 PM
SBC ==> 5/23/2017 1:08:03 PM
SBC ==> 5/23/2017 1:06:55 PM
SBC ==> 5/23/2017 1:06:51 PM
SBC ==> 5/23/2017 1:07:03 PM
SBC ==> 5/23/2017 1:07:51 PM
SBC ==> 5/23/2017 1:06:57 PM
SBC ==> 5/23/2017 1:07:05 PM
SBC ==> 5/23/2017 1:07:39 PM
SBC ==> 5/23/2017 1:07:43 PM
SBC ==> 5/23/2017 1:06:59 PM
SBC ==> 5/23/2017 1:07:09 PM
SBC ==> 5/23/2017 1:06:53 PM
SBC ==> 5/23/2017 1:07:33 PM
SBC ==> 5/23/2017 1:07:25 PM
SBC ==> 5/23/2017 1:07:57 PM
SBC ==> 5/23/2017 1:08:13 PM

有人可以解释为什么吗? 这让我有点困惑?

虽然天蓝色服务总线将其自身作为FIFO(先进先出)提供,但实际上仅在不中断的会话期间有效。 如您所经历的:

但是,如果我保持客户端连接状态,则会按顺序接收消息

要解决此问题,您可以使用其他模式。 在下面的链接中查看ReceiveAndDelete和PeekLock模式。

服务总线文档

这是一些相关的堆栈溢出文章,可能会对您有所帮助。

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

如何保证天蓝色队列FIFO

编辑

此链接包含有关FIFO的一些详细信息

以下是该文档的引文,该引文指定您需要使用消息传递会话才能获得FIFO。

服务总线队列中有保证的FIFO模式需要使用消息传递会话。 如果应用程序在处理以“偷窥和锁定”方式接收的消息时崩溃,则队列接收者下一次接受消息传递会话时,将在其生存时间(TTL)期限到期后从失败的消息开始。

在实现消息会话方面,文档似乎相当缺乏,但据我了解,它来自MessageSession类,它是AcceptMessageSession方法。

就像@NPhillips所说的那样,您需要使用ASB的Message Sessions功能来实现FIFO行为。 这意味着几件事,需要注意:

  1. 接收者一次只会处理一个会话
  2. 并发处理是不可能的,无论处理什么时间,您都会收到一条消息。
  3. 发件人需要为每个消息分配会话ID。

最好的样本和解释将是一个张贴由ASB团队在GitHub上这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM