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

Messages sent to Topic are getting lost if no subscriptions are specified

在 Azure 服务总线中,如果下面是事件的顺序,那么一切都很好 -

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

如上所述,发送消息时会触发订阅。这是预期的。

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

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

在这种情况下,由于消息被发送到一个主题而没有订阅,当订阅确实被创建时,之前发送的消息不会出现在他们的列表中。这些消息本质上是 'lost'。我也无法在服务总线资源管理器中看到这些消息。

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

如何在创建订阅之前 access/process 向主题发送消息?此类消息首先会发生什么情况?

谢谢

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

为了克服这个问题,Azure 服务总线提供了一个 属性 on topic 来启用消息发送前的预过滤。所以,如果没有 filters/subscriptions 可用,它会抛出异常

设置主题选项

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
}