概述
一个常见的系统模式,是将系统拆分为两个平面:
- 数据面:负责执行请求的服务,通常规模比较大
- 控制面:负责管理和分发配置的服务,通常规模比较小
- 控制面放在负载均衡器的后面对外提供服务
- 数据面通过LB发送API请求
问题分析
规模不匹配问题
由于控制面规模较小,但是数据面规模较大,容易出现控制面过载情况,可能存在的问题:
- 数据面代码Bug,导致API调用频率增加
- 从中断恢复时,所有数据面服务器尝试同时调用控制面API
- 少量API调用失败,导致重试,增加控制面负载,等等
优化措施
平面隔离
在控制面和数据面之间增加一个配置隔离层,可以采用高可用的对象存储系统等。
控制面配置发布时,控制面发布信息至配置系统,数据面定期轮询配置系统,并缓存
数据面状态更新时,数据面更新配置至配置系统,控制面定期轮询配置系统,并缓存
- 优点:控制面故障,不影响数据面运行
- 缺点:动态配置更新,时效性不足
小推送
配置时效性要求较高的场景下,通过规模较小的控制面推送数据到规模较大的数据面
优点:
- 配置实时更新;
- 由规模较小的控制面控制请求的流速,避免系统过载
缺点:
- 控制面需要维护规模较大的数据面清单
- 数据面规模越大节点出现问题概率越大,控制面需要维护请求失败后的重试等保护措施
- 控制面需要负责,让各控制节点合理的负责一定范围的数据节点,确保各司其事,并保证所有数据面节点都能够被管理,可以通过一致性哈希等算法
大建联小推送
为了解决“小推送”场景下过于复杂的问题,可以通过将建连方向与控制流方向解耦
- 数据面通过LB和控制面完成长连接建立
- 控制面通过已建立的连接发送配置信息
缺点:需要保持长连接,通信协议复杂
参考
- https://aws.amazon.com/cn/builders-library/avoiding-overload-in-distributed-systems-by-putting-the-smaller-service-in-control/?nc1=h_ls