我正在构建一个 azure Web 应用程序,我想将活动日志发送到 Azure 事件中心。如果应用程序主机和事件中心之间的连接丢失会怎样?事件中心客户端是否实现某种本地队列?
2 回答
TLDR:是的。EventHubs 提供至少一次交付。EventHub 客户端 SDK 不维护任何队列。它将抛出并且依赖的应用程序将需要重试发送。
EventHubs 服务保证至少一次交付。只有当客户端从 EventHubs 服务收到“确认”时,发送调用才会成功。EventHubs 服务不会等待客户端对它发送的“确认”的“确认”。简单来说 - 它不提供 Only-Once/恰好一次语义。
实施者观点:
如果您熟悉客户端 SDK、EventHubs 服务,甚至没有办法知道一条消息正在被发送/传递两次——因为目前没有内置方法来识别一条消息(例如:EventData中没有像 MessageID 这样的东西)。因此,EventHubs 服务可以提供的唯一保证是——无论数据发送到 eventHub 服务——它都会向客户端确认——仅在将消息持久化到持久存储之后。这就是为什么,它至少被调用一次. 同样适用于接收。如果接收器客户端在恢复后崩溃 - 以您上次记住的偏移量返回 - EventHubs 服务将保证它将从该确切点重播流。
权衡调用:提供任何其他语义,如“最多一次”或“精确一次”——消息级基础设施(每条消息的标识符和每条消息的重复事件的计算)——将需要。因此,在服务级别拥有这个很好的功能 - 将带来额外的性能开销。
由于事件中心的权限是提供流语义并且这些语义实际上是按消息语义 - 事件中心服务选择将其推送到客户端库。客户库将需要构建它——依赖于我们提供的 Exactly-once 语义。
!斯里
这些都记录在官方微软页面上。您可以在此处找到官方详细信息:https ://docs.microsoft.com/en-us/azure/event-grid/compare-messaging-services