面试题答案
一键面试轮询负载均衡策略
- 设计思路:维护一个服务实例列表,每次请求时按顺序依次选择一个实例,当到达列表末尾时,重新回到列表开头。
- 关键代码片段:
class RoundRobinLoadBalancer(private val serviceInstances: List<String>) {
private var currentIndex = 0
fun getNextInstance(): String {
val instance = serviceInstances[currentIndex]
currentIndex = (currentIndex + 1) % serviceInstances.size
return instance
}
}
随机负载均衡策略
- 设计思路:从服务实例列表中随机选择一个实例。
- 关键代码片段:
import kotlin.random.Random
class RandomLoadBalancer(private val serviceInstances: List<String>) {
fun getNextInstance(): String {
val randomIndex = Random.nextInt(0, serviceInstances.size)
return serviceInstances[randomIndex]
}
}
根据服务负载动态调整负载均衡策略
- 设计思路:
- 引入一个监控机制,定期获取每个服务实例的负载情况(例如 CPU 使用率、内存使用率、请求队列长度等)。
- 基于负载情况,动态决定使用哪种负载均衡策略。例如,当所有服务实例负载都较低时,使用随机策略;当部分实例负载较高时,更多地偏向负载较低的实例,可以结合加权轮询等策略。
- 关键代码片段:
data class ServiceLoad(val instance: String, val load: Double)
class DynamicLoadBalancer(private val serviceInstances: List<String>) {
private val loadMonitor = LoadMonitor()
fun getNextInstance(): String {
val serviceLoads = loadMonitor.getServiceLoads(serviceInstances)
val totalLoad = serviceLoads.sumOf { it.load }
if (totalLoad < THRESHOLD_LOW_LOAD) {
// 低负载,使用随机策略
return RandomLoadBalancer(serviceInstances).getNextInstance()
} else {
// 高负载,使用加权轮询策略
val totalWeight = serviceLoads.sumOf { 1.0 / it.load }
var cumulativeWeight = 0.0
val randomWeight = Math.random() * totalWeight
for (serviceLoad in serviceLoads) {
cumulativeWeight += 1.0 / serviceLoad.load
if (cumulativeWeight >= randomWeight) {
return serviceLoad.instance
}
}
return serviceLoads.first().instance
}
}
}
class LoadMonitor {
fun getServiceLoads(serviceInstances: List<String>): List<ServiceLoad> {
// 模拟获取负载,实际需调用监控接口
return serviceInstances.map { ServiceLoad(it, Math.random()) }
}
}
这里定义了一个DynamicLoadBalancer
,根据服务负载动态选择负载均衡策略。LoadMonitor
类模拟获取服务实例负载的操作,实际应用中需要与真实的监控系统集成。