NestJS微服务熔断策略

润信云 技术支持

一、引言

在微服务架构中,服务之间的调用错综复杂。当某个下游服务出现故障、响应缓慢或负载过高时,可能会导致上游服务的资源耗尽,引发级联故障。熔断策略作为一种有效的容错机制,能够在服务出现异常时快速响应,防止故障扩散,保障系统的稳定性和可用性。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' };
    }
  }
}

四、熔断策略的应用场景与注意事项

(一)应用场景

  1. 高并发场景:在高并发情况下,服务故障可能导致大量请求积压,熔断策略可以快速隔离故障服务,保护其他服务的正常运行。
  2. 依赖不稳定的服务:当依赖的外部服务不稳定,如第三方 API 时,熔断可以防止因外部服务问题影响自身系统。

(二)注意事项

  1. 阈值设置:合理设置失败阈值、恢复超时时间和成功阈值,需要根据服务的实际情况和业务需求进行调整。
  2. 监控与日志:对熔断器的状态和服务调用情况进行监控和日志记录,以便及时发现问题和进行故障排查。

通过在 NestJS 微服务中应用熔断策略,可以有效提高系统的容错能力和稳定性,降低故障带来的影响,保障系统在复杂环境下的可靠运行。

本文链接:https://blog.runxinyun.com/post/984.html 转载需授权!

分享到:
版权声明
网站名称: 润信云资讯网
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!邮件:7104314@qq.com
网站部分内容来源于网络,版权争议与本站无关。请在下载后的24小时内从您的设备中彻底删除上述内容。
如无特别声明本文即为原创文章仅代表个人观点,版权归《润信云资讯网》所有,欢迎转载,转载请保留原文链接。
0 27

留言0

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。