【问题标题】:Azure Service Bus Topic subscription with dynamic sql filter query使用动态 sql 筛选器查询的 Azure 服务总线主题订阅
【发布时间】:2018-03-14 01:15:39
【问题描述】:

我正在尝试使用 Azure 服务总线在多个 azure 函数之间传递消息。我正在代码中创建主题和订阅。但不确定如何从代码中添加过滤器查询。我想按 id 过滤消息。例如 SqlFilter($"'id' ='{id}'") 。由于这个过滤器,我不想为每条消息创建一个订阅。

是否可以为订阅设置不同的过滤器?

可以通过为每个请求创建一个订阅并在之后将其删除来解决此问题。但我不想创建这么多订阅。我的目标是每次调用函数时只更改过滤器。

示例代码:

var connectionString = ConfigurationManager.AppSettings["ServiceBus_CONNECTION_STRING"];
                var namespaceManager =
                    NamespaceManager.CreateFromConnectionString(connectionString);
                if (!await namespaceManager.TopicExistsAsync(topicName))
                {
                    // Configure Topic Settings.
                    var topic = new TopicDescription(topicName)
                    {
                        MaxSizeInMegabytes = 1024,
                        DefaultMessageTimeToLive = TimeSpan.FromMinutes(5)
                    };

                    await namespaceManager.CreateTopicAsync(topic);
                }

                if (!await namespaceManager.SubscriptionExistsAsync(topicName, subscription))
                {
                    await namespaceManager.CreateSubscriptionAsync(topicName, subscription);
                }

                var cts = new TaskCompletionSource<T>();
                var subClient =
                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName,
                        subscription);

                var ruleDescription = new RuleDescription($"RequestIdRule{id}", new SqlFilter($"'id' ='{id}'"));

                await subClient.AddRuleAsync(ruleDescription);
                var options = new OnMessageOptions();

                subClient.OnMessage(m =>
                    {
                        try
                        {

                            var body = m.GetBody<T>();
                            cts.SetResult(body);
                        }
                        catch (Exception ex)
                        {

                            m.Abandon();
                        }
                    },
                    options);

                return await cts.Task;

            }
            catch (Exception ex)
            {
                throw;
            }

【问题讨论】:

    标签: azure azure-functions azureservicebus azure-servicebus-topics


    【解决方案1】:

    是否可以为订阅设置不同的过滤器?

    是的。具有所有订阅的单个主题最多可以有 2,000 个 SQL 过滤器(相关过滤器为 100,000 个)。请参阅文档here。

    您无法更新过滤器。您需要删除旧规则并通过创建一条新规则将其替换。但如果您在运行时经常这样做,我会质疑这种方法的效率。

    我正在尝试使用 Azure 服务总线在多个 azure 函数之间传递消息。

    或者,您可以让每个函数都有其输入队列,其中链接这些函数将向相应的 Azure 服务总线输入队列发送消息。

    最后,

    我的目标是在每次调用函数时更改过滤器。

    如果您有大量消息,您的功能将被横向扩展。这意味着,您可以为不同的消息执行相同的功能。每条消息都需要在同一订阅下创建不同的规则。不仅感觉不妥,而且会在订阅更新规则时产生争用,这将导致失败或不正确的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      相关资源
      最近更新 更多