当前位置: 首页 > 知识库问答 >
问题:

Azure函数事件网格触发器

唐法
2023-03-14

我已经实现了一个EventGrid触发器来响应Blob存储事件,其逻辑简化如下:

public static async void Run(
    JObject eventGridEvent,
    TraceWriter log,
    ExecutionContext context)
{
    string eventContent = ParseEvent(eventGridEvent);

    HttpClient client = GetProxyClient();
    HttpResponseMessage response = await client.GetAsync("blabla/" + eventContent);
    string responseContent = await response.Content.ReadAsStringAsync();
    log.Info("Here is the response :" + responseContent);
}

外部API的响应时间不长(1秒或更短),我对主机的配置设置为默认(因此允许无限数量的并发调用)。

当同时添加多个blob(从只有2个blob开始)时,我在日志中得到了很多重复的事件(脚本正在快速地一个接一个地上传blob,中间没有等待时间)。

我觉得这可能是由于我从不承认收到事件,我不知道我是否应该在我的代码中执行此操作,或者事件网格触发器是否自动执行此操作。

确认事件处理的逻辑应该在EventGrid触发器(Http 200响应)中实现还是自动处理?

如果没有,我还应该得到重复的事件吗?通常,当上传单个blob时,我会收到它的事件3-4次。

我问这个问题的原因是,当使用Http触发器并返回400响应时,我也会得到重复的事件,这是有意义的,因为我没有确认正确处理了事件。但是,当我返回200响应时,我不会收到重复的事件。

谢谢

共有2个答案

韩华美
2023-03-14

您可以尝试使用 Data.api 字符串的 EventGrid Advanced Filter 以 FlushWithClose 结尾。我的 Azure 函数在 Blob 上传时多次执行的原因是,为 Blob 上传执行的每个 AppendFile 操作都创建了 EventGrid 消息。

我发现(通过反复试验)Azure 数据工厂使用一系列 API 调用将单个 blob 写入 Blob 存储。

最终看起来像这样:

    < li> 创建文件路径 < li> 租赁文件 < li> AppendFile < li> AppendFile < li> AppendFile(每次追加都会放入blob的一个块,直到blob完成) < li> FlushFile(这是文件已完成的实际指示;因此上面显示了高级过滤器) < li> 租赁文件

下面是一个示例查询,您可以自己查看此上传流:

    < li >注意:您将需要上载到blob容器的示例文件的< code>Uri
//==================================================//
// Author: Eric
// Created: 2021-05-26 0900 
// Query: ADF-to-Blob Storage reference flow
// Purpose: 
// To provide a reference flow of ADF-to-Blob Storage
// file uploads
//==================================================//
// Assign variables
//==================================================//
let varStart = ago(10d);
let varEnd = now();
let varStorageAccount = '<storageaccountname>';
let varStatus = 'Success';
let varSampleUri = 'https://<storageaccountname>.dfs.core.windows.net/<containername>/<parentfolder1>%2F<parentfolder2>%2F<samplefilename.extension>'
//==================================================//
// Filter table
//==================================================//
StorageBlobLogs
| where TimeGenerated between (varStart .. varEnd)
  and AccountName == varStorageAccount
  and StatusText == varStatus
  and split(Uri, '?')[0] == varSampleUri
//==================================================//
// Group and parse results
//==================================================//
| summarize 
  count() by OperationName,
  CorrelationId,
  TimeGenerated,
  UserAgent = tostring(split(UserAgentHeader, ' ')[0]),
  RequesterAppId,
  AccountName, 
  ContainerName = tostring(split(tostring(parse_url(url_decode(Uri))['Path']), '/')[1]),
  FileName = tostring(split(tostring(parse_url(url_decode(Uri))['Path']), '/')[-1]),
  ChunkSize = format_bytes(RequestBodySize, 2, 'MB'),
  StatusCode,
  StatusText
| order by TimeGenerated asc

从不同来源(Azure Data Factory、Azure Storage Explorer、Python/C# SDK、Azure Portal等)上传样本很有趣。)并了解他们使用的不同API方法。事实上,您可能需要这样做来获得您的日志记录和警报拨入。

太糟糕了,这些方法没有跨工具标准化,因为这个特定问题是你自己发现的巨大痛苦!

同样,在这种情况下,EventGridAdvanced Filters是您的朋友。

包兴思
2023-03-14

您不需要做任何特殊的事情来向事件网格表示成功。如果函数执行成功(未引发异常),触发器将自动响应成功状态代码。

 类似资料:
  • 我的Azure Functions事件网格触发器没有触发。我是这么做的。 Key Vault设置为将事件报告给EventGrid系统主题 此主题由将事件传递到Azure Function的订阅订阅 函数有一个事件网格触发器(见下文,默认由门户创建): 我用谷歌搜索了一下,对于这样的入门级方案,没有更多的指导。我想的也许是授权...订阅如何触发该函数?在此过程中(通过GUI /门户配置),没有任何关

  • 我们有一个 Azure 设置,其中包含一个 Azure 事件网格主题,并且我们有一个 Azure 函数服务,其中包含大约 15 个函数,这些函数通过不同的前缀筛选器订阅该主题。Azure 函数服务设置为基于消耗的资源,应该能够根据需要进行缩放。 每个订阅都设置为在最多4小时内尝试交付10次,然后放弃活动。到目前为止一切顺利,设置大部分时间都按预期工作。 在某些情况下,对于我们未知的情况,事件网格主

  • 我在函数的应用程序中有一个Azure事件网格触发器。该函数通过事件订阅订阅事件网格主题。该函数运行完美,当我在函数应用程序的身份验证/授权刀片中没有配置身份验证时触发。但是当我从刀片集成B2CAD应用程序时,主题没有交付,函数也没有触发。此外,我可以在事件订阅中看到“未经授权”错误。函数应用程序内的其他HTTP触发器需要B2C流。如何授予事件网格的独占访问权限,以便在没有B2C流的情况下传递此消息

  • 在Azure function中,你可以创建一个函数来监听某个事件的变化,比如消息总线、blob存储等等... 如果您正在使用azure功能,并且您的目标是通过侦听事件(如消息总线、blob存储或任何其他内置触发器)来处理某些事情,那么您有什么理由希望将事件网格放在中间层吗?即,您不希望azure函数直接侦听blob存储更改,而是希望azure函数侦听正在侦听blob存储器更改事件的事件网格。 谢

  • 我知道对于http触发函数,您可以设置context.res.status = 501,因此appInsight中的结果代码将更改为501。想知道如何为eventGrid触发的azure函数做同样的事情吗?我们想要一些自定义的结果代码,以便以后可以运行统计数据。

  • 我有一个由事件网格事件触发的Azure函数。仅当blob上载到存储帐户时,才会创建事件网格事件。 虽然由于某些原因,该函数仍然会被同一事件触发,即使它已成功处理,但它现在已部署并运行良好? 例子: 今天我查看了日志,该函数已继续执行! 错误:“Blob不存在” 代码片段: 编辑1:这仍在发生,这次有点不同。 现在,EventGrid在成功传递消息和函数运行后继续触发 我如何调试它?