项目上了SkyWalking后,睡觉真香!

文摘   2024-11-11 12:23   山西  

这段时间可以说睡得踏实,咋回事儿呢?就因为项目上了 SkyWalking,终于把我从分布式的“噩梦”里拯救出来了!


作为程序员,大家应该懂得,分布式系统一旦崩了,就是一道看不见的“十万行代码墙”。


哪边出了问题?谁的锅?真的是绞尽脑汁也难追溯。


自从有了 SkyWalking,这个分布式追踪系统,我真的是一觉睡到天亮,感觉生活都变香了。

分布式让人头秃

早年还是单体架构的时候,追踪问题相对简单。
一个应用,所有的模块、服务、数据源统统打包在一个代码仓库里。出问题了,直接去日志里找,多数时候还真能找到。
顶多是个SQL问题、资源死锁,再复杂点就是线程没处理好。那时候的代码,就像是一本书一页一页翻找,虽然不快,但至少清晰。
后来架构从单体进化到微服务,一堆服务之间相互调用,一个小请求分分钟跑遍各个服务,再也不能“翻页”找问题了。
请求像打水漂似的到处蹦,一下数据库服务、一下支付网关、再绕到用户服务去,日志就更别提了,各种碎片化、分布式,调试都快抓瞎了。就是在这种情况下,分布式追踪系统才显得尤为重要。

SkyWalking 和 OpenTracing 

我们先简单过一过原理,分布式追踪系统要做的核心任务就是“记录调用链”。每个请求进来,要跟踪它访问了哪些服务、经历了哪些方法调用,最终耗时多久、是否出错。正是这种分布式调用链,才帮我们找出哪个服务在瓶颈上。

OpenTracing 标准

想要实现这种跨服务的调用追踪,一套通用标准是少不了的,这里就用到了 OpenTracing。OpenTracing 是一种分布式追踪标准,主要定义了追踪的基本要素,包括 traceIdspanIdparentId 等。
简单点说,traceId 代表一个完整的请求链,span 则是一个链上的单个操作节点。通过这些元素的组合,我们能清晰地知道一个请求从哪里来、经过了哪些服务,最终去了哪儿。

SkyWalking 的原理与架构

了解了 OpenTracing 的基础后,再来说说 SkyWalking
SkyWalking 是基于 OpenTracing 的一套完整分布式追踪系统解决方案。它可以自动采集每个请求生成的 span 数据,通过把分布式调用信息汇总成完整的调用链,还原请求在分布式架构中的路径。

最神奇的地方在于——它不用我们手动干预,直接从代码层面抓取需要的数据!

自动采集 Span 数据的秘密

SkyWalking 是怎么做到自动采集 span 数据的呢?其实说穿了也不复杂,它用的是 Agent 插桩技术。Agent 插桩就是在代码执行时动态“打桩”,去记录我们关心的请求信息。
SkyWalking 的 Agent 可以在每个微服务节点上生成 span,并将其汇报给中央服务,完成对调用链的追踪。
public class ExampleService {
    public void process() {
        Tracer tracer = GlobalTracer.get();
        Span span = tracer.buildSpan("process").start();
        try {
            // 执行某些操作
        } finally {
            span.finish();
        }
    }
}
上面就是一个典型的 span 生成例子,但实际用 SkyWalking 我们根本不用写这些代码,Agent 自动帮我们做完,是不是省事多了?😎

如何跨进程传递 Context?traceId 是如何保证唯一的?

分布式系统的难点之一就是跨进程 Context 传递,SkyWalking 为此设计了自己的 Context 传递机制,确保同一个请求链上的 traceId 唯一。SkyWalking 在请求发出时会生成 traceId,每个 span 都会附带这个 traceId,并在跨进程调用时,通过 HTTP Header 等方式自动传递给下游服务。
例如,当请求从 A 服务传到 B 服务时,SkyWalking Agent 会在请求的 Header 里附加 traceId 和其他 context 信息。B 服务接收到请求后,从 Header 中提取出 traceId,并生成一个新的 span 关联到这个 traceId 上。这种方式保证了traceId 的唯一性,同时让整个调用链的信息都可以串联起来。

请求量大,数据量会不会爆炸?

有人会问,追踪系统会不会有性能影响?要是每次请求都采集、都存储,那岂不是把服务压垮?这是 SkyWalking 的精妙之处,它在设计之初就考虑了性能优化
  • 采样率控制:SkyWalking 支持设置采样率。对于流量特别大的情况,可以选择性采集一部分数据,减少数据采集量
  • 异步上传:Agent 采集到 span 后,不会马上同步发送,而是通过异步方式将数据批量汇报到后端服务,减少对业务代码的干扰。
  • 高效存储:SkyWalking 使用了 ElasticSearch 这样的高效存储服务,并有专门的压缩算法来降低存储的空间需求。所以即便请求量很大,也不至于撑爆存储。
所以,SkyWalking 的设计非常适合高并发环境下的分布式系统。🤓

我们公司是怎么用 SkyWalking 的

在我们公司,SkyWalking 已经被集成到整个分布式系统中,每一个微服务都有它的 Agent。这让我们在排查问题时简直方便了不止一点。以前如果遇到性能瓶颈、请求超时,光找出具体的卡点就可能需要几个小时,现在通过 SkyWalking 几分钟就能搞定

实际架构

我们的应用架构主要包含了用户服务、支付服务、订单服务等几十个微服务模块。每个服务都部署有 SkyWalking Agent,将追踪信息上报到 SkyWalking OAP(Observability Analysis Platform)。在 OAP 中,这些追踪数据会被解析并存储,最终在前端 Web UI 中展示为可视化的调用链。我们可以轻松看到某个请求调用了哪些服务、每个服务的响应时间、报错情况等。

针对 SkyWalking 的改造

不过,我们也并不是完全原封不动地用 SkyWalking。针对公司业务的特殊需求,我们做了几处改造:
  1. 自定义标签:为了更好地标记每个请求的来源和性质,我们在每个 span 上添加了一些自定义标签,如请求来源 IP、用户 ID、订单编号等。这样当问题发生时,我们能迅速锁定是哪个用户、哪个订单出了问题。
  2. 报警系统:我们把 SkyWalking 和公司的报警系统打通了。一旦追踪系统检测到调用链上有异常(例如某个服务超时或返回错误),就会立刻触发报警通知相关团队,做到快速响应。
  3. 数据清理机制:为了节省存储空间,我们还制定了数据清理规则,把超过一定时间的数据自动归档或删除,既节省了存储,又保证了重要数据的留存。
SkyWalking 真的是个“香”东西,特别适合像我们这种庞大的分布式系统。过去我们在排查问题上耗费了大量时间和精力,现在有了它,能看到整个系统的调用链、服务健康状态、瓶颈服务,甚至还能收到实时报警。
用了 SkyWalking 后,分布式系统的透明度提升了,排查问题的时间缩短了,睡觉都香了!

-END-

ok,今天先说到这,老规矩,看完文章记得右下角给何老师点赞,

最后送给大家一个福利,我这里有一份搞副业的教程,这份教程里有100+个搞钱小项目:

网盘拉新核心玩法、公众号运营变现、小红书虚拟资料引流等,现在扫码加我微信,即可领取这份副业教程。

添加时备注:副业

程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章