如何将Angular应用的健康状态上报至Akamai实现集群自动切换
Akamai CDN 联动 Angular 应用健康状态自动切换集群最优方案
核心思路
直接复用Akamai原生的源站健康检测与故障转移能力,避免额外开发复杂的上报逻辑,稳定性和可靠性更高,整体实现分3个核心步骤:
1. 部署独立的健康检查端点
不要将健康检查逻辑耦合在Angular业务代码中,避免前端资源加载失败时健康检测本身无法正常工作:
- 在托管Angular应用的源站服务(如Nginx、Node.js服务、对象存储的自定义规则)中新增
/health专用接口 - 接口逻辑按需覆盖核心健康判定条件:Angular静态资源可正常访问、依赖的后端核心接口可用、集群资源负载正常等
- 健康时返回
200 OK状态码,异常时返回503 Service Unavailable状态码
注意:需要在CDN规则中配置
/health路径不缓存,且允许Akamai健康检查的专用UA访问,避免被WAF或缓存规则拦截
2. 配置Akamai源站健康检测与自动切换规则
在Akamai Control Center中对源站组进行如下配置:
- 健康检查路径填写上一步部署的
/health接口 - 检查频率建议生产环境设置为10秒/次,可根据业务容忍的故障切换延迟调整
- 健康阈值配置为连续3次返回200判定为源站正常
- 异常阈值配置为连续2次返回非200状态码判定为源站故障
- 故障动作配置为自动将流量切换到备用集群的源站组
- 可选优化:健康检查使用HEAD方法减少不必要的带宽消耗,如有内容校验需求可改为GET方法
3. 可选增强:客户端侧异常补充上报
如果需要覆盖源站健康检查未识别到的边缘侧异常(比如部分区域用户访问异常、前端代码运行报错等),可以在Angular中新增全局拦截器补充上报状态:
import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http'; import { Observable, catchError, throwError } from 'rxjs'; @Injectable() export class HealthReportInterceptor implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(req).pipe( catchError((error: HttpErrorResponse) => { // 仅上报4xx/5xx异常状态 if (error.status >= 400) { // 使用sendBeacon保证页面卸载时上报请求也能正常发出 navigator.sendBeacon( '/.well-known/akamai-health-report', JSON.stringify({ status: error.status, requestPath: req.url, timestamp: Date.now() }) ); } return throwError(() => error); }) ); } }
之后在Akamai中配置对应的数据收集规则,将客户端上报的异常数据纳入健康判定的补充维度,即可进一步提升异常检测的灵敏度。
内容的提问来源于stack exchange,提问作者jemadd04
相关产品推荐
相关产品推荐

