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

Sha*_*aun 7 c# servicebus azure azureservicebus azure-servicebus-topics

下午好。

我们使用服务总线主题作为发布/订阅系统的引擎。我们的逻辑涉及我们的 C# 服务通过订阅连接到一个主题。我们删除 $Default (TrueFilter) 并将 AutoDeleteOnIdle 设置为 5 分钟。

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

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

因此,主题订阅仍然可以连接(通过 SubscriptionClient 对象完成)但根本没有规则。

问题

订阅“消失”了,我不知道为什么。毕竟,我有一个带有 SubscriptionClient 实例的活动订阅和一个回调函数。

然后,当我使用我的 SubscriptionClient 对象执行操作时,它会抛出 MessagingEntityNotFoundException。

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

服务总线对“空闲”的定义

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

这是我对不动态添加/删除规则的系统其他部分的经验。它运作良好。

但后来我开始想:

尽管已连接到订阅,Service Bus 是否将我的订阅视为空闲,因为它没有规则,因此不可能接收消息?然后服务总线会遵循 AutoDeleteOnIdle 属性并删除它吗?

如果上述情况属实,那么会添加一个 FalseFilter 作为 $Default 保持订阅有效吗?

任何见解和帮助将不胜感激。

非常感谢 - 肖恩

更新

我在 WinForms 应用程序中做了一个基本的测试,服务总线似乎有一些根本性的错误。或者,至少,我们的服务总线实例。

我有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 实例确实通过 OnMessageAsync 连接了一个回调。值得注意的是,没有被删除的订阅与也没有被删除的 TrueFilter 订阅在同一主题中。

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

我重复了测试,删除订阅的主题完全相同(尽管有活动)。

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

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

Sha*_*aun 5

事实证明,AutoDeleteOnIdle 的工作方式与我想象的完全一样。

只要主题订阅有连接,就不应该删除它。无论您是否没有规则、FalseFilter 或没有消息发布,都没有关系。只要您有活动连接并且当前正在尝试使用 OnMessage()、OnMessageAsync()、Receive() 或 ReceiveAsync() 获取消息,那么订阅就不会空闲,也不会被删除

但是,我们的服务总线主题订阅仍然从某些主题中消失。它们仍在 AutoDeleteOnIdle 时间被删除。我无法在我的开发盒上重现该问题。

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

碰巧的是,微软今天向我证实,他们的美国西部 2 区域存在此问题。其他地区不受影响。MS 尚未确认发生这种情况的原因、发生的时间以及需要多长时间进行纠正。

这是我最不敢想象的事情。我以为我做错了什么。

最令人不安的是这个问题存在了多久而没有被微软发现。

希望它能尽快得到修复。

如果其他人遇到服务总线订阅在活动中消失或被删除的情况,我建议像我一样构建一个测试。如果测试未按预期运行,请联系 Microsoft。

  • 空闲的定义:https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-expiration#idleness 另外,在我的开发中,当我的笔记本电脑进入睡眠状态并因此丢失时,我会定期丢失订阅连接时间超过配置的超时时间 (2认同)