0

我有一个 Azure Function 场景如下: 1)如果产品 = 123,则使用服务总线主题 1 2)如果产品 = 456,则使用服务总线主题 2

我认为有两种方法可以解决这个问题:

选项 1:部署相同的 Azure 函数 2 次(2 个不同的名称),每个都有不同的输入/输出映射
选项 2:只有 1 个 Azure 函数,但在应用程序设置中指定输入/输出映射。**据我了解,应用程序设置是关键值。这个对吗?如果没有,我如何在这个参数中指定复数值**。

拥有这个的最好方法是什么?

我正在考虑的是使用不同的设置部署相同的 Azure Functions 2 次,如下所示:

  1. 应用程序设置为“productid”= 123 和“sbTopic”= topic1 的 Azure 函数 1
  2. 应用程序设置为“productid”= 456 和“sbTopic”= topic2 的 Azure Function 2

我想知道是否有更好的方法可以为我的任何输入/输出映射运行相同的 Azure 函数。如果是这样,我在哪里以及如何指定我的输入 (productid) 和输出 (sbTopic) 映射?

编辑 1:这是 CosmosDB 触发器。每当我们在 Cosmos DB 中获得产品时,我想发送到正确的 SB 主题

编辑2:我有类似的东西如下:

Cosmos DB 触发器 --> Azure 函数 --> id=123 的服务总线主题

我正在争论我是否应该如下

Cosmos DB 触发器 --> Azure Function1 --> id=123 的服务总线主题
Cosmos DB 触发器 --> Azure Function2 --> id=456 的服务总线主题
Cosmos DB 触发器 --> Azure Function3 --> 服务总线主题对于 id=789
这意味着我将复制 3 个 AF

或者

Cosmos DB 触发器 --> 1 个 Azure 函数。在 App Settings 中指定映射(产品 id 和 sb 主题)并 --> 在 AF 中添加逻辑,以便:
if id=123 send message to topic1 ;
如果 id=456 向主题 2 等发送消息。

4

2 回答 2

0

您的 Pub/Sub 模型应该由基于订阅规则的主题驱动。以下屏幕片段显示了此模型的示例:

发布子模型

在上面的 Pub/Sub 模型中,发布者触发一个带有应用程序属性的主题以获取更多详细信息,例如productidtype等。服务总线上的主题可以有更多多个订阅实体,用于特定的过滤器(规则)。

订阅者(在本例中为 ServiceBusTrigger 函数)可以在应用设置中配置的TopicNameSubscriptionName上触发。

换句话说,订阅实体(规则)可以决定哪个订阅者将消费事件消息。此 Pub/Sub 模型的另一个优点是用于持续部署,其中每个环境(例如 dev、stage、QA、pre-production、production)具有相同的模型(topicName、subscriptionName、Rules 等),并且只有连接字符串会指定哪个azure 订阅(环境)是当前的订阅。

于 2018-01-30T10:03:19.373 回答
0

@RomanKiss 建议的选项很有意义,这是对服务总线主题和订阅的“规范”使用。

但是,如果您需要执行您的要求,您可以使用单个 Azure 函数和命令式绑定来实现。

首先,不要在function.json.

像这样实现您的功能:

public static void Run([CosmosDBTrigger("...", "...")] Product product, Binder binder)
{
    var topicName = product.Id == "123" ? "topic1" : "topic2";
    var attribute = new ServiceBusAttribute(topicName);

    var collector = binder.Bind<ICollector<string>>(attribute);
    collector.Add("Your message");
}

顺便说一句,如果你部署你的函数两次,你将不得不把它们放在不同的租约集合上,否则它们会相互竞争,而不是两次处理。当产品为 123 时,您必须注意不要将消息发送到主题 1,反之亦然。

于 2018-01-31T09:48:15.010 回答