我正在尝试使用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;
}
答案 0 :(得分:2)
是否可以为订阅设置不同的过滤器?
是。包含所有订阅的单个主题最多可包含2,000个SQL过滤器(100,000个用于相关过滤器)。请参阅文档here。
您无法更新过滤器。您需要删除旧规则并通过创建一个新规则替换它。但是如果你经常在运行时这样做,我会质疑这种方法的效率。
我正在尝试使用Azure服务总线在多个azure函数之间传递消息。
或者,您可以让每个函数都有其输入队列,其中链接这些函数将向适当的Azure Service Bus输入队列发送消息。
最后,
我的目标是每次调用函数时更改过滤器。
如果您有大量的消息,您的功能将被扩展。这意味着,您可以为不同的消息执行相同的功能。每条消息都需要在同一订阅下创建不同的规则。它不仅感觉不合适,而且会在订阅时产生争用,以更新规则,从而导致失败或行为不正确。