我正在构建一个 Azure Web 应用程序,我想将活动日志发送到 Azure 事件中心。如果应用程序主机和事件中心之间的连接丢失会发生什么?事件中心客户端是否实现某种本地队列?
TLDR:是的。 EventHubs 提供至少一次交付。 EventHub 客户端 SDK 不维护任何队列。它将抛出异常,并且依赖的应用程序将需要重试发送。
EventHubs 服务保证至少一次交付。
仅当客户端从 EventHubs 服务收到“确认”时,发送调用才会成功。
EventHubs 服务不会等待客户端对其已发送的“确认”进行“确认”。简而言之 - 它不提供 Only-Once/Exactly-once 语义。
实施者视角:
如果您熟悉客户端 SDK,EventHubs 服务,甚至没有办法知道消息正在发送/传递两次 – 因为目前没有内置方法 – 识别消息 (例如:EventData 中没有像 MessageID 这样的东西)。因此,EventHubs 服务可以提供的唯一保证是 – 无论数据发送到 eventHub 服务 – 它都会向客户端确认 – 仅当将消息持久化到持久存储后。这就是为什么它被称为“至少一次”。同样适用于接收。
如果接收方客户端崩溃,在恢复后 - 返回您最后记住的偏移量 - EventHubs 服务将保证它将从该确切点重播流。
权衡调用
由于事件中心的权限是提供流语义,并且这些语义实际上是针对每条消息的语义 - 事件中心服务选择将其推送到客户端库。 客户端库将需要构建它 - 依赖于 - 提供的 Exactly-once 语义。