当有多个订阅者时,Azure 事件网格如何处理失败?

How does Azure Event Grid handle failure when there are multiple subscribers?

事件网格的文档指出它有一个内置的 delivery and retry mechanism,并给出了一个示例,说明什么可以归类为成功或失败的尝试。文档非常清楚单个事件处理程序会发生什么。

我的问题是,如果有多个事件处理程序,而只有一个处理程序接收事件失败,会发生什么情况?事件是仅针对该处理程序重试,还是所有处理程序都会看到重试?

基本上,Azure 事件网格事件 Pub/Sub 模型可以处理两种 messaging/mediation 模式,例如 Fan-In 模式和 Fan -Out(广播)模式。以下屏幕片段显示了它们的区别:

事件源和事件接收器之间的逻辑连接由订阅描述,它基本上是 Pub/Sub 模型的元数据工件。每个逻辑连接(由订阅表示)都是独立的,并且与其他连接松散地解耦。换句话说,每个订阅者在这个 Pub/Sub 模型中只能处理一个逻辑连接,例如只有一个事件源。

您的问题与扇出(广播)模式有关,其中事件兴趣使用 PushWithAck 传送模式广播给多个订阅者。此扇出模式中的每个订阅都有自己的 "a message state delivery machine" 由订阅者声明,例如重试选项、死信、过滤等。

换句话说,对订阅者的事件传递是基于他们的订阅以透明的方式并行处理,彼此没有任何依赖。请注意,订阅者没有任何关于谁、在哪里、如何等将事件传递给其他人一次的信息,因此每个订阅者只能看到自己的传递状态,例如 Aeg 的值-Delivery-Count 显示状态机的重试计数器。

因此,在向多个订阅者之一发送失败事件的情况下,启用的重试过程仅针对该订阅者执行。

正如 Roman 所解释的,每个端点都是独立处理的。如果一个事件处理程序失败,它将在不影响其他事件处理程序的情况下重试,当然,如果该特定端点继续失败,它最终将被删除(假设已在事件订阅上配置了死信)或删除。

在事件网格中进行事件发布时,来自自定义事件网格主题或系统事件网格主题(比如服务总线命名空间)的事件被转发到使用它们配置的事件网格订阅。然后将事件发送到配置了事件网格订阅的端点。

每当事件传递到端点失败时,根据重试策略进行重试configured.If重试次数超过配置的重试策略,如果配置为死信目的地,否则事件将丢失。

By default, Event Grid expires all events that aren't delivered within 24 hours. You can customize the retry policy when creating an event subscription. You provide the maximum number of delivery attempts (default is 30) and the event time-to-live (default is 1440 minutes).

当同一个事件网格主题有多个订阅者(事件网格订阅)时,仅对事件传递失败的事件网格订阅进行重试。

请参阅 Event Grid message delivery and retry 了解有关重试政策的更多信息。