【问题标题】:How do you maintain idempotency with Azure EventGrid webhooks?如何使用 Azure EventGrid webhook 保持幂等性?
【发布时间】:2019-05-19 23:40:30
【问题描述】:

我已配置 EventGrid 订阅,以便在创建资源时为资源组中的事件启动 Web 挂钩调用。

成功处理网络挂钩调用,我返回 200 OK。为了保持幂等性,我将所有发生的事件与事件的id 一起存储在webhook_events 表中。通过id 检查任何新事件以查看它们是否存在于该表中。

Azure EventGrid 在返回 200 OK 后尝试从重试队列中删除事件。无论我以 200 OK 响应的速度有多快,EventGrid 都会可靠地重试发送。

我多次收到相同的事件(正如我所说,Eve​​ntGrid 总是重试,因为它无法足够快地从重试队列中删除事件)。然而,这不是我问题的重点;相反,问题在于每次重试都会为我提供不同的id 事件。这意味着我无法从逻辑上确定事件的唯一性,并且我的应用程序代码没有以幂等方式执行。

尽管事件重试之间没有唯一标识符,我如何在我的应用程序和 Azure 之间保持幂等性?

【问题讨论】:

  • 这可能不是 EventGrid 而是资源提供者(服务)。您可能想向拥有该提供商的 Microsoft Group 提出问题。
  • 我认为可能是这样。我会联系 Azure SQL 数据库的团队,看看他们的实施是否有问题。

标签: azure azure-sql-database azure-eventhub azure-sql-server azure-eventgrid


【解决方案1】:

如果您查看documentation,这就是EventGrid的实现方式

如果端点在 3 分钟内响应,事件网格将尝试 尽最大努力从重试队列中删除事件,但 仍可能收到重复的内容。

您可以使用后端代码清理日志和存储的数据,使用事件和消息 ID 来识别重复项。

【讨论】:

  • 你为什么要链接到波兰网站?
  • Sajeetharan,我无法在 EventGrid 的有效负载中找到 messageId 字段。 id 字段在同一事件的重试之间是不同的。我仍在尝试找到一种使用 EventGrid webhook 强制幂等性的方法。
【解决方案2】:

idfield 实际上对于每个事件都是唯一的,并且在重试之间保持相同,因此可用于重复数据删除。

您遇到的是 Azure 资源管理器 (ARM) 生成的某些事件的特定问题。具体来说,您看到的这两个事件实际上是不同的事件,而不是重复事件,由 ARM 在某些资源类型的创意流程的不同阶段生成。

ARM 充当各种 Azure 服务的 API 前门,并发出 a set of events,因为它是通用的,并且通常要了解发生的事情的详细信息,您需要查看数据有效负载。例如,ARM 将为它从 Azure 服务接收到的每个 2xx 状态代码发出一个成功事件,因此接受 202 和创建 201 可能导致发出两个事件,而查看差异的唯一方法是在数据有效负载中.

这是一个已知的痛点,我们正在努力发出更多的高保真事件,这些事件将在这些场景中更清晰、更容易做出反应。理想状态将是 Azure 控制平面的各种更改馈送。

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2019-02-06
    • 2021-09-16
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多