【问题标题】:Events dropped when integrating Azure Functions with Azure Event Hubs将 Azure Functions 与 Azure 事件中心集成时丢弃的事件
【发布时间】:2017-03-30 08:50:23
【问题描述】:

我正在设置一个示例,其中我有一个带有 webhook 的 Azure 函数,该 webhook 有一个 Azure 事件中心作为接收器。此事件中心有两个不同的使用者组,其中一个由另一个 Azure 函数使用。该代码没有做任何太花哨的事情(摘录如下),但我观察到一个奇怪的模式。每发布两条消息,似乎只有一条触发该功能一次。

发布网络挂钩:

module.exports = function (context, req) {
    var statusCode = 400;
    var responseBody = "Invalid request object";

    if (typeof req.body != 'undefined' && typeof req.body == 'object') {
        var eventInformation = req.body;

        context.log("Received event: " + eventInformation);

        context.bindings.outEvent = eventInformation;

        statusCode = 200;
        responseBody = "Event received.";
    }

    context.res = {
        status: statusCode,
        body: responseBody
    };

    context.done();
};

接收函数:

module.exports = function (context, offerMadeEvent) {
    var connection = new Connection(dbConfig); // Tedious connection
    connection.on('connect', function(err) {
        context.log('Connection established.');
        // Somewhere in the database callbacks:
        context.done();
    });
};

【问题讨论】:

  • 另外,我的事件中心有 2 个分区。我想知道这是否可能相关,但我在docs.microsoft.com/en-us/azure/azure-functions/… 中没有看到任何与分区相关的配置,所以我没有看到精确的关系。
  • 功能应用程序“始终开启”是否会改变一些事情?当功能应用程序处于消费计划中时,响应性存在一些已知限制(即:触发 BlobTrigger 的延迟等)。也许我们在这里看到了类似的行为?
  • 您如何衡量执行次数?日志?监控标签?
  • 目前,我主要是在我的工作站上使用 CLI 工具运行这项工作。我让它登录触发器(我知道激进的日志记录在生产中不好),这就是基础。 pastebin.com/e3rfgiTq 提供了一个示例会话(当然,有些匿名)
  • @Michael,您是否有机会不使用 $Default 作为 2 个函数中的 1 个的消费者组?有一个正在为非默认消费者组积极修复的错误。如果您还没有这样做,请至少让其中一个函数使用 $Default 消费者组,或者在您的 function.json 文件中省略“consumerGroup”条目。任何一种方法都会导致系统使用默认的消费者组,这应该会按预期触发。

标签: azure azure-functions azure-eventhub


【解决方案1】:

根据@Michael 对上述“评论”部分的回复,该问题与支持非默认消费者组的错误有关。

背景
Function App 实例是 Function App 内所有 Functions 的流程实例。要执行函数,必须至少运行 1 个函数应用实例。

通常,Function App 实例会因以下情况之一而启动:

  1. 正在通过 Azure 门户访问 Function App - UX 工作流代表用户加载 Function App,从而有效地强制 Function App 激活。
  2. Function App 实例由内部服务启动 - 有一个内部服务充当所有触发器上的事件的代理侦听器。它负责侦听新事件,在不存在活动实例时启动 Function App 实例,并在必要时扩展新实例。

对于在 Consumption Plan 下创建的 Function,Function App 实例将存活 5 分钟。 5 分钟后,Function App 实例将闲置。一旦“最后一个”Function App 实例空闲,如果 Scenario #1 没有发生,则 Function 将仅由 Scenario #2 触发。

问题
对于 EventHub 触发器,内部服务目前仅监听默认消费者组上的事件。它不会检测其他消费者组何时有新事件到达,并且不会唤醒 Function App。

这是一个已知问题,正在积极修复中。您可以在以下位置跟踪问题 https://github.com/Azure/Azure-Functions/issues/230

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多