当前位置: 首页 > 知识库问答 >
问题:

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

丁阎宝
2023-03-14

下午好.

我们使用服务总线主题作为pub/sub系统的引擎。我们的逻辑涉及我们的C#服务通过订阅与主题挂钩。我们删除$default(TrueFilter),并将AutoDeleteOnIdle设置为5分钟。

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

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

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

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

但后来我开始怀疑:

  • 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将收到的所有消息转发到其他notify主题。我们这样做是为了切分。

所以...

    null

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

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

此外,Service Bus没有删除一些订阅,这些订阅要么是由于没有规则而没有接收消息,要么是因为有FalseFilter。SubscriptionClient实例确实通过OnMessageAsync连接了回调。值得注意的是,未被删除的订阅与未被删除的TrueFilter订阅在同一个主题中。

共有1个答案

程招
2023-03-14

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

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

然而,我们的服务总线主题订阅仍然在一些主题中消失。在AutoDeleteOnIdle时仍在删除它们。我从来没能在我的开发框上复制这个问题。

 类似资料:
  • 我们使用服务总线主题作为pub/sub系统的引擎。我们的逻辑涉及我们的NodeJS服务用多个订阅连接到一个主题。对于每个订阅,我们删除$default(TrueFilter),并在消息头的Label属性上创建一个CorrelationFilter,并且不在订阅中应用AutoDeleteOnIdle设置,因为我们希望确保订阅服务器功能在服务启动之前一直运行。 这个问题可以归结为这样:某件事能导致规则

  • https://github.com/azure/azure-service-bus/tree/master/samples/dotnet/gettingstart/microsoft.azure.servicebus/topicsubscriptionwithruleoperationssample 现在我想添加一个筛选器/规则,这样只有通过筛选器中定义的特定条件的消息才应该给订阅。 例如,下面

  • 我试着按照1给出的教程学习。我创建了一个主题,其中有两个主题的订阅,分别使用sqlFilter(user_age<50)和(user_age>=50)。我为消息定义了一个自定义属性user_age。但当我发送关于这个主题的消息时,两个订阅都收到相同的消息,这是胡说八道!知道吗? 我的代码完全是从tuto中给出的代码中获得灵感的,只是我使用这段代码接收来自给定订阅的消息:

  • 我之所以要这样做,是因为我们的服务在部署时配置订阅规则,并且具有消息代理的服务可能会在具有订阅客户端的服务更改规则集和新的业务逻辑之前部署该服务,该服务会发送一组新的消息。我们不希望丢失在部署期间发送的消息,并在新服务退出时处理它们。 干杯。

  • 我已经能够弄清楚如何设置Azure ARM模板,该模板创建/管理Azure服务总线名称空间、主题和订阅,以接收所有消息。但是,ARM Tempates上的Microsoft文档仍然非常缺乏,我无法弄清楚如何在模板中为订阅定义一个SqlFilter,您可以使用.NET SDK管理该模板。 有人知道如何在ARM模板中向服务总线主题订阅添加Sql筛选器吗? 这里有一个ARM模板的链接,用于创建服务总线主