一、可扩展性概述
可扩展性是系统应对增长负载的能力,在微服务架构中尤为重要。
二、水平扩展策略
水平扩展通过增加服务实例数量来提高系统容量。
# Kubernetes HPA 配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: product-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: product-service
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
三、垂直扩展策略
垂直扩展通过增加单个实例的资源来提高性能。
四、缓存层设计
使用缓存减少数据库压力。
public async Task<Product> GetProductCached(int id)
{
var cacheKey = $"product_{id}";
var cached = await _cache.GetAsync<Product>(cacheKey);
if (cached != null)
{
_logger.LogInformation("Cache hit for product {Id}", id);
return cached;
}
var product = await _dbContext.Products.FindAsync(id);
if (product != null)
{
await _cache.SetAsync(cacheKey, product,
new DistributedCacheEntryOptions {
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
});
}
return product;
}
五、数据库分片
使用分片技术水平扩展数据库。
// 基于哈希的分片策略
public int GetShardId(int userId)
{
// 根据用户ID哈希分配到不同分片
return Math.Abs(userId.GetHashCode()) % _numberOfShards;
}
public async Task<User> GetUser(int userId)
{
var shardId = GetShardId(userId);
var connection = GetConnectionForShard(shardId);
return await connection.QuerySingleAsync(
"SELECT * FROM Users WHERE Id = @UserId",
new { UserId = userId });
}
六、读写分离
将读操作和写操作分离到不同的数据库实例。
七、异步处理
使用消息队列异步处理非关键路径请求。
public async Task<IActionResult> PlaceOrder(Order order)
{
// 同步处理关键路径
await _orderRepository.CreateAsync(order);
// 异步处理非关键路径
await _eventBus.PublishAsync(new OrderPlacedEvent(order.Id));
return Accepted();
}
八、负载均衡策略
合理分配流量到多个服务实例。
九、熔断与降级
保护系统在高负载下的稳定性。
十、可扩展性测试
使用性能测试验证系统的可扩展性。