gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:38:16 25 4
gpt4 key购买 nike

下午好。

我们使用服务总线主题作为发布/订阅系统的引擎。我们的逻辑涉及我们的 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 个主题重复测试。

    最佳答案

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

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

    然而,我们的服务总线主题订阅仍然从一些主题中消失。在 AutoDeleteOnIdle 时间它们仍然被删除。我永远无法在我的开发箱上重现这个问题。

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

    碰巧的是,微软今天向我证实,他们的美国西部 2 地区有这个问题。其他地区不受影响。 MS 尚未确认其发生的原因、发生的时间或需要多长时间才能纠正。

    这是我能想到的最后一件事。我以为我做错了什么。

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

    希望它会很快得到修复。

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

    关于c# - 如果设置了 AutoDeleteOnIdle,服务总线是否删除没有过滤器/规则的主题订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54203806/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com