【问题标题】:Messages sent to Topic are getting lost if no subscriptions are specified如果未指定订阅,则发送到主题的消息会丢失
【发布时间】:2017-03-29 12:50:09
【问题描述】:

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

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

如上所述,订阅在发送消息时触发。这是意料之中的。

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

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

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

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

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

谢谢

【问题讨论】:

  • 正确,这是“预期”的行为,我相信这是设计使然。在我们的应用程序中,可以在任何新部署中非常频繁地添加新订阅,因此我们通过非常小心和仔细考虑首先部署应用程序的哪些部分来处理这个问题。 IE。消息订阅者需要在发送者之前出现。我没有一个简单的解决方案/答案来克服这个问题。唯一的想法:您可以尝试添加自定义实现以在发送前检查订阅是否存在。但是您可能需要对其进行优化,否则每次都这样做会造成很大的性能损失。

标签: azure azureservicebus


【解决方案1】:

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

为了克服这个问题,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
}

【讨论】:

猜你喜欢
  • 2016-07-21
  • 2019-09-09
  • 2022-07-26
  • 2016-03-31
  • 2019-12-11
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多