EventStore抛出WrongExpectedVersionException但事件实际已存储问题排查
EventStore 5.0.0 写入报错但事件实际存储成功问题分析
报错日志:
EventStore.ClientAPI.Exceptions.WrongExpectedVersionException: Append failed due to WrongExpectedVersion. Stream: QWE.Api.SomeClassifier.Actors.ProductInfoActors.ProductActor-q5839583-5r82-5k30-sl13-1t485329g395, Expected version: 13, CurrentVersion:14
问题成因
该现象的本质是首次写入请求实际已经执行成功,但客户端未收到成功响应,触发重试后被乐观并发校验拦截,具体诱发原因如下:
- 你初步怀疑的SSD速度过慢、服务器负载过高是核心诱发因素:当服务端IOPS耗尽、CPU占用过高时,事件已经完成落盘持久化、对应Stream版本已从13更新为14,但服务端因资源不足无法及时向客户端返回成功响应,客户端触发超时重试逻辑后,携带的预期版本还是原来的13,自然会收到版本不匹配的报错,此时首次写入的事件已经存储成功。
- 网络抖动/丢包也会触发该问题:服务端写入成功后回传的响应包在传输过程中丢失,客户端未收到成功回执就会发起重试,同样会触发该异常,事件实际已写入完成。
- EventStore 5.0.0版本的已知缺陷:该版本在集群模式下如果出现节点间同步延迟、或Leader节点发生长时间GC停顿,也会出现写入已提交但响应滞后的问题,提升了该异常的出现概率。
验证与修复建议
- 可通过EventStore服务端日志核对对应Stream版本14的写入时间戳,该时间会早于你收到异常的重试请求的发起时间,可直接验证首次写入已成功的推论。
- 规避该问题可适当上调客户端超时阈值适配服务端负载情况,同时优化重试逻辑:重试前先查询当前Stream的最新版本,或对写入事件做幂等校验,避免无意义的重复提交。
内容的提问来源于stack exchange,提问作者Maxim Kitsenko
相关产品推荐
相关产品推荐

