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

问题描述 投票:0回答:2

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

azure-eventhub
2个回答
12
投票

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

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

实施者视角: 如果您熟悉客户端 SDK,EventHubs 服务,甚至没有办法知道消息正在发送/传递两次 – 因为目前没有内置方法 – 识别消息 (例如:EventData 中没有像 MessageID 这样的东西)。因此,EventHubs 服务可以提供的唯一保证是 – 无论数据发送到 eventHub 服务 – 它都会向客户端确认 – 仅当将消息持久化到持久存储后。这就是为什么它被称为“至少一次”。同样适用于接收。 如果接收方客户端崩溃,在恢复后 - 返回您最后记住的偏移量 - EventHubs 服务将保证它将从该确切点重播流。
权衡调用

: 为了提供任何其他语义,例如“最多一次”或“恰好一次”,需要消息级基础设施(每条消息的标识符和每条消息的计算以消除重复的事件)。因此,在服务级别拥有这个功能很不错 - 将会带来额外的性能开销。

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


这些记录在微软官方页面上。 您可以在这里找到官方详细信息:

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.