Axon 3.1.1中MongoDB事件存储Jackson序列化存储策略咨询
Axon 3.1.1 MongoDB事件存储:Jackson序列化的存储策略选择
嗨,针对你在Axon 3.1.1中使用MongoDB事件存储时遇到的Jackson序列化器存储策略问题,我来帮你梳理清楚:
1. 适配Jackson JSON序列化的存储策略选择
在Axon 3.1.1中,针对Jackson JSON序列化场景,你应该传入DocumentPerEventStorageStrategy作为存储策略。这个策略专门设计为将每个领域事件单独存储为MongoDB的一个Document,完美适配JSON序列化的存储需求。
修改后的代码示例如下:
import org.axonframework.eventhandling.store.mongo.DocumentPerEventStorageStrategy; import org.axonframework.serialization.json.JacksonSerializer; import org.axonframework.mongo.eventsourcing.eventstore.MongoEventStorageEngine; import org.axonframework.mongo.DefaultMongoTemplate; import org.axonframework.eventhandling.NoOpEventUpcaster; @Bean public EventStorageEngine mongoEventStorageEngine() { return new MongoEventStorageEngine( axonJsonSerializer(), NoOpEventUpcaster.INSTANCE, aggregateMongoTemplate(), new DocumentPerEventStorageStrategy() // 这里传入JSON适配的存储策略 ); }
这个策略的优势是:
- 每个事件独立存储,便于后续按事件类型、时间范围、聚合ID等维度灵活查询事件流
- 序列化后的JSON payload直接存在单个文档中,MongoDB的读写性能更均衡
- 符合Axon针对JSON序列化场景的官方推荐实践
2. 默认存储策略的效果
如果你不指定存储策略,Axon 3.1.1的MongoEventStorageEngine会默认使用DocumentPerAggregateStorageStrategy。这个策略的核心逻辑是:
将同一个聚合实例的所有事件,存储在单个MongoDB Document中,用数组字段来存放该聚合的全部事件列表
这种默认策略的特点:
- 适合事件数量较少的聚合,读取聚合事件流时可以一次性加载整个文档,速度较快
- 但如果聚合的事件量很大,单个文档会变得异常庞大,会严重影响MongoDB的读写性能和查询灵活性
- 虽然用Jackson序列化也能工作,但JSON格式的事件数组在文档中会变得臃肿,后续要单独查询某个事件会非常不方便
总的来说,如果你已经切换到Jackson JSON序列化,更推荐显式指定DocumentPerEventStorageStrategy,它在扩展性、灵活性和性能上都更适配JSON的存储场景。
内容的提问来源于stack exchange,提问作者A S
相关产品推荐
相关产品推荐

