Azure Event Hub 是否保证至少一次交付?

Does Azure Event Hub guarantees at least once delivery?

我正在构建一个 Azure Web 应用程序,我想将 activity 日志发送到 Azure 事件中心。如果应用程序主机和事件中心之间的连接丢失会怎样?事件中心客户端是否实现某种本地队列?

TLDR:是的。 EventHubs 提供至少一次交付。 EventHub 客户端 SDK 不维护任何队列。它会抛出并且依赖的应用程序将需要重试发送。

EventHubs 服务保证至少一次交付。 只有当客户端从 EventHubs 服务收到“确认”时,发送调用才会成功。 EventHubs 服务不会等待客户端的 'acknowledgement' 来获取它已发送的 'acknowledgement'。简单来说 - 它不提供 Only-Once/Exactly-once 语义。

实施者视角

如果您熟悉客户端 SDK,EventHubs 服务,甚至没有办法知道一条消息被 sent/delivered 两次 – 因为,目前还没有内置的方法——识别一条消息(例如:EventData 中没有像 MessageID 这样的东西)。因此,EventHubs 服务可以提供的唯一保证是 - 无论数据发送到 eventHub 服务 - 它都会 向客户端确认 - 只有并且只有在将消息持久化 到持久化店铺。这就是为什么它被称为 至少一次。同样适用于接收。 如果接收器客户端崩溃,在恢复后 - 返回您最后记住的偏移量 - EventHubs 服务将保证它将从那个确切的点重放流。

权衡电话: 要提供任何其他语义,如“至多一次”或“恰好一次”——消息级基础设施(每条消息的标识符和每条消息的计算以消除重复事件)——将是必需的。因此,这种在服务级别拥有特性的好处 - 会带来额外的性能开销。

由于事件中心的权限是提供流语义,而这些实际上是按消息语义 - 事件中心服务选择将其推送到客户端库。 客户端库将需要构建它——依赖于——我们提供的 Exactly-once 语义。

喂! 斯里

这些记录在微软官方页面上。 您可以在此处找到官方详细信息:https://docs.microsoft.com/en-us/azure/event-grid/compare-messaging-services