这是由于AWS的Application Load Balancer在每次健康检查完成后都将停止处理连接,而WebSocket是保持持久接口的。因此,需要在AWS CDK中设置连接保持。在CDK构造函数中,加入以下代码:
const fargateService = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'MyFargateService', { ... targetGroupProps: { protocol: elbv2.ApplicationProtocol.HTTP, targetGroupName: 'MyWebsocketsTargetGroup', deregistrationDelay: cdk.Duration.seconds(60), // Delay before target is removed from the Target Group healthCheck: { interval: cdk.Duration.seconds(60), // Interval at which to perform checks timeout: cdk.Duration.seconds(5), // Target response timeout path: '/health', // Endpoint to check port: '9000', // What port to listen on protocol: elbv2.Protocol.HTTP, // Protocol to be used for health-checks unhealthyThresholdCount: 5, // How many failures are tolerated before draining a target healthyThresholdCount: 3, // How many successes are required before a target is considered healthy enabled: true, // Is health-checking enabled? }, stickinessCookieDuration: cdk.Duration.days(1), // Duration of the application cookie },
...
externalProtocol: elbv2.ApplicationProtocol.HTTPS, // Protocol to use for the load balancer domainName: 'mydomain.com', // Domain name for the load balancer domainZone: hostedZone, certificate: cert, // Certificate for HTTPS protocol });
在上述代码中,我们指定了连接保持持续的时间,避免了每次健康检查之后WebSocket停止的问题。