C# Azure服务总线主题订户接收订单
我正在使用azure service bus主题作为解决方案的消息代理。根据我对每个订阅的理解,Azure消息总线保持一个虚拟队列,因此在接收端消息的顺序不应受到干扰 但事实上,在我的场景中,情况有点不同 大约每两秒钟输入一次,时间戳是正确的,我已经验证过了 如果我断开接收器的连接一段时间,消息就会开始在Azure上排队等待订阅。 然后,如果我再次连接receiver,接收代码会非常快地接收消息,但不会保持顺序? 但是,如果我保持客户端连接,则会在两秒钟后按顺序1消息接收消息 接收代码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提供了先进先出的服务,但这只在不间断的会话中有效。正如您所经历的: 但是,如果我保持客户端连接,则会按顺序接收消息 要解决这个问题,您可以使用不同的模式。 查看下面链接中的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