Несколько триггеров Azure EventHub для одной функции в приложении Azure Function
Я хочу сделать ту же функциональность (с небольшими изменениями на основе данных сообщений) из двух разных концентраторов событий.
Можно ли привязать две группы потребителей к одной функции.
Это не сработало, хотя я добавил его в function.json.
2 ответа
Краткий ответ: нет. Вы не можете привязать несколько триггеров ввода к одной и той же функции: https://github.com/Azure/azure-webjobs-sdk-script/wiki/function.json
Функция может иметь только одну привязку триггера и может иметь несколько привязок ввода / вывода.
Однако вы можете вызывать один и тот же "общий" код из нескольких функций, либо поместив общий код в вспомогательный метод, либо используя предварительно скомпилированные функции.
Рекомендуемая практика заключается в том, чтобы делить бизнес-логику между функциями, используя тот факт, что одно приложение функции может состоять из нескольких функций.
MyFunctionApp
| host.json
|____ business
| |____ logic.js
|____ function1
| |____ index.js
| |____ function.json
|____ function2
|____ index.js
|____ function.json
В "function1/index.js" и "function2/index.js"
var logic = require("../business/logic");
module.exports = logic;
Функция.json для function1 и function2 может быть настроена на разные триггеры.
В "business/logic.js"
module.exports = function (context, req) {
// This is where shared code goes. As an example, for an HTTP trigger:
context.res = {
body: "<b>Hello World</b>",
status: 201,
headers: {
'content-type': "text/html"
}
};
context.done();
};
Можно ли привязать две группы потребителей к одной функции.
Предполагая, что вы ищете триггер и не хотите проводить собственный опрос с использованием EventProcessorClient внутри своей функции. Потому что вы можете запланировать функцию для периодического использования API для извлечения сообщений из нескольких концентраторов событий и их обработки. Но вам нужно реализовать всю встроенную логику (опрос, обработку нескольких разделов, контрольные точки, масштабирование, ...), которые вы получаете при использовании триггеров.
Пара обходных путей:
Захват: если концентраторы событий находятся в одном пространстве имен, вы можете включить захват для всех концентраторов событий. Затем создайте триггер сетки событий для своей функции. Вы получите сообщение с путем к файлу захвата. Например
{ "topic": "/subscriptions/9fac-4e71-9e6b-c0fa7b159e78/resourcegroups/kash-test-01/providers/Microsoft.EventHub/namespaces/eh-ns", "subject": "eh-1", "eventType": "Microsoft.EventHub.CaptureFileCreated", "id": "b5aa3f62-15a1-497a-b97b-e688d4368db8", "data": { "fileUrl": "https://xxx.blob.core.windows.net/capture-fs/eh-ns/eh-1/0/2020/10/28/21/39/01.avro", "fileType": "AzureBlockBlob", "partitionId": "0", "sizeInBytes": 8011, "eventCount": 5, "firstSequenceNumber": 5, "lastSequenceNumber": 9, "firstEnqueueTime": "2020-10-28T21:40:28.83Z", "lastEnqueueTime": "2020-10-28T21:40:28.908Z" }, "dataVersion": "1", "metadataVersion": "1", "eventTime": "2020-10-28T21:41:02.2472744Z" }
Очевидно, это не в реальном времени, минимальное время захвата, которое вы можете установить, составляет 1 минуту, и может быть небольшая задержка между записью захваченного файла avro и вызовом вашей функции.
По крайней мере, в Java нет ограничения, что вы должны иметь отдельный класс для каждой функции. Итак, вы можете сделать это:
public class EhConsumerFunctions { private void processEvent(String event) { // process... } @FunctionName("eh1_consumer") public void eh1_consumer( @EventHubTrigger(name = "event", eventHubName = "eh-ns", connection = "EH1_CONN_STR") String event, final ExecutionContext context) { processEvent(event); } @FunctionName("eh2_consumer") public void eh2_consumer( @EventHubTrigger(name = "event", eventHubName = "eh-ns", connection = "EH2_CONN_STR") String event, final ExecutionContext context) { processEvent(event); } }
и определить
EH1_CONN_STR
и
EH2_CONN_STR
в настройках вашего приложения.