齐宣王使人吹竽,必三百人。南郭处士请为王吹竽,宣王说之,廪食以数百人。 宣王死,湣王立,好一一听之,处士逃。
《韩非子·内储说上》
某日,突然收到报警,某发现实时异常监控趋势图上,静态资源 404 异常有明显的上升。 分析详细的异常信息发现是某个发布操作引起某几个系统引起的。
找到对应的开发,分析结论是部分配置文件未生效,导致拼接资源文件地址错误。 按照业务量计算,这个异常量大约是其中一、两台机器有问题。
可能发布系统或其他问题,重新发布一次仍没能修复这个异常。
我们需要快速定位到这只滥竽,尽快将问题修复。 但是实际上却没有这么简单,我们最终花费 了 7个多小时,最终是因为这个系统正好有 其他发布才顺便解决。

上图有两个造成异常的发布,分别是『CMS 发布』和『后台系统发布』。
橙色是 JavaScript 实时异常,绿色是静态资源 404 异常。
事后我们坐下来讨论如何解决这个问题,避免在以后遇到类似问题时能快速有效的应对。

如上图,问题出在某个问题业务应用服务器节点配置文件未生效,拼接出来的 JavaScript 资源地址不正确导致 CDN 节点未命中而最终回源,源服务器也没有这个文件,最终发生 404 悲剧。
实际的业务系统中,会提供用户访问的节点信息,但是请求静态资源时无法获得这个信息, 是不是有办法在静态资源源服务器上获得来源页面所在的服务器节点信息呢?
从前端角度直接解决这个看似无望,换个思路。
curl -I -x internal-host:port url
『可行』,缺点:这个跟负载均衡规则有关,如果负载均衡服务器支持这个特性,或可一试。
跟相关同学沟通后,表示可以做。而且从外网直接访问,清楚业务的开发同学可以自行 排查。
『可行』。需要注意的问题:
综上所述,在成本、风险、自动化、扩展性等方面来讲,方案九是最优的。
图二所示,这次问题出在业务应用服务器集群的节点 1。
如果问题节点是静态资源 CDN 集群的节点 2 呢?
问题节点是节点 3?
Published on 2014-04-17