Azure 如果未指定订阅,则发送到主题的邮件将丢失

Azure 如果未指定订阅,则发送到主题的邮件将丢失,azure,azureservicebus,Azure,Azureservicebus,在Azure服务总线中,如果下面是事件的顺序,则一切正常- 创建主题 在主题内创建订阅 向主题发送消息 在上述情况下,在发送消息时会触发订阅。这是意料之中的 但是,如果我们像这样修改上面的序列 创建主题 向主题发送消息 在主题内创建订阅 在这种情况下,由于在没有订阅的情况下将消息发送到主题,因此当确实创建了订阅时,以前发送的消息不会显示在其列表中。这些信息基本上是“丢失的”。我也无法在服务总线资源管理器中看到这些消息 上面的序列流是相关的,因为我们分离了发布者和订阅者,发布者只发送消息,订阅者在

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

  • 创建主题
  • 在主题内创建订阅
  • 向主题发送消息
  • 在上述情况下,在发送消息时会触发订阅。这是意料之中的

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

  • 创建主题
  • 向主题发送消息
  • 在主题内创建订阅
  • 在这种情况下,由于在没有订阅的情况下将消息发送到主题,因此当确实创建了订阅时,以前发送的消息不会显示在其列表中。这些信息基本上是“丢失的”。我也无法在服务总线资源管理器中看到这些消息

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

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


    谢谢

    事实证明,上述行为是故意的——如果没有订阅,则消息将丢失

    为了克服这一问题,Azure Service Bus在主题上提供了一个属性,以便在消息发送之前对其进行预筛选。因此,如果没有可用的筛选器/订阅,它将抛出异常

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

    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
    }
    

    正确,这是“预期”行为,我相信这是故意的。在我们的应用程序中,新的订阅可以非常频繁地添加到任何新的部署中,因此我们在处理这一问题时会非常小心和慎重地考虑首先部署应用程序的哪些部分。即,消息订阅者需要在发送者之前到达。我没有一个简单的解决方法/答案来克服这个问题。唯一的想法是:您可以尝试添加自定义实现,以在发送之前检查订阅是否存在。但您可能需要对其进行优化,否则每次都会造成很大的性能损失。请注意,此功能仅用于开发和测试,而不是用于生产。考虑到上面关于在产品发布之前不使用EnableFilteringMessages的评论,没有真正的解决方案。