Выполнение той же функции Azure, но для разных входных значений в настройках приложения
У меня есть сценарий функции Azure следующим образом: 1) Если продукт = 123, то использовать раздел шины обслуживания1 2) Если продукт = 456, тогда использовать раздел шины обслуживания 2
Я думаю, что есть 2 варианта, чтобы решить эту проблему:
ВАРИАНТ 1. Развертывание одной и той же функции Azure 2 раза (с двумя именами различий), каждое из которых имеет свое сопоставление ввода / вывода.
ВАРИАНТ 2: Имейте только 1 функцию Azure, но в настройках приложения укажите сопоставление ввода / вывода. ** Насколько я понимаю, настройка приложения является ключевым значением. Это правильно? если нет, как я могу указать комплексное значение в этом параметре **.
Каков наилучший способ получить это?
Я думаю о том, чтобы развернуть одни и те же функции Azure 2 раза с различными настройками следующим образом:
- Функция Azure 1 с параметрами приложения в виде "productid" = 123 и "sbTopic" = topic1
- Функция Azure 2 с настройками приложения в виде "productid" = 456 и "sbTopic" = topic2
Мне интересно, есть ли лучший способ, чтобы одна и та же функция Azure могла работать для любого из моих отображений ввода / вывода. Если да, где и как мне указать мои входные (productid) и выходные (sbTopic) отображения?
РЕДАКТИРОВАТЬ 1: это CosmosDB Trigger. Всякий раз, когда мы получаем продукты в БД Космос, я хочу отправить на правильную тему SB
РЕДАКТИРОВАТЬ 2: у меня есть что-то похожее следующим образом:
Триггер Cosmos DB -> Функция Azure -> Раздел служебной шины для id=123
Я спорю, если я должен иметь следующее
Космический триггер БД -> Azure Function1 -> Раздел служебной шины для id=123
Космический триггер БД -> Azure Function2 -> Раздел служебной шины для id=456
Триггер Cosmos DB -> Azure Function3 -> Раздел служебной шины для id=789
а это значит, что я бы 3 дублированных AF
так далее
или же
Cosmos DB Trigger -> 1 функция Azure. Укажите сопоставления (идентификатор продукта и тема sb) в настройках приложения и -> добавить логику в AF так, чтобы:
если id=123 отправить сообщение в topic1;
если id=456 отправить сообщение в тему 2 и т. д.
2 ответа
Опция, предложенная @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");
}
Кстати, если вы развернете свою функцию два раза, вам придется поместить их в разные коллекции аренды, иначе они будут конкурировать друг с другом, а не выполнять обработку дважды. И вам нужно позаботиться о том, чтобы НЕ отправлять сообщение в тему 1, когда продукт равен 123, и наоборот.
Ваша модель Pub/Sub должна управляться темой на основе правил подписки. Следующий фрагмент экрана показывает пример этой модели:
В приведенной выше модели Pub/Sub издатель запускает тему со свойствами приложения для получения дополнительных сведений, таких как productid, тип и т. Д. В теме на служебной шине может быть несколько объектов подписок для определенных фильтров (правил).
Subscriber (в этом примере, функция ServiceBusTrigger) может быть запущен на TopicName и SubscriptionName, настроенных в настройках приложения.
Другими словами, объект подписки (правила) может решить, какой подписчик будет использовать сообщение о событии. Также преимущество этой модели Pub/Sub заключается в непрерывном развертывании, где каждая среда, такая как dev, stage, QA, pre-production, production, имеет одинаковую модель (topicName, subscriptionName, Rules и т. Д.), И только строка подключения будет указывать, какая подписка Azure (среда) является текущей.