讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 事件溯源在 Python 服务中的落地

星杰姑娘_1559

星杰姑娘_1559

发布时间:2026-02-22 16:09:11

|

976人浏览过

|

来源于php中文网

原创

事件溯源的核心是保证事件写入与业务状态更新的原子性,需用本地事件表兜底、幂等apply、frozen dataclass定义事件、严格版本校验与顺序重放。

python 事件溯源在 python 服务中的落地

事件溯源不是加个 Event 类就完事

Python 服务里直接照搬 DDD 书里的事件溯源模式,大概率会在第 3 天遇到状态不一致、重放失败、调试困难三连击。核心问题不在“怎么建模事件”,而在于“谁来保证事件写入和业务状态更新的原子性”。SQLAlchemy 的事务边界默认不跨 session,而事件发布往往发生在 commit 后——这意味着数据库已提交,但事件可能卡在消息队列里丢弃了。

  • 别在 after_commit 钩子里发事件:它不参与事务回滚,出错后状态和事件必然撕裂
  • 用“本地事件表”兜底:把事件和业务数据一起写进同一张 events 表(带 processed 字段),再由后台任务轮询投递
  • 避免在 __init__ 或 save() 中直接调用 publish_event():这会让领域对象依赖外部消息系统,测试时根本绕不开网络

重放事件时 apply() 方法必须幂等且无副作用

重放不是“重新执行业务逻辑”,而是“用事件重建当前状态”。如果 apply() 里调了 requests.post() 或改了文件系统,重放一次就发三遍通知、删三次临时目录。

  • apply() 只能操作内存中的聚合根属性,不能触发 I/O、不能修改其他聚合、不能调用 datetime.now()(要用事件自带的 occurred_at 时间戳)
  • 聚合根构造函数里不要做任何非确定性操作;比如从配置中心读超时值、查缓存获取默认状态——这些值在重放时可能已变更
  • 事件类字段必须全部是基本类型或可序列化的嵌套结构;别塞 lambda、threading.Lock 或数据库连接对象进去

用 dataclasses 定义事件比用 pydantic.BaseModel 更稳

pydantic 的验证和默认值逻辑在重放时会偷偷改数据:比如 created_at: datetime = Field(default_factory=datetime.utcnow),重放旧事件时会覆盖原始时间戳。而 dataclasses 是纯容器,没隐藏行为。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 事件类必须加 @dataclass(frozen=True):防止重放中途被意外修改
  • 序列化统一走 json.dumps(obj.__dict__),别用 model.json()——后者可能注入额外字段或格式化时间
  • 如果需要类型校验,用 typing.Annotated + typeguard 做运行时检查,而不是靠 pydantic 构造时“修正”输入

重放卡住?先看 event_id 和 version 是否连续

常见错误是重放失败后跳过某条事件,结果后续所有 version 校验都报 "expected 5, got 7"。事件溯源对顺序和完整性极度敏感,断点续传不是“从第 N 条继续”,而是“必须从上一个成功应用的 version + 1 开始”。

立即学习“Python免费学习笔记(深入)”;

  • 聚合根里维护 _version: int,每次 apply() 后自增;事件载荷里必须带 version 字段,两者严格比对
  • 别用数据库自增 ID 当事件序号:不同聚合的事件混在一张表里,ID 不代表逻辑顺序
  • 重放脚本要记录最后成功处理的 event_id(不是数据库主键),下次启动时从该 ID 的下一条查起

最麻烦的从来不是写事件,而是让重放过程在没有人工干预的前提下,既不丢也不重——这要求每条事件的语义边界足够干净,且所有时间、随机、外部依赖都被提前“冻结”进事件本身。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2235

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3582

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1196

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4119

2025.09.10

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1946

2025.08.19

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6979

2023.08.02

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn