在 Azure 服务总线中,如果事件顺序如下,则一切正常 -
- 创建主题
- 在主题内创建订阅
- 向主题发送消息
通过上述方式,发送消息时会触发订阅。这是预期的结果。
但是,如果我们像这样修改上面的序列
- 创建主题
- 向主题发送消息
- 在主题内创建订阅
在这种情况下,由于消息发送到主题时没有订阅,因此当确实创建订阅时,以前发送的消息不会显示在其列表中。这些消息基本上已经“丢失”了。我也无法在 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/