事件溯源架构中主键生成疑问:能否使用随机UUID?
事件溯源架构中随机UUID的使用疑问解答
你完全可以使用随机UUID,核心是搞反了ID的生成时机:
- 业务实体的ID(比如你说的条目ID)必须在创建事件产生时就确定并写入事件数据,而不是等到投影阶段才生成。
- 比如创建事件
ItemCreated本身就携带预先生成的随机UUID作为itemId,后续的删除事件ItemDeleted直接复用这个itemId存入事件存储。 - 当重建投影状态时,只需要从创建事件中读取已有的
itemId作为主键,不需要重新生成;删除事件也直接用事件里的itemId找到对应的条目执行删除,完全能保证确定性。
举个简单的事件数据示例:
// 创建事件 { "eventType": "ItemCreated", "eventId": "事件自身的UUID", "data": { "itemId": "a1b2c3d4-5678-90ef-ghij-klmnopqrstuv", // 随机生成的条目UUID "name": "测试条目" } } // 删除事件 { "eventType": "ItemDeleted", "eventId": "另一个事件UUID", "data": { "itemId": "a1b2c3d4-5678-90ef-ghij-klmnopqrstuv" // 和创建事件的条目ID一致 } }
简言之,投影的确定性依赖的是事件数据本身的一致性,而不是投影阶段生成ID的逻辑。只要ID在事件产生时就被固化,随机UUID不会带来任何问题。
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

