一、引言
在微服务架构中,服务之间的调用错综复杂。当某个下游服务出现故障、响应缓慢或负载过高时,可能会导致上游服务的资源耗尽,引发级联故障。熔断策略作为一种有效的容错机制,能够在服务出现异常时快速响应,防止故障扩散,保障系统的稳定性和可用性。NestJS 作为一个强大的 Node.js 后端框架,提供了良好的扩展性来实现微服务熔断策略。
二、熔断策略原理
熔断机制类似于电路中的保险丝。当服务调用失败次数或延迟时间达到设定的阈值时,熔断器会从“关闭”状态切换到“打开”状态。在“打开”状态下,后续对该服务的调用将不再实际发起请求,而是立即返回一个预设的 fallback 响应,避免进一步消耗资源。经过一段时间的“半开”状态,熔断器会尝试发送少量请求来检测服务是否恢复正常,如果恢复则切换回“关闭”状态,否则继续保持“打开”状态。
三、NestJS 中熔断策略的实现
(一)依赖安装
首先,我们需要安装熔断器相关的库,例如 @hapi/boom
用于处理 HTTP 错误,以及 circuit - breaker
库来实现熔断逻辑。使用 npm 或 yarn 进行安装:
npm install @hapi/boom circuit - breaker
# 或
yarn add @hapi/boom circuit - breaker
(二)创建熔断器模块
在 NestJS 中创建一个熔断器模块,用于管理熔断器实例。以下是一个简单的示例:
import { Module } from '@nestjs/common';
import { CircuitBreaker } from 'circuit - breaker';
@Module({
providers: [
{
provide: 'MY_SERVICE_CIRCUIT_BREAKER',
useFactory: () => {
return new CircuitBreaker({
failureThreshold: 5, // 失败阈值,达到此次数熔断器打开
recoveryTimeout: 30000, // 恢复超时时间,熔断器打开后等待多久进入半开状态
successThreshold: 3, // 成功阈值,半开状态下连续成功多少次后关闭熔断器
name:'my - service - breaker'
});
}
}
],
exports: ['MY_SERVICE_CIRCUIT_BREAKER']
})
export class CircuitBreakerModule {}
(三)在服务中使用熔断器
假设我们有一个调用外部服务的微服务模块,在该模块中注入熔断器并使用它来包装服务调用:
import { Inject, Injectable } from '@nestjs/common';
import { CircuitBreaker } from 'circuit - breaker';
import { httpservice } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
@Injectable()
export class MyService {
constructor(
@Inject('MY_SERVICE_CIRCUIT_BREAKER') private readonly breaker: CircuitBreaker,
private readonly httpService: HttpService
) {}
async callExternalService() {
try {
const result = await this.breaker.fire(async () => {
const response = await firstValueFrom(this.httpService.get('https://example.com/api'));
return response.data;
});
return result;
} catch (error) {
// 熔断器打开时,这里会捕获到异常并返回 fallback 响应
return { message: 'Service is currently unavailable' };
}
}
}
四、熔断策略的应用场景与注意事项
(一)应用场景
- 高并发场景:在高并发情况下,服务故障可能导致大量请求积压,熔断策略可以快速隔离故障服务,保护其他服务的正常运行。
- 依赖不稳定的服务:当依赖的外部服务不稳定,如第三方 API 时,熔断可以防止因外部服务问题影响自身系统。
(二)注意事项
- 阈值设置:合理设置失败阈值、恢复超时时间和成功阈值,需要根据服务的实际情况和业务需求进行调整。
- 监控与日志:对熔断器的状态和服务调用情况进行监控和日志记录,以便及时发现问题和进行故障排查。
通过在 NestJS 微服务中应用熔断策略,可以有效提高系统的容错能力和稳定性,降低故障带来的影响,保障系统在复杂环境下的可靠运行。
本文链接:https://blog.runxinyun.com/post/984.html 转载需授权!
留言0