服务管控

服务管控

服务负载

随机策略

各个服务器处理能力不同,处理性能弱的会被打趴。可以加上权重:

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

服务线上生命周期管理

  • 蓝绿发布:新旧两套服务共存,流量统一切换到新版本,旧服务不下线,出现异常,快速切回到旧版本。
  • 灰度发布:分批发布
  • 金丝雀发布:先让内部员工使用