如果设置了AutoDeleteOnIdle,服务总线是否会删除没有过滤器/规则的主题订阅?

时间:2019-01-15 17:15:15

标签: c# azure azureservicebus servicebus azure-servicebus-topics

下午好。

我们正在使用服务总线主题作为发布/订阅系统的引擎。我们的逻辑涉及C#服务与订阅相关的主题。我们删除$ Default(TrueFilter)并将AutoDeleteOnIdle设置为5分钟。

当系统的其他部分需要东西时,他们告诉我们的C#服务,“我需要这个”。然后,C#服务会添加新规则(通常为CorrelationFilter)。

由于系统的那些相同部分不再需要东西,他们告诉我们的C#服务,“我不再需要它了。”然后,C#服务将删除相应的规则。

这样,主题订阅仍然可以连接(用SubscriptionClient对象完成),但是根本没有规则。

问题

订阅“消失了”,我无法确定为什么。毕竟,我拥有一个带有SubscriptionClient实例的有效订阅,并且已连接了一个回调函数。

然后,当我对SubscriptionClient对象执行操作时,它将引发MessagingEntityNotFoundException。

在我看来,Service Bus似乎是随机任意丢失或删除我的订阅。

服务总线的“空闲”定义

我的理解是,只要存在到订阅的活动连接(在我的情况下是通过SubscriptionClient实例),订阅就不会“空闲”。即使没有感兴趣的消息通过,它仍然不是空闲的,因此仍然没有被删除。如果一天后收到消息,则SubscriptionClient实例将收到该消息。

这是我对系统其他不动态添加/删除规则的部分的经验。效果很好。

但是后来我开始怀疑:

尽管与订阅有连接,但Service Bus是否将我的订阅视为空闲,因为它没有规则,因此可能无法接收消息?然后Service Bus会跟随AutoDeleteOnIdle属性并将其删除吗?

如果以上情况正确,那么是否将FalseFilter作为$ Default保留订阅?

我们将不胜感激和帮助。

非常感谢 -肖恩

更新

我在WinForms应用程序中进行了基本测试,而Service Bus似乎从根本上错了。或者至少是我们的服务总线实例。

我有17个主题,如下:

  • d860ffbe-e9c6-4ede-b6e9-959be4373128 / notify-0
  • d860ffbe-e9c6-4ede-b6e9-959be4373128 / notify-1
  • ...(你明白了)
  • d860ffbe-e9c6-4ede-b6e9-959be4373128 / notify-e
  • d860ffbe-e9c6-4ede-b6e9-959be4373128 / notify-f
  • d860ffbe-e9c6-4ede-b6e9-959be4373128 / notify-root

notify-root将收到的所有消息转发到其他通知主题。我们这样做是为了分片。

所以...

我在0到f个主题中的每个主题上创建了3个订阅:

  • 没有规则(我删除了$ Default)
  • TrueFilter(我保留了$ Default的样子)
  • FalseFilter(我在创建订阅时将默认过滤器设置为FalseFilter)

我为这48个订阅中的每个订阅创建了一个SubscriptionClient实例,并将这些实例保留在内存中。我还使用OnMessageAsync方法传递了一个回调,该回调告诉我何时写入消息。

每个订阅的AutoDeleteOnIdle设置为TimeSpan.FromMinutes(5)。

我每1分钟浏览一次主题,订阅和规则,以查看订阅和规则何时出现和消失。

最后,我每1分钟在notify-root上发布一条消息。

使用TrueFilter的16个订阅中的每个订阅都每分钟收到一条消息,并按预期方式显示在我的WinForms应用程序中。

在5分钟时,Service Bus自动删除我所有以0、1、2、4、5、6,B,C和F结尾的主题的订阅。

Service Bus删除了这些订阅,尽管它们不是空闲的,并且在删除前不到1分钟的时间内主动接收到消息。

大约30分钟后,以3、7、8、9,A和E结尾的主题仍然收到消息,没有删除订阅的迹象。

此外,Service Bus不会删除由于没有规则或具有FalseFilter而没有收到消息的订阅的一些。 SubscriptionClient实例 did 具有通过OnMessageAsync连接的回调。值得注意的是,未删除的订阅与未删除的TrueFilter订阅处于同一主题。

尽管有其他活动,但似乎正在从一些主题中删除订阅。

我重复了测试,正是由于相同的主题,他们的订阅被删除了(尽管有活动)。

一旦我停止发布,Service Bus将在5分钟后删除剩余的订阅(如预期的那样)。

我将用不同的17个主题重复测试。

1 个答案:

答案 0 :(得分:0)

事实证明,AutoDeleteOnIdle的工作方式与我认为的方式完全相同。

只要主题订阅具有连接,就不应将其删除。您没有规则,FalseFilter或没有消息发布都没有关系。只要您具有活动的连接,并且当前正在尝试使用OnMessage(),OnMessageAsync(),Receive()或ReceiveAsync()来获取消息,则订阅 不会闲置并且不会被删除< / em>

但是,我们的服务总线主题订阅仍从主题的 some 中消失。它们仍在AutoDeleteOnIdle时间被删除。我从没能在开发箱中重现该问题。

在过去的几个月中,我们在生产环境中遇到了这个问题,但情况只会变得更糟。我们以为我们做错了什么。

碰巧的是,微软今天向我证实了他们在美国西部2区的问题。没有其他地区受到影响。 MS尚未确认发生的原因,发生的时间或纠正时间。

这是我梦imagine以求的最后一件事。我以为我做错了什么。

最令人困扰的是,这个问题存在了多长时间而未被Microsoft发现。

希望它将很快得到修复。

如果有人遇到Service Bus订阅但尽管活动消失或被删除的情况,我建议像我一样进行测试。如果测试结果与预期不符,请与Microsoft联系。