@chongyan/autospec 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +472 -0
  3. package/README.md +476 -0
  4. package/bin/autospec.js +3 -0
  5. package/knowledge/README.md +144 -0
  6. package/knowledge/checklists/code.md +182 -0
  7. package/knowledge/checklists/design.md +196 -0
  8. package/knowledge/checklists/release.md +70 -0
  9. package/knowledge/checklists/requirement.md +169 -0
  10. package/knowledge/checklists/test.md +46 -0
  11. package/knowledge/config/README.en.md +44 -0
  12. package/knowledge/config/README.md +44 -0
  13. package/knowledge/config/role-composition.yaml +98 -0
  14. package/knowledge/config/role-extensions.yaml +140 -0
  15. package/knowledge/config/skill-compositions.yaml +142 -0
  16. package/knowledge/config/team-stage.yaml +95 -0
  17. package/knowledge/config/team-tasks.yaml +139 -0
  18. package/knowledge/config/team-triggers.yaml +198 -0
  19. package/knowledge/config/validation-patterns.yaml +137 -0
  20. package/knowledge/domain/README.md +115 -0
  21. package/knowledge/domain/flows/README.md +194 -0
  22. package/knowledge/domain/glossary.md +143 -0
  23. package/knowledge/domain/rules.md +138 -0
  24. package/knowledge/environment/README.en.md +36 -0
  25. package/knowledge/environment/README.md +87 -0
  26. package/knowledge/environment/component-knowledge.md +316 -0
  27. package/knowledge/environment/detection-patterns.yaml +502 -0
  28. package/knowledge/environment/middleware-knowledge.md +237 -0
  29. package/knowledge/environment/template-registry.md +321 -0
  30. package/knowledge/guides/domain-driven-design.md +345 -0
  31. package/knowledge/guides/knowledge-management.md +369 -0
  32. package/knowledge/guides/requirement-engineering.md +329 -0
  33. package/knowledge/guides/stages/ai-effect-evaluator.md +93 -0
  34. package/knowledge/guides/stages/code-implementer.md +205 -0
  35. package/knowledge/guides/stages/code-reviewer.md +111 -0
  36. package/knowledge/guides/stages/consistency-checker.md +177 -0
  37. package/knowledge/guides/stages/design-planner.md +401 -0
  38. package/knowledge/guides/stages/design-reviewer.md +83 -0
  39. package/knowledge/guides/stages/integration-test-runner.md +105 -0
  40. package/knowledge/guides/stages/release-checker.md +205 -0
  41. package/knowledge/guides/stages/requirement-analyzer.md +195 -0
  42. package/knowledge/guides/stages/requirement-reviewer.md +83 -0
  43. package/knowledge/guides/stages/security-reviewer.md +89 -0
  44. package/knowledge/guides/stages/test-context-analyzer.md +250 -0
  45. package/knowledge/guides/stages/test-generator.md +241 -0
  46. package/knowledge/guides/stages/test-planner.md +183 -0
  47. package/knowledge/guides/stages/test-reviewer.md +76 -0
  48. package/knowledge/guides/stages/unit-test-runner.md +83 -0
  49. package/knowledge/guides/support/ai-agent-analyzer.md +362 -0
  50. package/knowledge/guides/support/ai-anomaly-analyzer.md +213 -0
  51. package/knowledge/guides/support/ai-artifact-evaluator.md +192 -0
  52. package/knowledge/guides/support/ai-capability-analyzer.md +193 -0
  53. package/knowledge/guides/support/ai-component-analyzer.md +169 -0
  54. package/knowledge/guides/support/ai-data-validator.md +276 -0
  55. package/knowledge/guides/support/ai-evaluation-planner.md +374 -0
  56. package/knowledge/guides/support/ai-path-evaluator.md +274 -0
  57. package/knowledge/guides/support/ai-pipeline-evaluator.md +219 -0
  58. package/knowledge/guides/support/ai-rag-analyzer.md +339 -0
  59. package/knowledge/guides/support/ai-task-assessor.md +418 -0
  60. package/knowledge/guides/support/ai-test-diagnostics.md +133 -0
  61. package/knowledge/guides/support/complexity-assessor.md +268 -0
  62. package/knowledge/guides/support/component-discovery.md +183 -0
  63. package/knowledge/guides/support/environment-scanner.md +207 -0
  64. package/knowledge/guides/support/environment-validator.md +207 -0
  65. package/knowledge/guides/support/knowledge-generator.md +234 -0
  66. package/knowledge/guides/support/methodology-extractor.md +55 -0
  67. package/knowledge/guides/support/pipeline-protocol.md +438 -0
  68. package/knowledge/guides/support/practice-logger.md +359 -0
  69. package/knowledge/guides/support/scope-inference.md +174 -0
  70. package/knowledge/guides/support/skill-distiller.md +91 -0
  71. package/knowledge/guides/support/skill-updater.md +45 -0
  72. package/knowledge/guides/support/skill-validator.md +72 -0
  73. package/knowledge/guides/support/team-orchestrator.md +323 -0
  74. package/knowledge/guides/support/tech-stack-analyzer.md +139 -0
  75. package/knowledge/guides/support/test-runner.md +254 -0
  76. package/knowledge/guides/system-design.md +352 -0
  77. package/knowledge/organization/ai-native-team.md +318 -0
  78. package/knowledge/organization/team-metrics.md +228 -0
  79. package/knowledge/principles/constitution.md +134 -0
  80. package/knowledge/principles/core-principles.md +368 -0
  81. package/knowledge/principles/design-philosophy.md +877 -0
  82. package/knowledge/principles/evolution.md +553 -0
  83. package/knowledge/process/01-requirement.md +113 -0
  84. package/knowledge/process/02-design.md +123 -0
  85. package/knowledge/process/03-implementation.md +90 -0
  86. package/knowledge/process/04-review.md +80 -0
  87. package/knowledge/process/05-testing.md +90 -0
  88. package/knowledge/process/06-delivery.md +88 -0
  89. package/knowledge/process/README.en.md +38 -0
  90. package/knowledge/process/README.md +48 -0
  91. package/knowledge/process/ai-sdlc.md +475 -0
  92. package/knowledge/process/overview.md +319 -0
  93. package/knowledge/standards/code-review.md +876 -0
  94. package/knowledge/standards/coding-style.md +940 -0
  95. package/knowledge/standards/data-consistency.md +1085 -0
  96. package/knowledge/standards/document-versioning.md +210 -0
  97. package/knowledge/standards/risk-detection.md +186 -0
  98. package/knowledge/templates/ai-evaluation.md +150 -0
  99. package/knowledge/templates/api-design.md +117 -0
  100. package/knowledge/templates/database-design.md +132 -0
  101. package/knowledge/templates/domain-driven-design.md +321 -0
  102. package/knowledge/templates/product-proposal.md +201 -0
  103. package/knowledge/templates/system-design.md +227 -0
  104. package/knowledge/templates/task-breakdown.md +107 -0
  105. package/knowledge/templates/test-case.md +170 -0
  106. package/package.json +53 -0
  107. package/plugins/.claude-plugin/plugin.json +134 -0
  108. package/plugins/agents/roles/ai-engineer.md +129 -0
  109. package/plugins/agents/roles/backend-engineer.md +165 -0
  110. package/plugins/agents/roles/ceo.md +94 -0
  111. package/plugins/agents/roles/data-engineer.md +135 -0
  112. package/plugins/agents/roles/devops-engineer.md +181 -0
  113. package/plugins/agents/roles/frontend-engineer.md +129 -0
  114. package/plugins/agents/roles/product-owner.md +98 -0
  115. package/plugins/agents/roles/quality-engineer.md +129 -0
  116. package/plugins/agents/roles/security-engineer.md +180 -0
  117. package/plugins/agents/roles/tech-lead.md +97 -0
  118. package/plugins/agents/support/blind-comparator.md +88 -0
  119. package/plugins/agents/support/consistency-checker.md +103 -0
  120. package/plugins/agents/support/failure-diagnostician.md +141 -0
  121. package/plugins/agents/support/independent-reviewer.md +80 -0
  122. package/plugins/agents/support/safety-auditor.md +121 -0
  123. package/plugins/agents/support/skill-benchmarker.md +86 -0
  124. package/plugins/agents/support/skill-forger.md +105 -0
  125. package/plugins/agents/support/stage-gate-evaluator.md +121 -0
  126. package/plugins/agents/support/test-coverage-reviewer.md +73 -0
  127. package/plugins/benchmarks/templates/README.md +44 -0
  128. package/plugins/benchmarks/templates/commands/explore-template.yaml +48 -0
  129. package/plugins/benchmarks/templates/pipeline/agile-template.yaml +84 -0
  130. package/plugins/benchmarks/templates/pipeline/waterfall-template.yaml +106 -0
  131. package/plugins/benchmarks/templates/skills/requirement-analyzer-template.yaml +48 -0
  132. package/plugins/commands/README.en.md +96 -0
  133. package/plugins/commands/README.md +96 -0
  134. package/plugins/commands/apply.md +191 -0
  135. package/plugins/commands/archive.md +76 -0
  136. package/plugins/commands/env-export.md +79 -0
  137. package/plugins/commands/env-sync.md +640 -0
  138. package/plugins/commands/env-template.md +223 -0
  139. package/plugins/commands/env-update.md +264 -0
  140. package/plugins/commands/env-validate.md +176 -0
  141. package/plugins/commands/env.md +79 -0
  142. package/plugins/commands/explore.md +76 -0
  143. package/plugins/commands/field-evolve.md +536 -0
  144. package/plugins/commands/memory.md +249 -0
  145. package/plugins/commands/project-evolve.md +821 -0
  146. package/plugins/commands/propose.md +93 -0
  147. package/plugins/commands/review.md +140 -0
  148. package/plugins/commands/run.md +224 -0
  149. package/plugins/commands/status.md +62 -0
  150. package/plugins/commands/validate.md +108 -0
  151. package/plugins/hooks/README.en.md +56 -0
  152. package/plugins/hooks/README.md +56 -0
  153. package/plugins/hooks/ai-project-guard.js +329 -0
  154. package/plugins/hooks/artifact-evaluation-hook.js +237 -0
  155. package/plugins/hooks/constitution-guard.js +211 -0
  156. package/plugins/hooks/environment-autocommit.js +264 -0
  157. package/plugins/hooks/environment-manager.js +778 -0
  158. package/plugins/hooks/execution-tracker.js +354 -0
  159. package/plugins/hooks/frozen-zone-guard.js +140 -0
  160. package/plugins/hooks/layer1-validator.js +423 -0
  161. package/plugins/hooks/lib/artifact-evaluator.js +414 -0
  162. package/plugins/hooks/lib/benchmarks/change-detector.js +390 -0
  163. package/plugins/hooks/lib/benchmarks/evaluator.js +605 -0
  164. package/plugins/hooks/lib/benchmarks/integration-example.js +169 -0
  165. package/plugins/hooks/lib/data-and-ai-detector.js +275 -0
  166. package/plugins/hooks/lib/detection-pattern-loader.js +865 -0
  167. package/plugins/hooks/lib/directory-discovery.js +395 -0
  168. package/plugins/hooks/lib/environment-config-loader.js +341 -0
  169. package/plugins/hooks/lib/environment-detector.js +553 -0
  170. package/plugins/hooks/lib/environment-evolver.js +564 -0
  171. package/plugins/hooks/lib/environment-registry.js +813 -0
  172. package/plugins/hooks/lib/execution-path.js +427 -0
  173. package/plugins/hooks/lib/hook-error-recorder.js +245 -0
  174. package/plugins/hooks/lib/hook-logger.js +538 -0
  175. package/plugins/hooks/lib/hook-runner.js +97 -0
  176. package/plugins/hooks/lib/hook-runner.sh +44 -0
  177. package/plugins/hooks/lib/hook-state-manager.js +480 -0
  178. package/plugins/hooks/lib/memory-extractor.js +377 -0
  179. package/plugins/hooks/lib/memory-manager.js +673 -0
  180. package/plugins/hooks/lib/metrics-analyzer.js +489 -0
  181. package/plugins/hooks/lib/project-evolution/auto-fixer.js +511 -0
  182. package/plugins/hooks/lib/project-evolution/memory-manager.js +346 -0
  183. package/plugins/hooks/lib/project-evolution/pattern-detector.js +476 -0
  184. package/plugins/hooks/lib/project-evolution/semantic-indexer.js +480 -0
  185. package/plugins/hooks/lib/project-structure-detector.js +326 -0
  186. package/plugins/hooks/lib/rollback-tracker.js +346 -0
  187. package/plugins/hooks/lib/source-code-scanner.js +596 -0
  188. package/plugins/hooks/lib/technology-stack-detector.js +374 -0
  189. package/plugins/hooks/lib/test-failure-analyzer.js +375 -0
  190. package/plugins/hooks/lib/test-failure-fixer.js +268 -0
  191. package/plugins/hooks/lib/trace-context.js +277 -0
  192. package/plugins/hooks/lib/validation-patterns.js +415 -0
  193. package/plugins/hooks/memory-sync.js +171 -0
  194. package/plugins/hooks/pipeline-observer.js +413 -0
  195. package/plugins/hooks/scope-sentinel.js +204 -0
  196. package/plugins/hooks/trace-initialization.js +169 -0
  197. package/plugins/memory/templates/code-quality.yaml +149 -0
  198. package/plugins/memory/templates/multi-system.yaml +155 -0
  199. package/plugins/memory/templates/team-habits.yaml +119 -0
  200. package/plugins/memory/templates/testing.yaml +121 -0
  201. package/plugins/skills/README.en.md +47 -0
  202. package/plugins/skills/README.md +104 -0
  203. package/plugins/skills/benchmark-executor/README.md +93 -0
  204. package/plugins/skills/benchmark-executor/SKILL.md +647 -0
  205. package/plugins/skills/benchmark-generator/SKILL.md +349 -0
  206. package/plugins/skills/delivery-stage/SKILL.md +203 -0
  207. package/plugins/skills/design-stage/SKILL.md +216 -0
  208. package/plugins/skills/evolution-process/SKILL.md +291 -0
  209. package/plugins/skills/exploration-phase/SKILL.md +133 -0
  210. package/plugins/skills/implementation-stage/SKILL.md +179 -0
  211. package/plugins/skills/layer1-validation/SKILL.md +79 -0
  212. package/plugins/skills/pending-dashboard/SKILL.md +109 -0
  213. package/plugins/skills/project-evolution/SKILL.md +847 -0
  214. package/plugins/skills/requirement-stage/SKILL.md +183 -0
  215. package/plugins/skills/skill-forge/SKILL.md +223 -0
  216. package/plugins/skills/skill-forge/references/description-guide.md +92 -0
  217. package/plugins/skills/skill-forge/references/quality-rubric.md +104 -0
  218. package/plugins/skills/skill-forge/references/skill-template.md +106 -0
  219. package/plugins/skills/startup-guard/SKILL.md +38 -0
  220. package/plugins/skills/testing-stage/SKILL.md +195 -0
  221. package/scripts/cli/global-init.js +288 -0
  222. package/scripts/cli/global.js +324 -0
  223. package/scripts/cli/index.js +55 -0
  224. package/scripts/cli/init.js +382 -0
  225. package/scripts/cli/list.js +69 -0
  226. package/scripts/cli/org.js +340 -0
  227. package/scripts/cli/update.js +44 -0
  228. package/scripts/config/commands.config.js +145 -0
  229. package/scripts/config/hooks.config.js +197 -0
  230. package/scripts/evolution/evolution-router.js +273 -0
  231. package/scripts/evolution/evolution-signal-collector.js +307 -0
  232. package/scripts/evolution/knowledge-loader.js +346 -0
  233. package/scripts/evolution/marketplace.js +317 -0
  234. package/scripts/evolution/version-manager.js +371 -0
  235. package/scripts/install/agents.js +106 -0
  236. package/scripts/install/commands.js +133 -0
  237. package/scripts/install/constants.js +424 -0
  238. package/scripts/install/hook-logger.js +536 -0
  239. package/scripts/install/hooks.js +110 -0
  240. package/scripts/install/index.js +39 -0
  241. package/scripts/install/skills.js +95 -0
  242. package/scripts/postinstall.js +25 -0
  243. package/scripts/state.js +376 -0
