将 Azure Functions 与 Azure 事件中心集成时丢失的事件
Events dropped when integrating Azure Functions with Azure Event Hubs
我正在设置一个示例,其中我有一个带有 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();
});
};
根据@Michael 在上面 "Comment" 部分的回复,该问题与支持非默认消费者组的错误有关。
背景
Function App实例是Function App内部所有Functions的流程实例。要执行一个 Function,至少 1 个 Function App 实例必须是 运行。
通常,Function App 实例会由于以下情况之一而启动:
- 正在通过 Azure 门户访问 Function App - UX 工作流代表用户加载 Function App,有效地强制 Function App 活跃起来。
- Function App 实例由内部服务启动 - 有一个内部服务充当所有触发器事件的代理侦听器。它负责侦听新事件,如果不存在活动实例则启动 Function App 实例,并在必要时扩展新实例。
对于在消费计划下创建的函数,Function App 实例将存活 5 分钟。 5 分钟后,Function App 实例将闲置。一旦 "last" Function App 实例闲置,如果 Scenario #1 没有发生,那么 Function 只会被 Scenario #2[=34 触发=].
问题
对于 EventHub 触发器,内部服务当前仅侦听默认使用者组上的事件。它不会检测何时有新事件到达其他消费组,不会唤醒功能应用。
这是一个已知问题,正在积极修复中。您可以在以下位置跟踪问题
https://github.com/Azure/Azure-Functions/issues/230
我正在设置一个示例,其中我有一个带有 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();
});
};
根据@Michael 在上面 "Comment" 部分的回复,该问题与支持非默认消费者组的错误有关。
背景
Function App实例是Function App内部所有Functions的流程实例。要执行一个 Function,至少 1 个 Function App 实例必须是 运行。
通常,Function App 实例会由于以下情况之一而启动:
- 正在通过 Azure 门户访问 Function App - UX 工作流代表用户加载 Function App,有效地强制 Function App 活跃起来。
- Function App 实例由内部服务启动 - 有一个内部服务充当所有触发器事件的代理侦听器。它负责侦听新事件,如果不存在活动实例则启动 Function App 实例,并在必要时扩展新实例。
对于在消费计划下创建的函数,Function App 实例将存活 5 分钟。 5 分钟后,Function App 实例将闲置。一旦 "last" Function App 实例闲置,如果 Scenario #1 没有发生,那么 Function 只会被 Scenario #2[=34 触发=].
问题
对于 EventHub 触发器,内部服务当前仅侦听默认使用者组上的事件。它不会检测何时有新事件到达其他消费组,不会唤醒功能应用。
这是一个已知问题,正在积极修复中。您可以在以下位置跟踪问题 https://github.com/Azure/Azure-Functions/issues/230