如何在 Azure EventGrid 的一批事件中触发 retry/deadletter 个特定事件
How to trigger retry/deadletter specific events in a batch of events in Azure EventGrid
我有一个带有 REST API 控制器的 Azure 应用服务,可以从 Azure 事件网格调用。您可能知道,事件网格可以批量发送多个事件。我不知道这实际上是在什么情况下发生的,因为到目前为止,事件有效负载一直是一个仅由一个元素组成的数组,但是文档明确表示可以一次发生多个事件。
假设我收到了五个事件,而事件 #3 不知何故不正确。我如何让事件网格知道我已经接受了五个事件中的四个,并且它应该重试或终止第三个事件?
[Route("api/[controller]")]
[ApiController]
public class EventGridController : ControllerBase
{
[HttpPost("CustomerUpdated")]
public async Task<IActionResult> CustomerUpdated()
{
// ... manage subscription validation here
using var reader = new StreamReader(Request.Body, Encoding.UTF8);
var eventStr = await reader.ReadToEndAsync();
var gridEvents = JsonConvert.DeserializeObject<IEnumerable<GridEvent>>(eventStr);
// ... let's say one of five received events is somehow incorrect here
// ... how do I tell event grid which events failed and which events were accepted
}
目前,我通过返回 BadRequest()
将整个批次标记为失败,即使某些事件实际上已成功。这是一个不错的“安全总比后悔好”的权衡解决方案,因为我目前是这个项目的独行侠,因此可以确保我的代码是幂等的。但是我想确保将来的其他一些开发人员不能使代码库成为非幂等的并且到处都会出现数据不一致,因为我的代码告诉 EventGrid 整个批处理都失败了,即使有些事件是实际处理成功。我能做什么?
Azure 事件网格输出批处理策略设计为全部或None,查看更多详细信息here。
在您描述的情况下,订阅者需要处理跳过已经成功处理的事件的逻辑,并且 return 状态代码应该用于重试传递(例如 503)。请注意,如果启用 400 Bad Request 将立即处理死信。
我有一个带有 REST API 控制器的 Azure 应用服务,可以从 Azure 事件网格调用。您可能知道,事件网格可以批量发送多个事件。我不知道这实际上是在什么情况下发生的,因为到目前为止,事件有效负载一直是一个仅由一个元素组成的数组,但是文档明确表示可以一次发生多个事件。
假设我收到了五个事件,而事件 #3 不知何故不正确。我如何让事件网格知道我已经接受了五个事件中的四个,并且它应该重试或终止第三个事件?
[Route("api/[controller]")]
[ApiController]
public class EventGridController : ControllerBase
{
[HttpPost("CustomerUpdated")]
public async Task<IActionResult> CustomerUpdated()
{
// ... manage subscription validation here
using var reader = new StreamReader(Request.Body, Encoding.UTF8);
var eventStr = await reader.ReadToEndAsync();
var gridEvents = JsonConvert.DeserializeObject<IEnumerable<GridEvent>>(eventStr);
// ... let's say one of five received events is somehow incorrect here
// ... how do I tell event grid which events failed and which events were accepted
}
目前,我通过返回 BadRequest()
将整个批次标记为失败,即使某些事件实际上已成功。这是一个不错的“安全总比后悔好”的权衡解决方案,因为我目前是这个项目的独行侠,因此可以确保我的代码是幂等的。但是我想确保将来的其他一些开发人员不能使代码库成为非幂等的并且到处都会出现数据不一致,因为我的代码告诉 EventGrid 整个批处理都失败了,即使有些事件是实际处理成功。我能做什么?
Azure 事件网格输出批处理策略设计为全部或None,查看更多详细信息here。
在您描述的情况下,订阅者需要处理跳过已经成功处理的事件的逻辑,并且 return 状态代码应该用于重试传递(例如 503)。请注意,如果启用 400 Bad Request 将立即处理死信。