module-catalog.ts 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import {
  2. Code2,
  3. Database,
  4. Layers3,
  5. ListTodo,
  6. MemoryStick,
  7. Container,
  8. Server,
  9. Activity,
  10. } from 'lucide-react';
  11. export const modules = [
  12. {
  13. slug: 'api',
  14. name: 'API 服务开发',
  15. icon: Code2,
  16. count: 16,
  17. kicker: '接口与通信',
  18. stack: 'FastAPI · HTTP · SSE · WebSocket',
  19. description:
  20. '从 Python 函数到可调用的服务,完成参数校验、REST 接口、异步调用、流式响应与双向通信。',
  21. project: '笔记与消息服务',
  22. scope:
  23. '用内存版服务理解接口行为。生产中的数据持久化、连接预算和异步任务由后续模块逐步补齐。',
  24. prerequisites: ['Python 函数、列表与字典', '能创建虚拟环境、执行终端命令'],
  25. depends: [],
  26. outcomes: [
  27. '从空目录启动服务,用 /docs 和 curl 验证接口。',
  28. '完成 CRUD,正确处理状态码、输入校验与错误。',
  29. '消费 SSE 并释放连接,处理 WebSocket 断开。',
  30. '用自动化测试复现接口成功与失败路径。',
  31. ],
  32. },
  33. {
  34. slug: 'database',
  35. name: '数据库开发',
  36. icon: Database,
  37. count: 12,
  38. kicker: '数据与事务',
  39. stack: 'PostgreSQL 16 · SQL · psycopg 3',
  40. description:
  41. '建立有约束的数据模型,编写查询,在并发和故障下验证事务、锁、索引与数据恢复。',
  42. project: 'notes_lab 数据库',
  43. scope:
  44. '从表结构和 SQL 开始,完成查询计划分析、并发事务实验、最小权限与可恢复的备份。',
  45. prerequisites: [
  46. '已完成 API 服务开发',
  47. 'PostgreSQL 16 与独立 notes_lab 练习库',
  48. ],
  49. depends: ['api'],
  50. outcomes: [
  51. '用数据库约束保护数据,而非仅依赖应用校验。',
  52. '使用两个会话复现隔离、锁等待和死锁。',
  53. '根据 EXPLAIN 与实际数据选择索引和查询方式。',
  54. '完成受限账户访问、备份与隔离恢复验收。',
  55. ],
  56. },
  57. {
  58. slug: 'api-database',
  59. name: 'API + 数据库',
  60. icon: Layers3,
  61. count: 12,
  62. kicker: '持久化服务',
  63. stack: 'SQLAlchemy 2 · Alembic · PostgreSQL',
  64. description:
  65. '把笔记接口接入数据库,明确会话与事务边界,处理并发更新、幂等请求和兼容性迁移。',
  66. project: 'notes-service 持久化 API',
  67. scope:
  68. '以请求生命周期组织连接、事务和错误;用版本字段、唯一约束与 outbox 处理跨请求及跨进程一致性。',
  69. prerequisites: ['REST 接口与 Pydantic 模型', 'SQL、事务和数据库连接'],
  70. depends: ['api', 'database'],
  71. outcomes: [
  72. '每个请求独立使用 Session,并在明确边界提交或回滚。',
  73. '验证连接池预算、超时、重复提交与并发修改。',
  74. '通过 Alembic 实施兼容性迁移并验证旧版本行为。',
  75. '以真实 PostgreSQL 测试约束、事务和故障路径。',
  76. ],
  77. },
  78. {
  79. slug: 'tasks',
  80. name: '异步任务开发',
  81. icon: ListTodo,
  82. count: 16,
  83. kicker: '并发与任务执行',
  84. stack: 'asyncio · threading · multiprocessing · Celery',
  85. description:
  86. '根据 I/O、CPU、隔离与持久性要求选择执行方式,把长任务变成可限流、可重试、可恢复的任务系统。',
  87. project: '笔记导出与长文处理任务',
  88. scope:
  89. '从事件循环、线程和进程开始,再引入任务队列、数据库状态、outbox、工作租约和故障恢复。',
  90. prerequisites: [
  91. 'API 与数据库事务',
  92. 'Linux / WSL2 运行 Celery worker;Redis 基本连接',
  93. ],
  94. depends: ['api-database'],
  95. outcomes: [
  96. '为 I/O 与 CPU 工作选择有界的协程、线程池或进程池。',
  97. '区分进程内后台任务与可持久化任务队列。',
  98. '处理重复投递、超时、取消、重试与 worker 退出。',
  99. '验证状态机、幂等、背压、调度与任务积压告警。',
  100. ],
  101. },
  102. {
  103. slug: 'redis',
  104. name: 'Redis 缓存',
  105. icon: MemoryStick,
  106. count: 10,
  107. kicker: '缓存与协调',
  108. stack: 'Redis 7 · redis-py · Cache Aside',
  109. description:
  110. '为读请求引入缓存,明确数据真源、失效窗口和容量边界,复现穿透、击穿、雪崩与 Redis 故障。',
  111. project: 'notes-service 查询缓存',
  112. scope:
  113. '缓存只承载可重建数据;围绕更新失效、热点保护、并发控制、内存策略与故障降级设计实现。',
  114. prerequisites: ['持久化 API 与事务提交边界', 'Redis 独立练习实例'],
  115. depends: ['api-database'],
  116. outcomes: [
  117. '实现包含 TTL 与键版本的缓存读取和更新失效。',
  118. '在并发下验证缓存击穿、过期抖动与热点保护。',
  119. '设置内存预算、连接超时与可用的失败降级。',
  120. '明确锁、计数器、会话与队列各自的可靠性边界。',
  121. ],
  122. },
  123. {
  124. slug: 'docker',
  125. name: 'Docker 容器化',
  126. icon: Container,
  127. count: 10,
  128. kicker: '构建与运行',
  129. stack: 'Docker Engine · Compose · OCI Images',
  130. description:
  131. '构建可复现镜像,组合 API、数据库、缓存与 worker,管理数据、网络、资源、健康检查与升级。',
  132. project: 'notes-service 容器运行环境',
  133. scope:
  134. '区分镜像、容器和持久卷;用非 root 运行、固定依赖、资源上限、迁移作业与可回滚发布管理服务。',
  135. prerequisites: [
  136. 'API、数据库、Redis 与任务进程的职责',
  137. 'Docker Engine / Docker Desktop 与 Compose',
  138. ],
  139. depends: ['tasks', 'redis'],
  140. outcomes: [
  141. '构建分层合理、非 root 运行的应用镜像。',
  142. '使用服务名、健康检查和持久卷组织多容器系统。',
  143. '验证优雅退出、资源限制、密钥注入与日志输出。',
  144. '在保留数据库数据的条件下完成升级与回滚。',
  145. ],
  146. },
  147. {
  148. slug: 'linux',
  149. name: 'Linux 部署',
  150. icon: Server,
  151. count: 10,
  152. kicker: '交付与运维',
  153. stack: 'Linux · systemd · Nginx · TLS',
  154. description:
  155. '把本地可运行服务部署到 Linux,建立权限边界、进程管理、反向代理、发布回滚与备份恢复流程。',
  156. project: 'notes-service Linux 部署',
  157. scope:
  158. '以独立练习主机为环境,验证服务启动、网络入口、流式代理、凭证权限、发布检查与恢复手册。',
  159. prerequisites: ['容器与服务网络', '独立 Linux 练习机,使用普通账户与 sudo'],
  160. depends: ['docker'],
  161. outcomes: [
  162. '建立最小权限运行账户、目录权限与网络入口。',
  163. '管理 systemd 服务并验证重启和停止行为。',
  164. '为 HTTP、SSE 和 WebSocket 配置代理与 TLS。',
  165. '执行有健康门槛的发布、回滚及隔离恢复演练。',
  166. ],
  167. },
  168. {
  169. slug: 'troubleshooting',
  170. name: '线上问题排查',
  171. icon: Activity,
  172. count: 12,
  173. kicker: '观测与故障恢复',
  174. stack: 'Logs · Metrics · Traces · Runbooks',
  175. description:
  176. '从请求症状建立证据链,定位 CPU、内存、连接、数据库、缓存与队列问题,验证止损和修复效果。',
  177. project: 'notes-service 故障演练环境',
  178. scope:
  179. '先定义影响范围,再观察指标、日志和追踪;在隔离环境复现故障,记录恢复操作与复发条件。',
  180. prerequisites: [
  181. 'API、数据库、任务与缓存实现',
  182. 'Linux 部署与独立故障演练环境',
  183. ],
  184. depends: ['linux'],
  185. outcomes: [
  186. '用请求 ID、日志与指标缩小问题范围。',
  187. '区分事件循环阻塞、CPU 饱和、内存增长和连接耗尽。',
  188. '定位慢 SQL、锁等待、缓存失效与任务堆积。',
  189. '验证恢复门槛、回滚、容量改进与复盘行动。',
  190. ],
  191. },
  192. ] as const;
  193. export type ModuleSlug = (typeof modules)[number]['slug'];
  194. export type ModuleInfo = (typeof modules)[number];
  195. export function getModule(slug: string) {
  196. return modules.find((m) => m.slug === slug);
  197. }