如果未指定订阅,发送到主题的消息将丢失
Messages sent to Topic are getting lost if no subscriptions are specified
在 Azure 服务总线中,如果下面是事件的顺序,那么一切都很好 -
- 创建主题
- 在主题内创建订阅
- 向主题发送消息
如上所述,发送消息时会触发订阅。这是预期的。
但是,如果我们像这样修改上面的序列
- 创建主题
- 向主题发送消息
- 在主题内创建订阅
在这种情况下,由于消息被发送到一个主题而没有订阅,当订阅确实被创建时,之前发送的消息不会出现在他们的列表中。这些消息本质上是 '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
}
在 Azure 服务总线中,如果下面是事件的顺序,那么一切都很好 -
- 创建主题
- 在主题内创建订阅
- 向主题发送消息
如上所述,发送消息时会触发订阅。这是预期的。
但是,如果我们像这样修改上面的序列
- 创建主题
- 向主题发送消息
- 在主题内创建订阅
在这种情况下,由于消息被发送到一个主题而没有订阅,当订阅确实被创建时,之前发送的消息不会出现在他们的列表中。这些消息本质上是 '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
}