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

use*_*679 1 azure-eventhub

我正在构建一个天蓝色的Web应用程序,我想将活动日志发送到Azure Event Hub。如果应用程序主机与事件中心之间的连接丢失,会发生什么?事件中心客户端是否实现某种本地队列?

Sre*_*ati 5

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

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

实现者观点

如果您熟悉Client SDK,EventHubs Service甚至没有办法知道一条消息正在发送/传送两次,因为当前没有内置方法来标识一条消息(例如:在EventData中没有像MessageID这样的东西。因此,EventHubs Service可以提供的唯一保证是-将数据发送到eventHub服务的任何内容-将消息持久保存到持久存储后,它只会向客户确认。这就是为什么,它至少被叫过一次。同样适用于接收。如果接收方客户端崩溃,则在恢复之后-以您上一次记得的偏移量返回-EventHubs服务将保证它将从该确切点重播流。

权衡取舍:提供“至多一次”或“完全一次”之类的其他语义–消息级基础结构(每个消息的标识符和计算每个消息的重复项以消除重复事件)-将需要。因此,很高兴在服务级别具有此功能-会带来额外的性能开销。

由于事件中心的职责是提供流语义,而这些实际上是针对每个消息的语义–事件中心服务选择将其推送到客户端库。客户库将需要构建它-依赖于-我们提供的完全一次语义。

HTH!斯里