azure - 如果未指定订阅,发送到主题的消息将会丢失

标签 azure azureservicebus

在 Azure 服务总线中,如果事件顺序如下,则一切正常 -

  1. 创建主题
  2. 在主题内创建订阅
  3. 向主题发送消息

通过上述方式,发送消息时会触发订阅。这是预期的结果。

但是,如果我们像这样修改上面的序列

  1. 创建主题
  2. 向主题发送消息
  3. 在主题内创建订阅

在这种情况下,由于消息发送到主题时没有订阅,因此当确实创建订阅时,以前发送的消息不会显示在其列表中。这些消息基本上已经“丢失”了。我也无法在 Service Bus Explorer 中看到这些消息。

上面的序列流是相关的,因为我们有分离的发布者和订阅者,其中发布者只发送一条消息,而订阅者在上线时创建订阅并处理它们。不保证发布者和订阅者上线的顺序。

如何在创建订阅之前访问/处理发送到主题的消息?此类消息首先会发生什么?

谢谢

最佳答案

事实证明,上述行为是设计使然 - 如果没有订阅,那么消息就会丢失。

为了克服这个问题,Azure 服务总线提供了一个主题属性,以便在发送消息之前启用消息预过滤。因此,如果没有可用的过滤器/订阅,它将抛出异常

设置主题选项

namespaceManager.CreateTopicAsync(new TopicDescription(topicName)
{
    EnableFilteringMessagesBeforePublishing = true
});

发送消息时,检查是否有异常

try
{
    await topicClient.SendAsync(brokeredMessage);
}
catch (NoMatchingSubscriptionException ex)
{
 // handle the exception, maybe send it to dead letter queue using DeadLetterAsync
}

关于azure - 如果未指定订阅,发送到主题的消息将会丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613216/

相关文章:

azure - 如何使用ARM模板设置访问限制?

Azure VM 虚拟网络相互通信

c# - Azure 服务总线队列在 NodeJs 中向 .NET 客户端发送消息

azure - 使用队列订阅 Azure 服务总线主题

azure - V4函数应用程序中的MessageId、Delivery Count、ScheduledEnqueueTime、Deadletter方法和abandon Method()在哪个类中可用

azure - 在 Azure API 管理中解密不记名 token 以获取 acr_values

c# - WCF 参数丢失值

azure - Azure 上的事务性电子邮件服务

azure - Azure 事件中心如何使用 Azure 服务总线

Azure 服务总线主机名冲突解决