9.4 分布式系统理论
面试重要程度:⭐⭐⭐⭐⭐
常见提问方式: "CAP定理是什么?如何理解一致性Hash算法?"
技术深度: 分布式理论基础、算法原理、实际应用
预计阅读时间:35分钟
🎯 CAP定理
CAP定理基础
CAP定理指出,在分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)三者不可能同时满足,最多只能满足其中两个。
三要素详解:
/**
* CAP定理演示
*/
public class CAPTheoremDemo {
/**
* 一致性(Consistency)
* 所有节点在同一时间看到相同的数据
*/
public void consistencyExample() {
/*
* 强一致性示例:
* 用户在节点A更新了个人信息
* 立即从节点B查询,必须能看到最新信息
*
* 实现方式:
* - 同步复制
* - 分布式锁
* - 两阶段提交
*/
}
/**
* 可用性(Availability)
* 系统在任何时候都能响应用户请求
*/
public void availabilityExample() {
/*
* 高可用性示例:
* 即使部分节点故障,系统仍能正常服务
*
* 实现方式:
* - 冗余备份
* - 故障转移
* - 负载均衡
*/
}
/**
* 分区容错性(Partition Tolerance)
* 系统能够容忍网络分区故障
*/
public void partitionToleranceExample() {
/*
* 分区容错示例:
* 网络故障导致节点间无法通信
* 系统仍能继续运行
*
* 实现方式:
* - 数据复制
* - 分布式一致性算法
* - 故障检测机制
*/
}
}
CAP权衡策略
/**
* 不同系统的CAP选择
*/
@Component
public class CAPTradeoffs {
/**
* CP系统:选择一致性和分区容错性
* 牺牲可用性,在网络分区时停止服务
*/
public void cpSystemExample() {
/*
* 典型代表:
* - MongoDB(强一致性模式)
* - HBase
* - Redis Cluster
*
* 适用场景:
* - 金融交易系统
* - 库存管理系统
* - 账户余额系统
*/
}
/**
* AP系统:选择可用性和分区容错性
* 牺牲一致性,允许数据暂时不一致
*/
public void apSystemExample() {
/*
* 典型代表:
* - Cassandra
* - DynamoDB
* - CouchDB
*
* 适用场景:
* - 社交媒体
* - 内容分发
* - 日志收集
*/
}
}
/**
* 实际项目中的CAP权衡
*/
@Service
public class PracticalCAPImplementation {
@Autowired
private DistributedLock distributedLock;
/**
* CP模式实现:订单创建
*/
@Transactional
public Order createOrderCP(CreateOrderRequest request) {
String lockKey = "order:create:" + request.getUserId();
if (!distributedLock.tryLock(lockKey, 30000)) {
throw new ServiceUnavailableException("系统繁忙,请稍后重试");
}
try {
// 强一致性检查
if (!checkInventoryConsistency(request.getProductId(), request.getQuantity())) {
throw new InsufficientStockException("库存不足");
}
Order order = new Order(request);
return orderRepository.save(order);
} finally {
distributedLock.unlock(lockKey);
}
}
/**
* AP模式实现:用户信息更新
*/
public void updateUserInfoAP(Long userId, UserInfo userInfo) {
try {
// 异步更新所有副本
CompletableFuture.allOf(
updateUserInfoAsync("primary", userId, userInfo),
updateUserInfoAsync("replica1", userId, userInfo),
updateUserInfoAsync("replica2", userId, userInfo)
);
} catch (Exception e) {
log.warn("部分用户信息更新失败,将通过后台任务同步", e);
recordFailedUpdate(userId, userInfo);
}
}
}
🔄 BASE理论
BASE理论概述
BASE理论是对CAP定理的延伸:
- BA(Basically Available):基本可用
- S(Soft State):软状态
- E(Eventually Consistent):最终一致性
/**
* BASE理论实现
*/
@Component
public class BASEImplementation {
/**
* 基本可用(Basically Available)
*/
@Service
public class BasicAvailabilityService {
public UserInfo getUserInfo(Long userId) {
// 尝试从主节点获取
try {
return primaryNode.getUserInfo(userId);
} catch (Exception e) {
log.warn("Primary node unavailable, trying backup nodes");
}
// 主节点不可用,尝试备份节点
for (DataNode backupNode : backupNodes) {
try {
UserInfo userInfo = backupNode.getUserInfo(userId);
if (userInfo != null) {
userInfo.setDataSource("backup");
return userInfo;
}
} catch (Exception e) {
log.warn("Backup node {} unavailable", backupNode.getName());
}
}
// 返回缓存数据
return cacheService.getCachedUserInfo(userId);
}
}
/**
* 最终一致性(Eventually Consistent)
*/
@Service
public class EventualConsistencyService {
@Transactional
public void updateUserBalance(Long userId, BigDecimal amount) {
// 1. 更新主数据
User user = userRepository.findById(userId);
user.setBalance(user.getBalance().add(amount));
userRepository.save(user);
// 2. 发布变更事件
BalanceChangeEvent event = new BalanceChangeEvent();
event.setUserId(userId);
event.setAmount(amount);
event.setNewBalance(user.getBalance());
messageProducer.send("user.balance.changed", event);
}
@EventListener
@Async
public void handleBalanceChanged(BalanceChangeEvent event) {
// 异步更新各个副本
dataNodes.parallelStream().forEach(node -> {
try {
node.updateUserBalance(event.getUserId(), event.getNewBalance());
} catch (Exception e) {
log.error("Failed to sync balance to node: {}", node.getName(), e);
recordSyncFailure(node.getName(), event);
}
});
}
// 定时一致性检查
@Scheduled(fixedRate = 300000)
public void checkConsistency(
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经
查看7道真题和解析