服务管控
服务负载
随机策略
各个服务器处理能力不同,处理性能弱的会被打趴。可以加上权重:
collection = {A: 5, B:2, C:2, D:1}
(1) 策略1
{A,A,A,A,A,B,B,C,C,D}
random.nextInt(10)
缺点就是这个 collection 集合可能会比较大,内存占用大
(2) 策略2
权重换算成长度,先算出总长度,然后再计算出一个偏移量
totalWeight = sum(collection)
offset = random.nextInt(totalWeight)
缺点就是选取的时候,需要遍历集合,复杂度 O(n)
轮询策略
如果各个节点权重一致:
[total_request_count + 1] % node_count
如果权重不同,
collection = {A: 5, B:2, C:2, D:1}
那么,最高的权重是 5:
[total_request_count + 1] % maxWeight = currentWeight
那么 [currentWeight, maxWeight]
就是可用的权重范围。
一致性 Hash 策略
节点数少,节点变动,大量键发生波动,造成数据倾斜,因此可以引入虚拟节点,每个节点通过引入编号计算多个 Hash 值,模拟多个虚拟节点。
限流
漏桶算法
算法类似于餐厅排号就餐,整个餐厅所能容纳的顾客数量是有限的,有出才能有进。
Semaphore sem = new Semaphore(30);
if (sem.getQueueLength() > 0) {
return; // 有排队,直接拒绝服务
}
try {
sem.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
sem.release();
}
令牌桶算法
系统以恒定速度往桶里面放令牌,请求需要从桶里获取令牌才能处理。
集群容错
服务降级
- 静态返回值降级
- 备用服务降级
- 熔断降级,防止服务雪崩
服务授权
OAuth2
服务线上生命周期管理
- 蓝绿发布:新旧两套服务共存,流量统一切换到新版本,旧服务不下线,出现异常,快速切回到旧版本。
- 灰度发布:分批发布
- 金丝雀发布:先让内部员工使用