服务注册与发现:服务怎么找到彼此
微服务拆开后,服务之间怎么找到彼此?配置文件写死 IP 追不上动态扩缩容。注册中心维护服务名到实例列表的映射,靠心跳检测存活。客户端发现 vs 服务端发现、CP vs AP 的取舍,以及选错了会怎样。
微服务拆开后,服务之间怎么找到彼此?配置文件写死 IP 追不上动态扩缩容。注册中心维护服务名到实例列表的映射,靠心跳检测存活。客户端发现 vs 服务端发现、CP vs AP 的取舍,以及选错了会怎样。
负载均衡不只是轮询分请求。节点能力不同要加权,实时负载不同要动态选,有状态要保亲和,缓存要一致性哈希,节点上下线要平滑过渡,健康检查要主动加被动,还得和熔断配合。多层配合比单层完美更靠谱。
级联故障的根因不是下游挂了,是上游在等待中耗尽资源。熔断在失败率升高时停止调用,降级在不可用时给兜底响应。两者配套才有意义——光熔断不降级是快死,光降级不熔断挡不住资源耗尽。
脑裂:集群分区后两个子集各自选出主节点,并行写入导致数据分叉。根因不是节点真挂了,而是看起来挂了——网络分区、心跳超时、VM暂停都会触发。防护靠 quorum + fencing token + 租约三层。Raft/Paxos 防选主脑裂,但 fencing 仍需存储层配合。
朴素重试(失败立刻重试)在大规模下会引发重试风暴和级联放大。正确策略四件套:指数退避(给下游恢复时间)+抖动(打破同步)+重试预算(限制总重试流量)+只重试瞬时故障且幂等的操作。再配熔断器兜底——重试失败到阈值就停止,别一直试一个挂掉的服务。重试不是"再试一次",是需要设计的工程。
幂等性(Idempotency)= 同一操作执行一次和多次产生相同结果。分布式环境下网络超时、消息重投、自动重试逼着操作必须幂等。实现靠"记住做过没有":request_id 去重表、唯一约束、状态机、乐观锁。幂等和并发安全是两件事——前者管重复不出错,后者管同时不出错。
设计分布式系统,最难的不是学概念,是拿到需求知道从哪下手。不是找最优解——最优解不存在。
多节点下,谁说了算?锁和选主都是排他性地让一个节点说了算,只是生命周期不同。
一个操作跨多个数据库、多个服务,没有谁替你兜底。分布式事务就是让多个独立操作原子完成。
数据分散在多个节点,消息不可靠,机器随时挂。现在需要这些节点就一个值达成一致——这就是共识。