向Azure Event Hub发送批量事件失败及SendAsync接口相关技术问询
Azure Event Hubs SendAsync(IEnumerable) 批量发送常见问题解答
咱们来逐个拆解你遇到的这两个核心问题:
1. 批量发送接口是否为事务性操作,会不会出现部分成功/失败?
SendAsync(IEnumerable) 接口是原子性的,完全符合事务性操作的核心特性:整个批次的事件要么全部成功写入Event Hubs,要么全部失败,绝对不会出现“部分事件成功、部分失败”的情况。
当你调用这个方法时,Event Hubs服务会把传入的整个事件集合作为一个单独的处理单元。如果批次中的任何一个事件因为格式错误、配额超限或者网络问题等原因无法写入,整个批次都会被拒绝,不会有任何事件被持久化到Event Hubs中;只有当所有事件都通过验证并成功写入后,才会返回成功的响应。
2. API抛出异常后重试,是否会产生重复事件?
很遗憾,Event Hubs官方并没有保证这个场景下不会产生重复事件。
原因在于,发送失败的异常可能出现在两种场景里:
- 场景一:批次确实没有被服务端接收,此时重试不会导致重复;
- 场景二:批次已经被服务端成功写入,但客户端因为网络波动等原因没收到成功响应,这时重试就会把同样的事件再次发送,导致重复。
Event Hubs的交付语义是至少一次(At-Least-Once),而非恰好一次(Exactly-Once)。所以官方明确建议:如果你的业务场景不能容忍重复事件,需要在事件中嵌入唯一标识(比如业务ID、UUID),在消费端通过这个标识来做幂等性校验,主动过滤重复事件。
内容的提问来源于stack exchange,提问作者Vishal Vaibhav
相关产品推荐
相关产品推荐

