(1)业务编排层(事务协调器)
// 混合事务协调器
public class HybridTransactionManager {
private TccTransactionManager tccManager;
private SagaTransactionManager sagaManager;
public void executeHybridTransaction(HybridTransaction tx) {
// 1. 执行TCC阶段
tccManager.executeTry(tx.getTccOperations());
// 2. 执行Saga阶段
sagaManager.execute(tx.getSagaOperations());
// 3. 确认TCC阶段(如果Saga成功)
if (sagaManager.isCompleted(tx.getId())) {
tccManager.executeConfirm(tx.getTccOperations());
} else {
// Saga失败则补偿TCC
tccManager.executeCancel(tx.getTccOperations());
}
}
}
(2)TCC服务设计
// TCC服务接口
public interface TccService {
void tryOperation(TccOperation op); // 预留资源
void confirmOperation(TccOperation op); // 确认操作
void cancelOperation(TccOperation op); // 取消操作
}
// 典型实现(资金冻结)
public class PaymentTccService implements TccService {
@Override
public void tryOperation(TccOperation op) {
// 冻结资金
accountService.freezeFunds(op.getUserId(), op.getAmount());
}
@Override
public void confirmOperation(TccOperation op) {
// 确认支付
accountService.confirmPayment(op.getUserId(), op.getAmount());
}
@Override
public void cancelOperation(TccOperation op) {
// 解冻资金
accountService.unfreezeFunds(op.getUserId(), op.getAmount());
}
}
(3)Saga服务设计
// Saga步骤定义
public class SagaStep {
private String serviceName;
private String operation;
private CompensationAction compensation; // 补偿操作
// 执行正向操作
public void execute() {
// 调用对应服务执行操作
}
// 执行补偿操作
public void compensate() {
compensation.execute();
}
}
// Saga事务管理器
public class SagaTransactionManager {
public void execute(List<SagaStep> steps) {
// 按顺序执行各步骤
for (SagaStep step : steps) {
try {
step.execute();
} catch (Exception e) {
// 执行补偿(逆向)
compensate(steps, step);
throw e;
}
}
}
private void compensate(List<SagaStep> steps, SagaStep failedStep) {
// 逆向执行补偿(从失败点开始)
for (int i = steps.indexOf(failedStep); i >= 0; i--) {
steps.get(i).compensate();
}
}
}
事务边界划分:
补偿机制协调:
状态管理:
错误处理策略:
监控集成:
框架选择:
数据库设计:
通信机制:
部署架构:
电商下单:
供应链管理:
金融系统:
这种混合架构能在保证核心业务强一致性的同时,提高非核心业务的处理效率,是微服务架构中处理复杂事务场景的有效方案。
核心原则:严格超时控制,防止资源永久锁定
(1)Try阶段超时处理
// TCC超时监控器
public class TccTimeoutMonitor {
private long tryTimeout = 30000; // 30秒超时
public void monitorTryOperation(String transactionId) {
long startTime = System.currentTimeMillis();
while (true) {
// 检查Try阶段是否完成
if (tccStatusService.isTryCompleted(transactionId)) {
return; // 正常完成
}
long elapsed = System.currentTimeMillis() - startTime;
if (elapsed > tryTimeout) {
// 触发强制取消
tccManager.forceCancel(transactionId);
break;
}
Thread.sleep(1000); // 每秒检查一次
}
}
}
(2)Confirm/Cancel阶段超时处理
// 确认阶段超时处理
public void handleConfirmTimeout(String transactionId) {
// 1. 记录超时日志
log.warn("TCC Confirm超时: {}", transactionId);
// 2. 尝试强制确认(可能部分成功)
try {
tccManager.forceConfirm(transactionId);
} catch (Exception e) {
// 3. 记录失败并触发人工干预
alertService.raiseCriticalAlert("强制确认失败", transactionId);
}
}
// 取消阶段超时处理
public void handleCancelTimeout(String transactionId) {
// 1. 记录超时日志
log.warn("TCC Cancel超时: {}", transactionId);
// 2. 尝试强制取消(释放资源)
try {
tccManager.forceCancel(transactionId);
} catch (Exception e) {
// 3. 记录失败并触发人工干预
alertService.raiseCriticalAlert("强制取消失败", transactionId);
}
}
(3)超时配置建议
阶段 | 推荐超时时间 | 说明 |
---|---|---|
Try阶段 | 30秒 | 防止长时间占用预留资源 |
Confirm阶段 | 60秒 | 允许稍长处理时间 |
Cancel阶段 | 60秒 | 必须确保资源最终释放 |
核心原则:灵活重试+最终一致性
(1)步骤级超时处理
// Saga步骤执行器
public class SagaStepExecutor {
private long stepTimeout = 10000; // 10秒超时
public void executeWithTimeout(SagaStep step) {
Future<?> future = executorService.submit(() -> {
step.execute();
});
try {
future.get(stepTimeout, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
// 超时处理
future.cancel(true); // 中断执行
log.warn("Saga步骤超时: {}", step.getServiceName());
throw new SagaTimeoutException(step);
}
}
}
(2)事务级超时处理
// Saga事务管理器
public class SagaTransactionManager {
private long transactionTimeout = 300000; // 5分钟超时
public void executeWithTimeout(List<SagaStep> steps) {
long startTime = System.currentTimeMillis();
try {
for (SagaStep step : steps) {
executeWithTimeout(step);
// 检查整体超时
if (System.currentTimeMillis() - startTime > transactionTimeout) {
throw new SagaGlobalTimeoutException();
}
}
} catch (SagaTimeoutException e) {
// 触发补偿
compensate(steps, e.getFailedStep());
}
}
}
(3)超时补偿策略
// 超时后的补偿逻辑
private void compensate(List<SagaStep> steps, SagaStep failedStep) {
// 1. 记录超时补偿日志
log.error("Saga超时补偿: {}", failedStep.getServiceName());
// 2. 逆向执行补偿(从失败点开始)
for (int i = steps.indexOf(failedStep); i >= 0; i--) {
try {
steps.get(i).compensate();
} catch (Exception e) {
// 补偿失败记录
log.error("补偿失败: {}", steps.get(i).getServiceName());
}
}
// 3. 标记事务状态为"超时补偿"
transactionStatusService.markAsCompensated(steps.get(0).getTransactionId());
}
(1)TCC与Saga超时联动
(2)关键处理规则
优先级原则:
状态同步:
告警分级:
(1)监控指标
指标类型 | TCC监控点 | Saga监控点 |
---|---|---|
超时次数 | Try/Confirm/Cancel超时次数 | 步骤/Saga事务超时次数 |
当前超时事务数 | 各阶段超时事务数 | 各步骤超时事务数 |
平均超时时间 | 各阶段平均超时时间 | 各步骤平均超时时间 |
(2)告警策略
# 告警配置示例
alerts:
tcc:
try_timeout:
threshold: 5 # 5次/分钟
severity: P0
confirm_timeout:
threshold: 3
severity: P0
saga:
step_timeout:
threshold: 10
severity: P1
transaction_timeout:
threshold: 2
severity: P1
TCC超时:
Saga超时:
混合架构:
通过以上设计,可以在混合架构中有效处理TCC和Saga的事务超时问题,既保证核心业务的强一致性,又维持非核心业务的高可用性。
维度 | TCC模式 | Saga模式 |
---|---|---|
回滚触发点 | Confirm阶段失败或超时 | 任一步骤执行失败 |
回滚粒度 | 整体事务回滚 | 步骤级回滚(可部分补偿) |
回滚保证 | 必须完全回滚(强一致性) | 最终一致(允许延迟补偿) |
回滚复杂度 | 较高(需协调多个服务) | 较低(各服务独立补偿) |
(1)回滚触发条件
// TCC回滚触发器
public class TccRollbackTrigger {
public void checkRollbackConditions(String transactionId) {
// 1. Confirm阶段失败
if (tccStatusService.isConfirmFailed(transactionId)) {
triggerFullRollback(transactionId);
}
// 2. Try阶段超时(已强制取消)
else if (tccTimeoutMonitor.isTryTimedOut(transactionId)) {
// 已通过forceCancel处理,无需重复回滚
}
}
}
(2)完整回滚流程
(3)关键设计要点
// 服务端Cancel操作必须幂等
public void cancelOperation(String transactionId) {
if (cancelLogService.isAlreadyCancelled(transactionId)) {
return; // 已取消过则直接返回
}
// 执行实际取消逻辑
// ...
cancelLogService.recordCancellation(transactionId);
}
(1)步骤级回滚机制
// Saga步骤执行器
public class SagaStepExecutor {
public void executeWithCompensation(SagaStep step) {
try {
step.execute();
} catch (Exception e) {
// 立即触发补偿(逆向操作)
step.compensate();
// 可选:记录失败步骤供人工处理
failureTracker.recordFailedStep(step);
// 抛出异常终止后续步骤
throw new SagaStepFailedException(step);
}
}
}
(2)事务级回滚流程
(3)关键设计要点
// 事务状态机
public enum SagaState {
CREATED, IN_PROGRESS, COMPENSATING, FAILED, COMPLETED
}
// 状态变更时触发补偿
public void transitionToCompensating(String transactionId) {
// 1. 记录状态变更
// 2. 获取当前执行到的步骤
// 3. 从该步骤开始逆向补偿
}
(1)TCC与Saga回滚联动
(2)差异处理策略
场景 | TCC处理方式 | Saga处理方式 |
---|---|---|
单个服务失败 | 触发整体Cancel | 仅补偿失败步骤 |
部分步骤失败 | 不适用(必须全部成功) | 可配置部分补偿 |
超时导致失败 | 强制Cancel | 补偿已执行步骤 |
人工干预需求 | 记录超时状态供人工处理 | 标记失败步骤供人工补偿 |
(1)TCC监控重点
# TCC监控配置
tcc:
monitoring:
focus:
- confirm_failure_rate # Confirm失败率
- cancel_timeout_count # Cancel超时次数
alert:
- condition: confirm_failure_rate > 0.1
severity: P0
(2)Saga监控重点
# Saga监控配置
saga:
monitoring:
focus:
- step_failure_count # 步骤失败次数
- compensation_latency # 补偿延迟
alert:
- condition: step_failure_count > 5
severity: P1
TCC回滚:
Saga回滚:
混合架构:
通过这种差异化的设计,可以在混合架构中既保证核心业务的强一致性(TCC),又保持非核心业务的高可用性(Saga),同时确保各种失败场景都能得到妥善处理。
当Saga事务执行过程中出现以下情况时需要触发TCC补偿:
(1)Saga端处理
// Saga事务管理器中的失败处理逻辑
public void handleSagaFailure(String transactionId) {
// 1. 记录Saga失败状态
sagaStatusService.markAsFailed(transactionId);
// 2. 获取关联的TCC事务ID(通过事务上下文关联)
String tccTransactionId = transactionContextService.getTccTransactionId(transactionId);
if (tccTransactionId != null) {
// 3. 触发TCC补偿
transactionOrchestrator.triggerTccCancel(tccTransactionId);
}
// 4. 记录失败详情供人工处理
failureTracker.recordSagaFailure(transactionId);
}
(2)事务编排器协调
// 事务编排器中的TCC补偿触发器
public class TransactionOrchestrator {
private TccManager tccManager;
public void triggerTccCancel(String tccTransactionId) {
try {
// 1. 记录补偿触发日志
log.info("触发TCC补偿: {}", tccTransactionId);
// 2. 执行TCC Cancel阶段
tccManager.executeCancel(tccTransactionId);
// 3. 更新事务状态为"已补偿"
transactionStatusService.markAsCompensated(tccTransactionId);
} catch (Exception e) {
// 4. 处理TCC补偿失败
handleTccCompensateFailure(tccTransactionId, e);
}
}
private void handleTccCompensateFailure(String tccTransactionId, Exception e) {
// 记录TCC补偿失败日志
log.error("TCC补偿失败: {}", tccTransactionId, e);
// 可选:触发人工干预流程
alertService.raiseCriticalAlert("TCC补偿失败", tccTransactionId);
}
}
(3)TCC端处理
// TCC管理器中的Cancel执行
public class TccManager {
public void executeCancel(String transactionId) {
// 1. 获取所有参与TCC的服务
List<TccService> services = tccServiceRegistry.getServices(transactionId);
// 2. 按依赖顺序执行Cancel(可能需要反向顺序)
for (TccService service : services) {
try {
service.cancelOperation(transactionId);
} catch (Exception e) {
// 记录单个服务Cancel失败
log.error("服务 {} Cancel失败", service.getName(), e);
// 可选择继续执行其他服务的Cancel
}
}
}
}
(1)事务关联机制
(2)补偿触发策略
触发场景 | 处理方式 |
---|---|
Saga步骤执行失败 | 立即触发TCC Cancel |
Saga补偿操作失败 | 记录失败后触发TCC Cancel |
Saga事务超时 | 强制终止Saga并触发TCC Cancel |
TCC Cancel自身失败 | 记录失败并标记为"需人工处理" |
(3)错误处理流程
(1)监控指标
monitoring:
saga_t