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

时间:2015-10-19 17:43:07

标签: azure-eventhub

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

2 个答案:

答案 0 :(得分:4)

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

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

执行者观点

如果你比较熟悉Client SDK, EventHubs服务,甚至不知道是否有消息被发送/交付两次 - 因为,没有当前内置的方式 - 识别消息(例如:EventData中没有类似MessageID)。因此,EventHubs服务可以提供的唯一保证是 - 无论发送到eventHub服务的数据是什么 - 只有在将消息持久地到持久性存储之后,它才会确认回客户端。这就是为什么,它被称为至少一次。同样适用于接收。 如果接收方客户端在恢复后崩溃 - 返回上次记住的偏移量 - EventHubs服务将保证它将从该确切点重放流。

权衡电话: 要提供任何其他语义,例如“最多一次”或“完全一次” - 将需要消息级基础结构(每个消息的标识符和用于去除事件的计算每个消息)。因此,在服务级别具有此功能非常好 - 将带来额外的性能开销。

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

HTH! SREE

答案 1 :(得分:0)

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