C# Azure服务总线主题订户接收订单

C# Azure服务总线主题订户接收订单,c#,azure,message-queue,messagebroker,azure-servicebus-topics,C#,Azure,Message Queue,Messagebroker,Azure Servicebus Topics,我正在使用azure service bus主题作为解决方案的消息代理。根据我对每个订阅的理解,Azure消息总线保持一个虚拟队列,因此在接收端消息的顺序不应受到干扰 但事实上,在我的场景中,情况有点不同 大约每两秒钟输入一次,时间戳是正确的,我已经验证过了 如果我断开接收器的连接一段时间,消息就会开始在Azure上排队等待订阅。 然后,如果我再次连接receiver,接收代码会非常快地接收消息,但不会保持顺序? 但是,如果我保持客户端连接,则会在两秒钟后按顺序1消息接收消息 接收代码 有人能解

我正在使用azure service bus主题作为解决方案的消息代理。根据我对每个订阅的理解,Azure消息总线保持一个虚拟队列,因此在接收端消息的顺序不应受到干扰

但事实上,在我的场景中,情况有点不同

大约每两秒钟输入一次,时间戳是正确的,我已经验证过了 如果我断开接收器的连接一段时间,消息就会开始在Azure上排队等待订阅。 然后,如果我再次连接receiver,接收代码会非常快地接收消息,但不会保持顺序? 但是,如果我保持客户端连接,则会在两秒钟后按顺序1消息接收消息 接收代码


有人能解释一下为什么会这样吗?这让我有点困惑?

虽然azure service bus提供了先进先出的服务,但这只在不间断的会话中有效。正如您所经历的:

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

要解决这个问题,您可以使用不同的模式。 查看下面链接中的ReceiveAndDelete和PeekLock模式

下面是一些相关的堆栈溢出帖子,可能会对您有所帮助

编辑

下面是该文档中的一段引用,它指定您需要使用消息传递会话才能获得FIFO

服务总线队列中有保证的FIFO模式需要使用消息传递会话。如果应用程序在处理以Peek&Lock模式接收的消息时崩溃,那么下次队列接收方接受消息会话时,它将在其生存时间TTL期限到期后以失败消息启动


文档似乎在实现消息会话方面相当缺乏,但据我所知,它来自MessageSession类,它是AcceptMessageSessionmethod,而azure service bus提供了先进先出的功能,这只在不间断会话中有效。正如您所经历的:

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

要解决这个问题,您可以使用不同的模式。 查看下面链接中的ReceiveAndDelete和PeekLock模式

下面是一些相关的堆栈溢出帖子,可能会对您有所帮助

编辑

下面是该文档中的一段引用,它指定您需要使用消息传递会话才能获得FIFO

服务总线队列中有保证的FIFO模式需要使用消息传递会话。如果应用程序在处理以Peek&Lock模式接收的消息时崩溃,那么下次队列接收方接受消息会话时,它将在其生存时间TTL期限到期后以失败消息启动


文档似乎在实现消息会话方面相当缺乏,但据我所知,它来自MessageSession类,它是AcceptMessageSessionmethod,正如@NPhillips所说,您需要使用ASB的消息会话功能来实现FIFO行为。这意味着需要注意以下几点:

接收器一次只能处理一个会话 并发处理是不可能的,无论处理时间长短,您都只能处理一条消息。 发件人需要为每条邮件分配会话ID。
最好的示例和解释是ASB团队在GitHub上发布的示例和解释。

正如@NPhillips所说,您需要使用ASB的消息会话功能来实现FIFO行为。这意味着需要注意以下几点:

接收器一次只能处理一个会话 并发处理是不可能的,无论处理时间长短,您都只能处理一条消息。 发件人需要为每条邮件分配会话ID。
最好的示例和解释应该是ASB团队在GitHub上发布的示例和解释。

谢谢您的评论,您可以参考MSDN上的一些文档吗?您遇到的问题是,当您断开接收器的连接时,超时的消息在设定的时间后开始重试。这会导致它们丢失发送的顺序。描述了什么?这将是非常有帮助的。将添加到答案中。已从问题中删除您引用的部分,因为我无法提供可靠的来源。我不久前就遇到过这个问题,这是我对这个问题的理解,但是如果没有文档支持,我的话当然没什么用。您可能会发现这篇博文很有用,尽管我怀疑它有点过时:谢谢您的评论,您可以参考MSDN上的一些文档吗?您遇到的问题是,当您断开接收器的连接时,超时的消息在设定的时间后开始重试。这会导致它们丢失发送的顺序。描述了什么?这将是非常有帮助的。将添加到答案。已删除您引用的部分f 因为我无法提供一个可靠的来源,所以我无法回答这个问题。我不久前就遇到过这个问题,这是我对这个问题的理解,但是如果没有文档支持,我的话当然没什么用。你可能会发现这篇博文很有用,尽管我怀疑它有点过时:
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