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个主题,如下:
notify-root 将它收到的所有消息转发到其他通知主题。我们这样做是为了分片。
所以...
我在 0 到 f 主题中的每一个上创建了 3 个订阅:
我为这 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 个主题重复测试。
事实证明,AutoDeleteOnIdle 的工作方式与我想象的完全一样。
只要主题订阅有连接,就不应该删除它。无论您是否没有规则、FalseFilter 或没有消息发布,都没有关系。只要您有活动连接并且当前正在尝试使用 OnMessage()、OnMessageAsync()、Receive() 或 ReceiveAsync() 获取消息,那么订阅就不会空闲,也不会被删除。
但是,我们的服务总线主题订阅仍然从某些主题中消失。它们仍在 AutoDeleteOnIdle 时间被删除。我无法在我的开发盒上重现该问题。
过去几个月我们的生产环境中一直存在这个问题,而且情况只会变得更糟。我们以为我们做错了什么。
碰巧的是,微软今天向我证实,他们的美国西部 2 区域存在此问题。其他地区不受影响。MS 尚未确认发生这种情况的原因、发生的时间以及需要多长时间进行纠正。
这是我最不敢想象的事情。我以为我做错了什么。
最令人不安的是这个问题存在了多久而没有被微软发现。
希望它能尽快得到修复。
如果其他人遇到服务总线订阅在活动中消失或被删除的情况,我建议像我一样构建一个测试。如果测试未按预期运行,请联系 Microsoft。
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |