
TicketFlow 中间件专题导读从“会用组件”到“说清失败”很多中间件课程从docker compose up开始容器全绿就算成功。这门课反过来先给业务事实划边界再逐个引入 Redis、RabbitMQ/Celery、Elasticsearch、Nginx 与可观测性。每加一件东西都要回答三个问题它保管什么它宕机时用户看到什么恢复时凭什么证明没丢数据。课程项目叫TicketFlow是一个多租户工单平台。PostgreSQL 是工单唯一事实源Redis 只加速与保护Elasticsearch 是可重建的搜索投影RabbitMQ/Celery 运送至少一次的后台工作。这句话不是口号后面 32 篇会不断用代码、竞态和故障演练来重新证明它。你会得到什么这不是中间件命令手册。完成主线后你应该能够把“请求已成功”和“异步效果已完成”分开不用exactly-once安慰自己写出有租户边界、请求指纹和数据库唯一约束的幂等 POST解释 cache-aside 的命中、回源、写后失效、负缓存、single-flight 与 TTL 抖动设计一条 Outbox→relay→broker→worker 的可恢复链路用幂等消费收敛重投将搜索当作可延迟、可删除、可重建的读模型而不是第二个业务库用结构化日志、低基数指标与 trace 回答“哪张单卡在哪”在依赖部分故障时说清降级语义并用状态证据而不是截图证明恢复。三条学习路线必备主线01–16、23–28、31–32。这条线包含事实边界、Redis、RabbitMQ/Celery、Nginx 和生产观测是后端岗位最应该能讲清的部分。搜索加分线17–22。适合需要 Elasticsearch 的业务重点不是记 DSL而是租户过滤、版本乱序、alias 重建和宕机边界。高阶选修线29–30。Kafka 只承担审计流不是 RabbitMQ 的时髦替身也不能阻断 TicketFlow 主请求。阅读与实验约定每篇末尾都有练习下一篇按原 ID 给出完整答案包括代码、命令、输出和设计理由。每篇的“完整核心模块”来自该课的独立阶段快照标记中有 lesson revision 与 SHA-256它不会偷渡后面才学的代码。本课使用 Python 3.11。本地 unit 测试用 SQLite 和 fake adapter 快速验证规则但它们不会被说成 PostgreSQL/Redis/RabbitMQ/Elasticsearch 协议验收。需要真实服务的结论只认授权的隔离远程环境没跑就是SKIP不是PASS。从空目录建立实验工作区下面假设你已经取得课程目录python-backend-middleware-course它就是本导读的上一级目录。如果发布物是压缩包先将其完整解压到一个空目录不要只复制文章因为project/、checkpoints/stages/与tools/是可运行答案的一部分。在 Windows PowerShell 中从空目录开始执行。py -3.11是 Windows Python Launcher 的精确版本选择Set-Location project后后文所有tests/...selector 都以该目录为基准New-Item-ItemType Directory-Path.\ticketflow-lab|Out-NullSet-Location.\ticketflow-lab# 输入已经下载/解压好的完整课程目录复制后实验目录有自己的可修改副本。$CourseSourceRead-Host完整课程目录末级名称应为 python-backend-middleware-courseif(-not(Test-Path-LiteralPath$CourseSource-PathType Container)){throw课程目录不存在$CourseSource}Copy-Item-LiteralPath$CourseSource-Destination.\python-backend-middleware-course-RecurseSet-Location.\python-backend-middleware-course py-3.11--version py-3.11-m venv.venvSet-ExecutionPolicy-ScopeProcess-ExecutionPolicy Bypass.\.venv\Scripts\Activate.ps1Set-Location.\project python-m pip install--upgrade pip python-m pip install-e.[dev]$env:PYTHONPATH (Resolve-Path.\src).Path python-cimport ticketflow; print(ticketflow import ok)python-m pytest tests\unit\test_ticket_api.py::test_liveness_and_dependency_injected_health_contract-q预期第一条命令显示Python 3.11.ximport 输出ticketflow import ok第 02 课 selector 输出1 passed。pip install -e已让包可导入显式设置PYTHONPATH是为了让文章命令与检查点环境一致并避免另一个已安装的ticketflow抢先被导入。新开 PowerShell 后要重新激活 venv、进入project/并重新设置该环境变量。01–08 的本地 selector 会在测试夹具中创建临时 SQLite 表不需要先跑 Alembic。只有连接到隔离 PostgreSQL 的 runtime/integration 才执行迁移在已正确设置TICKETFLOW_DATABASE_URL的那个远程环境中从project/运行python -m alembic upgrade head。不要用.env.example中的 Compose 主机名在普通 Windows shell 直连也不要为本课程在 Windows 本地启动 Docker。选择阶段快照与检查点文章末尾的完整模块不是当前最终源码而是“学到这一课时”的不可变快照。01–02 属于阶段01-0203–08 属于03-08。例如查看第 02 课和第 06 课当时的模块# 先回到课程根目录 python-backend-middleware-courseSet-Location..Get-Content.\checkpoints\stages\01-02\lessons\02\src\ticketflow\api\app.pyGet-Content.\checkpoints\stages\03-08\lessons\06\src\ticketflow\cache\rate_limit.py# 检查快照哈希、selector 映射与现有证据PENDING 不等于失败或通过。python.\tools\verify_checkpoints.py--course-root.--format markdown# 第 06 课的可执行历史项目会在隔离临时目录中安装并运行 01–06 全部合同。python.\tools\verify_executable_revisions.py--lesson 06--python pythonsnapshot 目录只保存文章展示的受影响模块不要把它误当完整项目运行。01–30 都另有checkpoints/revisions/lesson-NN/的累积可执行课时树验证器会复制到临时目录、新建无系统包的 Python 3.11 venv、受约束安装、检查模块确实来自该 venv再运行本课及以前的全部合同。最终项目 selector 与历史课时 selector 各有职责不能拿最终项目的测试通过推断历史代码没有未来功能。01–08 仍只用 SQLite/fake 证明本地规则真实 PostgreSQL/Redis 协议要等远程隔离验收不能据这些PASS声称真实服务已经通过。完整目录事实边界与 Redis01–08中间件不是“多装几个容器”——请求之外的职责与故障地图先让工单能独立运行——TicketFlow 的基线契约与健康检查详情页为什么越热门越慢——Redis cache-aside 从零接入工单改了缓存还显示旧值——写后失效与一致性窗口缓存同时过期的那一秒——穿透、击穿、雪崩实验限流不能靠先 GET 再 INCR——Redis Lua 原子预算用户点两次提交怎么只建一张单——幂等键与请求指纹锁不是一把万能钥匙——租约、释放 token 与 Redis 故障消息交付与调度09–16消息究竟去了哪里——RabbitMQ 交换机、队列与 ACK 实验HTTP 不等通知发完——Celery Worker 与业务任务表重要工单别排在普通通知后面——路由、prefetch 与背压Worker 在 ACK 前死掉——重投、重试与时间限制“执行两次”不能“通知两次”——幂等消费者数据库提交了消息却没发出去——Transactional Outbox一条坏消息堵住整条队列——有限重试、DLQ 与重放凌晨两点的 SLA 到期了——Celery Beat、时区与去重可重建搜索投影17–22倒排索引与 Mapping搜索过滤、排序与高亮相关性、search_after 与聚合refresh、异步索引与版本乱序alias 重建与切换Elasticsearch 宕机后的显式降级边缘与可观测性23–28Nginx 双 API 统一入口body、连接、TLS 与边缘限制结构化日志与脱敏Prometheus RED 与低基数Grafana 看板、SLO 与故障手册跨进程 Trace审计、恢复与毕业验收29–32Kafka 审计流的分区和 Offset审计流重放、乱序与去重Redis、RabbitMQ、搜索和 API 联合故障恢复从空目录重放 TicketFlow如果你只记住导读的一句话请记这句中间件的价值不在“它运行了”而在“它失败时业务真相仍然可以被证明”。