@@ -0,0 +1,1085 @@
1
+ # 跨域系统数据一致性保证方案
2
+
3
+ > **文档版本**: v1.0
4
+ > **最后更新**: 2026-03-26
5
+ > **适用范围**: 所有涉及跨域协作的分布式系统
6
+ > **核心目标**: 定义跨域系统数据一致性保证的标准方案和最佳实践
7
+
8
+ ---
9
+
10
+ ## 概述
11
+
12
+ 在分布式系统架构中,当一个业务流程涉及多个业务域时,如何保证跨域数据的一致性是关键挑战。本文档定义了**三种主流的一致性保证方案**,以及**接口幂等性设计**的最佳实践。
13
+
14
+ ### 核心原则
15
+
16
+ 1. **业务优先**:根据业务特性选择合适的一致性方案,不是所有场景都需要强一致性
17
+ 2. **性能平衡**:在一致性和性能之间找到平衡点
18
+ 3. **可监控**:所有一致性方案必须有完善的监控和告警
19
+ 4. **可补偿**:异常场景必须有明确的补偿或人工介入机制
20
+
21
+ ---
22
+
23
+ ## 一致性级别对比
24
+
25
+ | 一致性级别 | 特点 | 适用场景 | 典型方案 |
26
+ |-----------|------|---------|---------|
27
+ | **强一致性** | 实时保证数据一致 | 核心交易、关键数据操作 | 分布式事务(2PC/SAGA) |
28
+ | **最终一致性** | 允许短暂不一致,但最终会一致 | 订单状态同步、数据同步 | 中间态 + 重试、消息队列 |
29
+ | **弱一致性** | 不保证一致性 | 日志记录、统计分析 | 异步写入 |
30
+
31
+ **系统推荐**:
32
+ - **核心交易**:强一致性(分布式事务)
33
+ - **订单状态**:最终一致性(中间态 + 重试 或 消息队列)
34
+ - **统计数据**:弱一致性(异步同步)
35
+
36
+ ---
37
+
38
+ ## 方案一:分布式事务(强一致性)
39
+
40
+ ### 适用场景
41
+
42
+ - ✅ 涉及核心数据操作(扣款、退款、转账)
43
+ - ✅ 核心业务数据修改
44
+ - ✅ 不可分割的业务操作(要么全部成功,要么全部失败)
45
+ - ✅ 业务要求实时一致性
46
+
47
+ ### 不适用场景
48
+
49
+ - ❌ 高并发场景(性能瓶颈)
50
+ - ❌ 可接受短暂不一致的场景
51
+ - ❌ 涉及外部系统的操作(外部系统可能不支持分布式事务)
52
+
53
+ ---
54
+
55
+ ### 1.1 两阶段提交(2PC - Two-Phase Commit)
56
+
57
+ #### 原理
58
+
59
+ ```mermaid
60
+ sequenceDiagram
61
+ participant C as 协调者
62
+ participant A as 系统 A
63
+ participant B as 系统 B
64
+
65
+ Note over C,B: 阶段 1: 准备阶段
66
+ C->>A: prepare(预操作)
67
+ A-->>C: 准备成功
68
+ C->>B: prepare(预操作)
69
+ B-->>C: 准备成功
70
+
71
+ Note over C,B: 阶段 2: 提交阶段
72
+ C->>A: commit(提交操作)
73
+ A-->>C: 提交成功
74
+ C->>B: commit(提交操作)
75
+ B-->>C: 提交成功
76
+ ```
77
+
78
+ #### 优点
79
+ - ✅ 强一致性保证
80
+ - ✅ 实现简单,逻辑清晰
81
+ - ✅ 数据库天然支持
82
+
83
+ #### 缺点
84
+ - ❌ 性能差(阻塞等待)
85
+ - ❌ 单点故障(协调者故障导致阻塞)
86
+ - ❌ 不适合高并发场景
87
+
88
+ #### 实现示例(伪代码)
89
+
90
+ ```java
91
+ @Transactional
92
+ public void executeWithTwoPhaseCommit(TransactionContext context) {
93
+ // 阶段 1: 准备阶段
94
+ boolean systemAPrepared = systemAService.prepare(context);
95
+ boolean systemBPrepared = systemBService.prepare(context);
96
+
97
+ if (systemAPrepared && systemBPrepared) {
98
+ // 阶段 2: 提交阶段
99
+ try {
100
+ systemAService.commit(context);
101
+ systemBService.commit(context);
102
+ } catch (Exception e) {
103
+ // 提交失败,回滚
104
+ systemAService.rollback(context);
105
+ systemBService.rollback(context);
106
+ throw e;
107
+ }
108
+ } else {
109
+ // 准备失败,回滚
110
+ if (systemAPrepared) systemAService.rollback(context);
111
+ if (systemBPrepared) systemBService.rollback(context);
112
+ throw new TransactionException("准备阶段失败");
113
+ }
114
+ }
115
+ ```
116
+
117
+ #### 使用建议
118
+
119
+ **推荐场景**:
120
+ ```
121
+ ✅ 账户转账
122
+ - 系统 A:扣减余额
123
+ - 系统 B:增加余额
124
+ - 要求:实时一致,不允许出现扣减但未增加的情况
125
+ ```
126
+
127
+ **监控指标**:
128
+ - 准备阶段成功率
129
+ - 提交阶段成功率
130
+ - 平均执行时间
131
+ - 阻塞等待时间
132
+
133
+ ---
134
+
135
+ ### 1.2 SAGA 模式(补偿型分布式事务)
136
+
137
+ #### 原理
138
+
139
+ ```mermaid
140
+ sequenceDiagram
141
+ participant T as 交易域
142
+ participant A as 账户域
143
+ participant B as 业务域
144
+
145
+ Note over T,B: 正向流程
146
+ T->>A: 1. 冻结余额
147
+ A-->>T: 冻结成功
148
+ T->>B: 2. 创建订单
149
+ B-->>T: 创建成功
150
+ T->>A: 3. 扣减余额
151
+ A-->>T: 扣减成功
152
+ T->>B: 4. 确认订单
153
+ B-->>T: 确认成功
154
+
155
+ Note over T,B: 补偿流程(步骤 3 失败)
156
+ T->>B: C2. 取消订单
157
+ B-->>T: 取消成功
158
+ T->>A: C1. 解冻余额
159
+ A-->>T: 解冻成功
160
+ ```
161
+
162
+ #### 核心要素
163
+
164
+ 1. **正向操作(Ti)**:每个步骤的正常操作
165
+ 2. **补偿操作(Ci)**:每个步骤的回滚操作
166
+ 3. **补偿规则**:如果 Ti 失败,则执行 Ci、Ci-1、...、C1
167
+
168
+ #### 优点
169
+ - ✅ 性能好(异步执行,非阻塞)
170
+ - ✅ 可用性高(无协调者单点故障)
171
+ - ✅ 适合长事务
172
+
173
+ #### 缺点
174
+ - ❌ 最终一致性(非实时)
175
+ - ❌ 补偿逻辑复杂
176
+ - ❌ 需要业务支持补偿操作
177
+
178
+ #### 实现示例(伪代码)
179
+
180
+ ```java
181
+ public class SagaOrchestrator {
182
+
183
+ private List<SagaStep> steps = new ArrayList<>();
184
+
185
+ public void execute() {
186
+ List<SagaStep> executedSteps = new ArrayList<>();
187
+
188
+ try {
189
+ // 正向执行
190
+ for (SagaStep step : steps) {
191
+ step.forward();
192
+ executedSteps.add(step);
193
+ }
194
+ } catch (Exception e) {
195
+ // 补偿执行(逆序)
196
+ Collections.reverse(executedSteps);
197
+ for (SagaStep step : executedSteps) {
198
+ try {
199
+ step.compensate();
200
+ } catch (Exception ce) {
201
+ // 补偿失败,记录日志,告警
202
+ log.error("补偿失败:{}", step, ce);
203
+ alertService.send("SAGA 补偿失败", step);
204
+ }
205
+ }
206
+ throw e;
207
+ }
208
+ }
209
+ }
210
+
211
+ // SAGA 步骤定义示例
212
+ public class ExampleSaga {
213
+
214
+ @SagaStep(order = 1)
215
+ public void freezeResource(TransactionContext ctx) {
216
+ // 正向:冻结资源
217
+ resourceService.freeze(ctx.getResourceId());
218
+ }
219
+
220
+ @Compensate(for = "freezeResource")
221
+ public void unfreezeResource(TransactionContext ctx) {
222
+ // 补偿:解冻资源
223
+ resourceService.unfreeze(ctx.getResourceId());
224
+ }
225
+
226
+ @SagaStep(order = 2)
227
+ public void createOrder(TransactionContext ctx) {
228
+ // 正向:创建订单
229
+ orderService.create(ctx.getOrder());
230
+ }
231
+
232
+ @Compensate(for = "createOrder")
233
+ public void cancelOrder(TransactionContext ctx) {
234
+ // 补偿:取消订单
235
+ orderService.cancel(ctx.getOrderId());
236
+ }
237
+
238
+ @SagaStep(order = 3)
239
+ public void deductResource(TransactionContext ctx) {
240
+ // 正向:扣减资源
241
+ resourceService.deduct(ctx.getResourceId());
242
+ }
243
+
244
+ @Compensate(for = "deductResource")
245
+ public void refundResource(TransactionContext ctx) {
246
+ // 补偿:退还资源
247
+ resourceService.refund(ctx.getResourceId());
248
+ }
249
+ }
250
+ ```
251
+
252
+ #### 补偿策略表
253
+
254
+ | 步骤 | 正向操作 | 补偿操作 | 补偿条件 | 补偿幂等性 |
255
+ |------|---------|---------|---------|-----------|
256
+ | 1 | 冻结资源 | 解冻资源 | 后续步骤失败 | 根据冻结记录 ID 解冻 |
257
+ | 2 | 创建订单 | 取消订单 | 扣减失败 | 根据订单 ID 取消,支持重复取消 |
258
+ | 3 | 扣减资源 | 退还资源 | 确认失败 | 根据交易流水号退还,支持重复退还 |
259
+
260
+ #### 使用建议
261
+
262
+ **推荐场景**:
263
+ ```
264
+ ✅ 下单扣库存
265
+ - 系统 A:冻结库存 → 扣减库存
266
+ - 系统 B:创建订单 → 确认订单
267
+ - 特点:可接受短暂不一致,有明确的补偿流程
268
+ ```
269
+
270
+ **监控指标**:
271
+ - 正向流程成功率
272
+ - 补偿流程触发次数
273
+ - 补偿流程成功率
274
+ - 平均执行时间
275
+ - 一致性达成时间(从发起到最终一致的时间)
276
+
277
+ ---
278
+
279
+ ## 方案二:中间态 + 定时任务重试(最终一致性)
280
+
281
+ ### 适用场景
282
+
283
+ - ✅ 订单状态同步
284
+ - ✅ 数据同步任务
285
+ - ✅ 可接受延迟的业务操作
286
+ - ✅ 外部系统调用(外部系统可能不可靠)
287
+
288
+ ### 不适用场景
289
+
290
+ - ❌ 实时性要求高的场景
291
+ - ❌ 核心数据操作
292
+
293
+ ---
294
+
295
+ ### 2.1 设计原理
296
+
297
+ #### 核心思想
298
+
299
+ 1. **引入中间状态**:在业务流程中引入中间状态(如 PENDING、PROCESSING)
300
+ 2. **定时任务重试**:定时扫描中间状态的记录,重试未完成的操作
301
+ 3. **状态流转**:成功后流转到最终状态(SUCCESS、FAILED)
302
+
303
+ #### 状态机设计
304
+
305
+ ```mermaid
306
+ stateDiagram-v2
307
+ [*] --> INIT: 创建记录
308
+ INIT --> PROCESSING: 开始处理
309
+ PROCESSING --> SUCCESS: 处理成功
310
+ PROCESSING --> RETRY: 处理失败
311
+ RETRY --> PROCESSING: 定时任务重试
312
+ RETRY --> FAILED: 超过最大重试次数
313
+ SUCCESS --> [*]
314
+ FAILED --> [*]
315
+ ```
316
+
317
+ #### 数据模型设计
318
+
319
+ ```java
320
+ @Table(name = "sync_task")
321
+ public class SyncTask {
322
+
323
+ @Id
324
+ private Long id;
325
+
326
+ // 业务 ID
327
+ private String bizId;
328
+
329
+ // 状态:INIT, PROCESSING, RETRY, SUCCESS, FAILED
330
+ private String status;
331
+
332
+ // 重试次数
333
+ private Integer retryCount;
334
+
335
+ // 最大重试次数
336
+ private Integer maxRetryCount;
337
+
338
+ // 下次重试时间
339
+ private LocalDateTime nextRetryTime;
340
+
341
+ // 错误信息
342
+ private String errorMessage;
343
+
344
+ // 创建时间
345
+ private LocalDateTime createTime;
346
+
347
+ // 更新时间
348
+ private LocalDateTime updateTime;
349
+ }
350
+ ```
351
+
352
+ ---
353
+
354
+ ### 2.2 实现示例
355
+
356
+ #### 业务流程
357
+
358
+ ```java
359
+ @Service
360
+ public class SyncService {
361
+
362
+ /**
363
+ * 同步数据到下游系统
364
+ */
365
+ public void syncData(String bizId) {
366
+ // 1. 创建同步任务
367
+ SyncTask task = new SyncTask();
368
+ task.setBizId(bizId);
369
+ task.setStatus("INIT");
370
+ task.setRetryCount(0);
371
+ task.setMaxRetryCount(5);
372
+ task.setNextRetryTime(LocalDateTime.now());
373
+ taskRepository.save(task);
374
+
375
+ // 2. 异步执行同步
376
+ executeSyncAsync(task);
377
+ }
378
+
379
+ /**
380
+ * 异步执行同步
381
+ */
382
+ @Async
383
+ private void executeSyncAsync(SyncTask task) {
384
+ try {
385
+ // 更新状态为 PROCESSING
386
+ task.setStatus("PROCESSING");
387
+ taskRepository.save(task);
388
+
389
+ // 调用下游系统
390
+ downstreamService.sync(task.getBizId());
391
+
392
+ // 同步成功
393
+ task.setStatus("SUCCESS");
394
+ taskRepository.save(task);
395
+
396
+ } catch (Exception e) {
397
+ // 同步失败,更新为 RETRY 状态
398
+ task.setStatus("RETRY");
399
+ task.setRetryCount(task.getRetryCount() + 1);
400
+ task.setErrorMessage(e.getMessage());
401
+
402
+ // 计算下次重试时间(指数退避)
403
+ long delayMinutes = (long) Math.pow(2, task.getRetryCount());
404
+ task.setNextRetryTime(LocalDateTime.now().plusMinutes(delayMinutes));
405
+
406
+ taskRepository.save(task);
407
+ }
408
+ }
409
+ }
410
+ ```
411
+
412
+ #### 定时任务扫描
413
+
414
+ ```java
415
+ @Component
416
+ public class SyncRetryJob {
417
+
418
+ /**
419
+ * 每分钟扫描一次需要重试的任务
420
+ */
421
+ @Scheduled(cron = "0 * * * * ?")
422
+ public void retryPendingTasks() {
423
+ // 1. 查询需要重试的任务
424
+ List<SyncTask> tasks = taskRepository.findByStatusAndNextRetryTimeBefore(
425
+ "RETRY", LocalDateTime.now()
426
+ );
427
+
428
+ // 2. 逐个重试
429
+ for (SyncTask task : tasks) {
430
+ // 检查是否超过最大重试次数
431
+ if (task.getRetryCount() >= task.getMaxRetryCount()) {
432
+ task.setStatus("FAILED");
433
+ taskRepository.save(task);
434
+
435
+ // 发送告警
436
+ alertService.send(
437
+ "同步失败",
438
+ String.format("业务 %s 同步失败,已重试 %d 次",
439
+ task.getBizId(), task.getRetryCount())
440
+ );
441
+ continue;
442
+ }
443
+
444
+ // 重试
445
+ executeSyncAsync(task);
446
+ }
447
+ }
448
+ }
449
+ ```
450
+
451
+ ---
452
+
453
+ ### 2.3 重试策略
454
+
455
+ #### 指数退避(Exponential Backoff)
456
+
457
+ ```
458
+ 重试次数 延迟时间
459
+ 1 2^1 = 2 分钟
460
+ 2 2^2 = 4 分钟
461
+ 3 2^3 = 8 分钟
462
+ 4 2^4 = 16 分钟
463
+ 5 2^5 = 32 分钟
464
+ ```
465
+
466
+ #### 固定延迟
467
+
468
+ ```
469
+ 所有重试都间隔固定时间,如 5 分钟
470
+ ```
471
+
472
+ #### 推荐策略
473
+
474
+ | 场景 | 推荐策略 | 理由 |
475
+ |------|---------|------|
476
+ | 外部系统调用 | 指数退避 | 避免频繁重试加剧外部系统压力 |
477
+ | 内部系统同步 | 固定延迟 | 内部系统恢复快,固定延迟即可 |
478
+ | 高优先级任务 | 短延迟 + 更多重试次数 | 快速恢复 |
479
+
480
+ ---
481
+
482
+ ### 2.4 使用建议
483
+
484
+ **推荐场景**:
485
+ ```
486
+ ✅ 订单状态同步到数据仓库
487
+ - 主流程:创建订单 → 记录同步任务
488
+ - 异步任务:定时同步到数仓
489
+ - 失败处理:重试 5 次,失败后告警
490
+
491
+ ✅ 向外部系统推送数据
492
+ - 主流程:完成业务操作
493
+ - 异步任务:推送到外部系统
494
+ - 失败处理:重试 + 人工介入
495
+ ```
496
+
497
+ **监控指标**:
498
+ - 待重试任务数量
499
+ - 重试成功率
500
+ - 平均重试次数
501
+ - 最终失败数量
502
+ - 一致性达成时间
503
+
504
+ ---
505
+
506
+ ## 方案三:消息队列(最终一致性)
507
+
508
+ ### 适用场景
509
+
510
+ - ✅ 异步通知
511
+ - ✅ 事件驱动架构
512
+ - ✅ 解耦系统间依赖
513
+ - ✅ 高吞吐场景
514
+
515
+ ### 不适用场景
516
+
517
+ - ❌ 实时性要求极高的场景
518
+ - ❌ 强依赖顺序的场景(除非使用顺序消息)
519
+
520
+ ---
521
+
522
+ ### 3.1 设计原理
523
+
524
+ #### 核心思想
525
+
526
+ 1. **发布 - 订阅模式**:生产者发布消息,消费者订阅消息
527
+ 2. **最终一致性**:通过消息的可靠投递保证最终一致
528
+ 3. **异步解耦**:生产者和消费者解耦,提高系统可用性
529
+
530
+ #### 架构图
531
+
532
+ ```mermaid
533
+ graph LR
534
+ A[系统 A] -->|1. 完成操作 | A
535
+ A -->|2. 发送消息 | MQ[消息队列]
536
+ MQ -->|3. 消费消息 | B[系统 B]
537
+ MQ -->|3. 消费消息 | C[系统 C]
538
+ MQ -->|3. 消费消息 | D[系统 D]
539
+
540
+ B -->|4. 更新数据 | B
541
+ C -->|4. 更新数据 | C
542
+ D -->|4. 更新数据 | D
543
+ ```
544
+
545
+ ---
546
+
547
+ ### 3.2 实现方案
548
+
549
+ #### 3.2.1 本地消息表 + 定时任务(推荐)
550
+
551
+ **保证消息可靠发送**
552
+
553
+ ```java
554
+ @Service
555
+ public class BizService {
556
+
557
+ @Transactional
558
+ public void executeBiz(BizRequest request) {
559
+ // 1. 完成业务操作
560
+ bizRepository.save(request);
561
+
562
+ // 2. 在同一个事务中,写入本地消息表
563
+ LocalMessage message = new LocalMessage();
564
+ message.setTopic("BIZ_COMPLETED");
565
+ message.setContent(JSON.toJSONString(request));
566
+ message.setStatus("PENDING"); // 待发送
567
+ messageRepository.save(message);
568
+
569
+ // 3. 事务提交后,业务和消息都保存成功
570
+ }
571
+ }
572
+
573
+ @Component
574
+ public class MessageSenderJob {
575
+
576
+ /**
577
+ * 定时扫描本地消息表,发送待发送的消息
578
+ */
579
+ @Scheduled(fixedDelay = 5000) // 每 5 秒执行一次
580
+ public void sendPendingMessages() {
581
+ List<LocalMessage> messages = messageRepository.findByStatus("PENDING");
582
+
583
+ for (LocalMessage message : messages) {
584
+ try {
585
+ // 发送消息到 MQ
586
+ mqProducer.send(message.getTopic(), message.getContent());
587
+
588
+ // 更新状态为已发送
589
+ message.setStatus("SENT");
590
+ messageRepository.save(message);
591
+
592
+ } catch (Exception e) {
593
+ // 发送失败,更新重试次数
594
+ message.setRetryCount(message.getRetryCount() + 1);
595
+
596
+ if (message.getRetryCount() >= 5) {
597
+ message.setStatus("FAILED");
598
+ // 发送告警
599
+ alertService.send("消息发送失败", message);
600
+ }
601
+ messageRepository.save(message);
602
+ }
603
+ }
604
+ }
605
+ }
606
+ ```
607
+
608
+ **数据模型**
609
+
610
+ ```java
611
+ @Table(name = "local_message")
612
+ public class LocalMessage {
613
+ @Id
614
+ private Long id;
615
+
616
+ // 消息主题
617
+ private String topic;
618
+
619
+ // 消息内容(JSON)
620
+ private String content;
621
+
622
+ // 状态:PENDING, SENT, FAILED
623
+ private String status;
624
+
625
+ // 重试次数
626
+ private Integer retryCount;
627
+
628
+ // 创建时间
629
+ private LocalDateTime createTime;
630
+ }
631
+ ```
632
+
633
+ ---
634
+
635
+ #### 3.2.2 事务消息
636
+
637
+ **事务消息机制**
638
+
639
+ ```java
640
+ @Service
641
+ public class BizService {
642
+
643
+ @Autowired
644
+ private TransactionMQProducer producer;
645
+
646
+ public void executeBiz(BizRequest request) {
647
+ // 1. 发送半消息(Half Message)
648
+ Message message = new Message("BIZ_COMPLETED", JSON.toJSONBytes(request));
649
+ producer.sendMessageInTransaction(message, request);
650
+ }
651
+
652
+ /**
653
+ * 执行本地事务
654
+ */
655
+ @Override
656
+ public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
657
+ BizRequest request = (BizRequest) arg;
658
+
659
+ try {
660
+ // 执行本地事务:完成业务操作
661
+ bizRepository.save(request);
662
+
663
+ // 本地事务成功,提交消息
664
+ return LocalTransactionState.COMMIT_MESSAGE;
665
+
666
+ } catch (Exception e) {
667
+ // 本地事务失败,回滚消息
668
+ return LocalTransactionState.ROLLBACK_MESSAGE;
669
+ }
670
+ }
671
+
672
+ /**
673
+ * 检查本地事务状态(MQ 回查)
674
+ */
675
+ @Override
676
+ public LocalTransactionState checkLocalTransaction(MessageExt msg) {
677
+ // 根据消息 ID 查询本地事务状态
678
+ String bizId = msg.getUserProperty("bizId");
679
+ BizRecord record = bizRepository.findById(bizId);
680
+
681
+ if (record != null) {
682
+ return LocalTransactionState.COMMIT_MESSAGE;
683
+ } else {
684
+ return LocalTransactionState.ROLLBACK_MESSAGE;
685
+ }
686
+ }
687
+ }
688
+ ```
689
+
690
+ ---
691
+
692
+ ### 3.3 消费者幂等性设计
693
+
694
+ **消息去重表**
695
+
696
+ ```java
697
+ @Service
698
+ public class BizEventConsumer {
699
+
700
+ /**
701
+ * 消费业务事件
702
+ */
703
+ @RocketMQMessageListener(topic = "BIZ_COMPLETED", consumerGroup = "biz-service")
704
+ public void onMessage(String messageBody) {
705
+ BizEvent event = JSON.parseObject(messageBody, BizEvent.class);
706
+ String messageId = event.getMessageId();
707
+
708
+ // 1. 检查消息是否已处理(幂等性检查)
709
+ if (messageDeduplicateRepository.exists(messageId)) {
710
+ log.info("消息已处理,跳过:{}", messageId);
711
+ return;
712
+ }
713
+
714
+ try {
715
+ // 2. 处理业务逻辑
716
+ bizService.process(event);
717
+
718
+ // 3. 记录消息已处理
719
+ MessageDeduplication dedup = new MessageDeduplication();
720
+ dedup.setMessageId(messageId);
721
+ dedup.setProcessTime(LocalDateTime.now());
722
+ messageDeduplicateRepository.save(dedup);
723
+
724
+ } catch (Exception e) {
725
+ // 处理失败,抛出异常,消息会重新投递
726
+ throw new RuntimeException("处理消息失败", e);
727
+ }
728
+ }
729
+ }
730
+
731
+ @Table(name = "message_deduplication")
732
+ public class MessageDeduplication {
733
+ @Id
734
+ private String messageId; // 消息唯一 ID
735
+ private LocalDateTime processTime; // 处理时间
736
+ }
737
+ ```
738
+
739
+ ---
740
+
741
+ ### 3.4 使用建议
742
+
743
+ **推荐场景**:
744
+ ```
745
+ ✅ 订单创建后通知多个下游系统
746
+ - 系统 A:创建订单 → 发送消息
747
+ - 系统 B:消费消息 → 更新账户
748
+ - 系统 C:消费消息 → 更新库存
749
+ - 系统 D:消费消息 → 发送通知
750
+
751
+ ✅ 事件驱动架构
752
+ - 解耦系统间依赖
753
+ - 异步处理,提高性能
754
+ ```
755
+
756
+ **监控指标**:
757
+ - 消息发送成功率
758
+ - 消息消费成功率
759
+ - 消息堆积量
760
+ - 消费延迟
761
+ - 重复消费次数
762
+
763
+ ---
764
+
765
+ ## 接口幂等性设计(必须)
766
+
767
+ > **核心原则**:无论调用多少次,结果都一样,不会产生副作用
768
+
769
+ ### 为什么需要幂等性?
770
+
771
+ 在分布式系统中,由于网络不可靠、重试机制、消息队列重复投递等原因,同一个请求可能会被执行多次。如果接口不支持幂等性,可能导致:
772
+
773
+ - ❌ 重复扣款
774
+ - ❌ 重复创建订单
775
+ - ❌ 数据不一致
776
+
777
+ ### 幂等性实现方案
778
+
779
+ ---
780
+
781
+ ### 4.1 唯一索引(数据库层)
782
+
783
+ **适用场景**:创建订单、创建记录等插入操作
784
+
785
+ ```java
786
+ @Table(name = "orders")
787
+ public class Order {
788
+ @Id
789
+ private Long id;
790
+
791
+ // 业务幂等键(唯一索引)
792
+ @Column(unique = true)
793
+ private String bizUniqueKey; // 如:userId + bizType + requestId
794
+
795
+ private String userId;
796
+ private String bizType;
797
+ private BigDecimal amount;
798
+ }
799
+
800
+ @Service
801
+ public class OrderService {
802
+
803
+ public Order createOrder(OrderRequest request) {
804
+ // 生成幂等键
805
+ String bizUniqueKey = generateBizUniqueKey(request);
806
+
807
+ try {
808
+ Order order = new Order();
809
+ order.setBizUniqueKey(bizUniqueKey);
810
+ order.setUserId(request.getUserId());
811
+ orderRepository.save(order);
812
+ return order;
813
+
814
+ } catch (DuplicateKeyException e) {
815
+ // 违反唯一索引,说明订单已存在(幂等返回)
816
+ return orderRepository.findByBizUniqueKey(bizUniqueKey);
817
+ }
818
+ }
819
+
820
+ private String generateBizUniqueKey(OrderRequest request) {
821
+ // userId + bizType + requestId
822
+ return request.getUserId() + "_" +
823
+ request.getBizType() + "_" +
824
+ request.getRequestId();
825
+ }
826
+ }
827
+ ```
828
+
829
+ ---
830
+
831
+ ### 4.2 分布式锁(Redis)
832
+
833
+ **适用场景**:防止并发重复操作
834
+
835
+ ```java
836
+ @Service
837
+ public class OrderService {
838
+
839
+ @Autowired
840
+ private RedisLockService lockService;
841
+
842
+ public Order createOrder(OrderRequest request) {
843
+ String lockKey = "order:create:" + request.getRequestId();
844
+
845
+ // 尝试获取分布式锁
846
+ if (!lockService.tryLock(lockKey, 30, TimeUnit.SECONDS)) {
847
+ throw new BizException("请勿重复提交");
848
+ }
849
+
850
+ try {
851
+ // 检查订单是否已存在
852
+ Order existingOrder = orderRepository.findByRequestId(request.getRequestId());
853
+ if (existingOrder != null) {
854
+ return existingOrder; // 幂等返回
855
+ }
856
+
857
+ // 创建订单
858
+ Order order = new Order();
859
+ order.setRequestId(request.getRequestId());
860
+ orderRepository.save(order);
861
+ return order;
862
+
863
+ } finally {
864
+ lockService.unlock(lockKey);
865
+ }
866
+ }
867
+ }
868
+ ```
869
+
870
+ ---
871
+
872
+ ### 4.3 Token 机制
873
+
874
+ **适用场景**:前端提交表单,防止重复提交
875
+
876
+ ```java
877
+ @RestController
878
+ public class OrderController {
879
+
880
+ /**
881
+ * 获取提交 Token
882
+ */
883
+ @GetMapping("/order/token")
884
+ public String getSubmitToken() {
885
+ String token = UUID.randomUUID().toString();
886
+ // 存储到 Redis,有效期 5 分钟
887
+ redisTemplate.opsForValue().set("submit:token:" + token, "1", 5, TimeUnit.MINUTES);
888
+ return token;
889
+ }
890
+
891
+ /**
892
+ * 提交订单
893
+ */
894
+ @PostMapping("/order/create")
895
+ public Order createOrder(@RequestBody OrderRequest request,
896
+ @RequestHeader("Submit-Token") String token) {
897
+ // 验证 Token
898
+ String redisKey = "submit:token:" + token;
899
+ if (!redisTemplate.delete(redisKey)) {
900
+ throw new BizException("Token 无效或已使用");
901
+ }
902
+
903
+ // 创建订单
904
+ return orderService.createOrder(request);
905
+ }
906
+ }
907
+ ```
908
+
909
+ ---
910
+
911
+ ### 4.4 状态机(业务层)
912
+
913
+ **适用场景**:状态流转操作
914
+
915
+ ```java
916
+ @Service
917
+ public class OrderService {
918
+
919
+ /**
920
+ * 支付订单(幂等)
921
+ */
922
+ public void payOrder(String orderId) {
923
+ Order order = orderRepository.findById(orderId);
924
+
925
+ // 状态机校验
926
+ if (order.getStatus().equals("PAID")) {
927
+ // 已支付,幂等返回
928
+ log.info("订单已支付,跳过:{}", orderId);
929
+ return;
930
+ }
931
+
932
+ if (!order.getStatus().equals("PENDING")) {
933
+ throw new BizException("订单状态不允许支付:" + order.getStatus());
934
+ }
935
+
936
+ // 执行支付
937
+ paymentService.pay(orderId);
938
+
939
+ // 更新状态
940
+ order.setStatus("PAID");
941
+ orderRepository.save(order);
942
+ }
943
+ }
944
+ ```
945
+
946
+ ---
947
+
948
+ ### 4.5 幂等性方案对比
949
+
950
+ | 方案 | 优点 | 缺点 | 适用场景 |
951
+ |------|------|------|---------|
952
+ | **唯一索引** | 简单、可靠、性能好 | 需要设计幂等键 | 创建订单、创建记录 |
953
+ | **分布式锁** | 防止并发 | 依赖 Redis、性能略差 | 高并发防重 |
954
+ | **Token 机制** | 防止前端重复提交 | 需要额外接口获取 Token | 表单提交 |
955
+ | **状态机** | 业务语义清晰 | 需要设计状态流转 | 状态变更操作 |
956
+
957
+ ---
958
+
959
+ ## 方案选择决策树
960
+
961
+ ```mermaid
962
+ graph TD
963
+ A[需要跨域数据一致性] --> B{是否涉及核心操作?}
964
+ B -->|是 | C[分布式事务<br/>2PC/SAGA]
965
+ B -->|否 | D{实时性要求?}
966
+ D -->|实时 | E[SAGA 模式]
967
+ D -->|可延迟 | F{是否需要解耦?}
968
+ F -->|是 | G[消息队列<br/>可靠事件驱动]
969
+ F -->|否 | H[中间态 + 重试<br/>定时任务]
970
+
971
+ C --> I[接口必须幂等]
972
+ E --> I
973
+ G --> I
974
+ H --> I
975
+
976
+ style C fill:#ffe1e1
977
+ style E fill:#fff4e1
978
+ style G fill:#e1f5ff
979
+ style H fill:#e1ffe8
980
+ style I fill:#ffe1f5
981
+ ```
982
+
983
+ ---
984
+
985
+ ## 最佳实践
986
+
987
+ ### 1. 接口设计规范
988
+
989
+ 所有跨域接口必须满足:
990
+
991
+ ```java
992
+ /**
993
+ * 标准跨域接口签名
994
+ */
995
+ public interface CrossDomainService {
996
+
997
+ /**
998
+ * @param requestId 幂等键(必须)
999
+ * @param bizContext 业务上下文
1000
+ * @return 处理结果
1001
+ */
1002
+ Result execute(String requestId, BizContext bizContext);
1003
+ }
1004
+ ```
1005
+
1006
+ ### 2. 监控告警
1007
+
1008
+ | 监控项 | 告警阈值 | 处理措施 |
1009
+ |--------|---------|---------|
1010
+ | 重试次数超限 | 单个任务重试 > 5 次 | 人工介入 |
1011
+ | 一致性延迟 | 达成一致时间 > 5 分钟 | 告警通知 |
1012
+ | 补偿失败 | 补偿操作失败 | 紧急告警 |
1013
+ | 消息堆积 | 堆积量 > 10000 | 扩容消费者 |
1014
+
1015
+ ### 3. 降级方案
1016
+
1017
+ ```java
1018
+ @Service
1019
+ public class SyncService {
1020
+
1021
+ @HystrixCommand(fallbackMethod = "syncFallback")
1022
+ public void sync(String bizId) {
1023
+ // 正常同步逻辑
1024
+ downstreamService.sync(bizId);
1025
+ }
1026
+
1027
+ /**
1028
+ * 降级方案:记录到本地表,稍后重试
1029
+ */
1030
+ public void syncFallback(String bizId) {
1031
+ log.warn("同步失败,降级处理:{}", bizId);
1032
+
1033
+ // 记录到本地表
1034
+ SyncTask task = new SyncTask();
1035
+ task.setBizId(bizId);
1036
+ task.setStatus("PENDING");
1037
+ taskRepository.save(task);
1038
+ }
1039
+ }
1040
+ ```
1041
+
1042
+ ### 4. 数据核对
1043
+
1044
+ **定时核对任务**
1045
+
1046
+ ```java
1047
+ @Component
1048
+ public class DataReconciliationJob {
1049
+
1050
+ /**
1051
+ * 每天凌晨核对数据一致性
1052
+ */
1053
+ @Scheduled(cron = "0 0 2 * * ?")
1054
+ public void reconcile() {
1055
+ // 1. 查询系统 A 的记录
1056
+ List<Record> recordsA = repositoryA.findByDate(LocalDate.now().minusDays(1));
1057
+
1058
+ // 2. 查询系统 B 的流水
1059
+ List<Transaction> transactionsB = repositoryB.findByDate(...);
1060
+
1061
+ // 3. 核对数据
1062
+ for (Record record : recordsA) {
1063
+ Transaction transaction = findMatchingTransaction(record, transactionsB);
1064
+ if (transaction == null) {
1065
+ // 数据不一致,告警
1066
+ alertService.send("数据不一致", record);
1067
+ }
1068
+ }
1069
+ }
1070
+ }
1071
+ ```
1072
+
1073
+ ---
1074
+
1075
+ ## 参考资料
1076
+
1077
+ - [分布式事务:SAGA 模式](https://microservices.io/patterns/data/saga.html)
1078
+ - [事务消息](https://rocketmq.apache.org/docs/transactionExample/)
1079
+ - [幂等性设计模式](https://www.enterpriseintegrationpatterns.com/patterns/messaging/IdempotentReceiver.html)
1080
+ - [最终一致性理论](https://www.allthingsdistributed.com/2008/12/eventually_consistent.html)
1081
+
1082
+ ---
1083
+
1084
+ **维护者**: AutoSpec 团队
1085
+ **关联文档**: `knowledge/standards/coding-style.md`, `knowledge/standards/code-review.md`