Несколько триггеров 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 для извлечения сообщений из нескольких концентраторов событий и их обработки. Но вам нужно реализовать всю встроенную логику (опрос, обработку нескольких разделов, контрольные точки, масштабирование, ...), которые вы получаете при использовании триггеров.

Пара обходных путей:

  1. Захват: если концентраторы событий находятся в одном пространстве имен, вы можете включить захват для всех концентраторов событий. Затем создайте триггер сетки событий для своей функции. Вы получите сообщение с путем к файлу захвата. Например

     {
         "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 и вызовом вашей функции.

  1. По крайней мере, в 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 в настройках вашего приложения.

Другие вопросы по тегам