Azure Functions 对摄取数据进行去重

Azure Functions to de-duplicate ingestion data

我每 5 秒使用 Azure Functions 轮询一个第三方 API。 API 总是 returns 一条 JSON 消息,即使自从我上次阅读后响应没有改变。

目前我正在编写对数据湖的 json 响应并使用批处理处理重复数据删除。我现在想将重复数据删除逻辑移动到函数中,以便我记录最后一次成功写入数据湖,并且仅在响应发生变化时再次写入响应。

我的想法是无服务器函数应该是无状态的,所以我必须将最后一个成功记录的 ID(或者可能是整个响应的哈希值)记录到 Name/Value 对 Table 存储。然后在下一次执行时,我检查它是否已更改并继续。

另一个选项可能是持久函数 - 似乎有一种使用 IDurableEntityContext ctx 编写状态的方法:

[FunctionName("Counter")]
public static void Counter([EntityTrigger] IDurableEntityContext ctx)
{
    switch (ctx.OperationName.ToLowerInvariant())
    {
        case "add":
            ctx.SetState(ctx.GetState<int>() + ctx.GetInput<int>());
            break;
        case "reset":
            ctx.SetState(0);
            break;
        case "get":
            ctx.Return(ctx.GetState<int>());
            break;
    }
}

我担心这两种解决方案都无法可靠地处理每 5 秒一次 read/write 的频率。 有人可以确认这些中的任何一个是否是一个好的解决方案并且对用例可靠吗? (或者也许还有其他一些解决方案,用于从 API 中提取数据,并且仅在自上次读取后数据发生变化时才继续?

您不必创建资源的散列。事实上,如果第 3 方 API 被正确实施,它应该 return 在您对资源的第一个 GET 的响应负载中编辑一个 ETag。然后,您可以将 resoureId:eTag 映射保存在 Table 存储中。下次您为同一资源轮询 API 时,将 eTag 作为请求负载的一部分包含在内。如果实体没有改变,第 3 方 API 应该 return 一个 304 响应代码。

假设第 3 方 API 支持 ETag 检查,您应该能够创建一个基于计时器的函数来轮询 API 或使用 Monitor Pattern in Durable Functions.