
1) 【一句话结论】
在分布式环境下,全局唯一ID可通过雪花算法(以1970-01-01 UTC为时间戳基准,结合机器ID和序列号生成)实现;分布式事务一致性可通过两阶段提交(2PC,强一致性但协调者故障风险高)或Saga模式(补偿事务保证最终一致性,需幂等补偿)保证,需结合业务场景选择方案。
2) 【原理/概念讲解】
全局唯一ID(雪花算法):Twitter提出的分布式ID生成算法,核心是将ID拆解为三部分拼接:
分布式事务一致性:解决跨服务的事务问题,常见方案:
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 雪花算法 | 分布式全局唯一ID生成算法 | 时间有序、机器区分、序列号 | 需全局唯一ID的分布式系统(如订单ID、日志ID) | 时钟回拨可能导致ID重复 |
| 两阶段提交(2PC) | 分布式事务协调者-参与者模型 | 强一致性(协调者故障导致阻塞) | 需强一致性、事务量不大(如金融转账) | 协调者故障导致参与者阻塞,补偿复杂 |
| Saga模式 | 长事务拆分为短事务+补偿 | 最终一致性(允许短暂不一致) | 业务可拆分、允许补偿(如电商订单) | 补偿链路复杂,需保证补偿可靠性 |
4) 【示例】
def generate_id():
timestamp = int(time.time() * 1000) # 毫秒级时间戳
if timestamp < _last_timestamp:
# 时钟回拨,等待到正确时间(阈值1秒)
timestamp = _wait_until_correct_time(_last_timestamp)
if timestamp == _last_timestamp:
sequence = (_sequence + 1) & 0xFFF # 序列号(12位)
if sequence == 0:
timestamp = _wait_next_millis(_last_timestamp)
else:
_sequence = 0
_last_timestamp = timestamp
machine_id = _get_machine_id() # 服务注册中心分配的唯一ID
return (timestamp - 1609459200000) << 22 | machine_id << 10 | sequence # 1970-01-01 UTC的毫秒数
5) 【面试口播版答案】
“面试官您好,关于全局唯一ID,我们通常用雪花算法,它通过时间戳(从1970年1月1日UTC开始,毫秒级,支持约69年不重复)、机器ID(区分不同服务器,比如通过Nacos分配,避免重复)、序列号(同一毫秒内生成4096个ID)拼接,确保全局唯一。对于分布式事务,常用两阶段提交(2PC,强一致性但协调者故障会导致业务阻塞)或Saga模式(将长事务拆分为短事务加补偿,比如订单创建和库存扣减,若库存扣减失败就补偿撤销订单)。具体来说,雪花算法先检查时钟是否回拨(设置1秒阈值,回拨就等待),再生成序列号;Saga模式通过补偿操作的幂等性(比如检查订单ID是否已补偿)保证最终一致。”
6) 【追问清单】
7) 【常见坑/雷区】