多个Azure EventHub触发Azure功能应用程序中的单个功能

时间:2017-10-18 23:02:42

标签: azure azure-functions azure-eventhub

我想从两个不同的eventhub中执行相同的功能(基于消息数据的更改很少)。

是否可以将两个使用者组附加到单个功能。

即使我将它添加到function.json中也没有用。

3 个答案:

答案 0 :(得分:2)

简短的回答是否定的。您不能将多个输入触发器绑定到同一个函数: https://github.com/Azure/azure-webjobs-sdk-script/wiki/function.json

  

一个函数只能有一个触发器绑定,并且可以有多个输入/输出绑定。

但是,您可以拨打相同的#34;分享"来自多个函数的代码,可以通过在辅助方法中包装共享代码,也可以使用Precompiled Functions

答案 1 :(得分:0)

这里的推荐做法是通过使用单个功能应用程序可以由多个功能组成的事实来在功能之间共享业务逻辑。

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;

function1和function2的function.json可以配置为不同的触发器。

" 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();
};

答案 2 :(得分:0)

是否可以将两个使用者组附加到一个功能上。

假设您正在寻找触发器,并且不想在函数内执行your own polling using EventProcessorClient。因为您可以安排一个函数来定期使用API​​从多个事件中心获取消息并进行处理。但是您需要实现使用触发器时获得的所有内置逻辑(轮询,处理多个分区,检查点,缩放等)。

工作环境夫妇:

  1. 捕获:如果事件中心在同一名称空间中,则可以在所有事件中心上启用捕获。然后为您的函数创建一个event grid trigger。您将收到一条消息,其中包含捕获文件的路径。例如

     {
         "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_STREH2_CONN_STR