You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nest JS微服务TCP连接保活方案咨询(AWS ECS部署场景)

解决方案:NestJS TCP微服务连接保活与Copilot健康检查配置

一、TCP连接保活方案

1. NestJS 原生开启TCP Keep-Alive

TCP微服务端和HTTP服务器侧的TCP客户端,都可以在初始化时直接配置Keep-Alive参数,主动发送探测包维持连接:

微服务端配置:

import { NestFactory } from '@nestjs/core';
import { Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, {
    transport: Transport.TCP,
    options: {
      host: '0.0.0.0',
      port: 3000,
      keepAlive: true,
      keepAliveInitialDelay: 30000, // 30秒后启动保活探测
    },
  });
  await app.listen();
}
bootstrap();

HTTP服务器侧的TCP客户端配置:

// 在HTTP服务的模块提供者中配置客户端
import { ClientProxyFactory, Transport } from '@nestjs/microservices';

{
  provide: 'MICROSERVICE_CLIENT',
  useFactory: () => {
    return ClientProxyFactory.create({
      transport: Transport.TCP,
      options: {
        host: 'your-microservice-nlb-endpoint',
        port: 3000,
        keepAlive: true,
        keepAliveInitialDelay: 30000,
      },
    });
  },
}

两端都开启后,会定期发送TCP保活包,避免NLB因空闲超时断开连接。

2. 调整AWS NLB的空闲超时设置

NLB默认TCP空闲超时是350秒,你可以直接在AWS端调大这个值(最大支持28小时):

  • 控制台操作:EC2 -> 负载均衡器 -> 选中目标NLB -> 监听 -> 编辑监听 -> 修改「空闲超时」
  • CLI命令:
aws elbv2 modify-target-group-attributes --target-group-arn <你的目标组ARN> --attributes Key=idle_timeout.value,Value=1800

注意:目标组的超时值不能超过NLB监听的超时值。

3. 自定义心跳机制

如果原生Keep-Alive不够灵活,可以在服务间加自定义心跳:

  • 在TCP微服务里加一个heartbeat接口,返回简单响应
  • HTTP服务器每隔一段时间(比如5分钟)调用这个接口,强制维持连接活跃

二、Copilot多健康检查路径的替代方案

Copilot暂不支持直接配置多个健康检查路径,以下两种方式可以替代:

1. 统一健康检查端点

在HTTP服务器里写一个/health聚合端点,内部检查所有需要验证的组件状态,返回统一的健康结果:

@Get('/health')
async healthCheck() {
  // 检查数据库连接状态
  const dbStatus = await this.dbService.ping();
  // 检查其他依赖服务状态
  const cacheStatus = await this.cacheService.check();
  
  if (dbStatus && cacheStatus) {
    return { status: 'ok' };
  }
  throw new HttpException('Service Unavailable', 503);
}

然后在Copilot清单里只配置这个/health路径作为健康检查端点即可。

2. 自定义健康检查脚本

在ECS任务里用Shell脚本实现多路径检查,脚本返回0表示健康,非0表示不健康,然后在Copilot清单里配置这个脚本:

# copilot/http-server/manifest.yml
healthcheck:
  command: ["sh", "-c", "curl -f http://localhost:3000/health && curl -f http://localhost:3000/health/db"]
  interval: 30s
  timeout: 5s
  retries: 3
  start_period: 60s

脚本会依次检查多个路径,只有全部成功才会被判定为健康。

内容的提问来源于stack exchange,提问作者Mickael Zana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:16:20