高并发系统设计40问
唐扬
美图公司技术专家
立即订阅
9308 人已学习
课程目录
已更新 42 讲 / 共 45 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习高并发系统设计?
免费
基础篇 (6讲)
01 | 高并发系统:它的通用设计方法是什么?
02 | 架构分层:我们为什么一定要这么做?
免费
03 | 系统设计目标(一):如何提升系统性能?
04 | 系统设计目标(二):系统怎样做到高可用?
05 | 系统设计目标(三):如何让系统易于扩展?
06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
演进篇 · 数据库篇 (5讲)
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
10 | 发号器:如何保证分库分表后ID的全局唯一性?
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
演进篇 · 缓存篇 (6讲)
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
14 | 缓存的使用姿势(二):缓存如何做到高可用?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
16 | CDN:静态资源如何加速?
加餐 | 数据的迁移应该如何做?
演进篇 · 消息队列篇 (6讲)
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
18 | 消息投递:如何保证消息仅仅被消费一次?
19 | 消息队列:如何降低消息队列系统中消息的延迟?
20 | 面试现场第二期:当问到项目经历时,面试官究竟想要了解什么?
用户故事 | 从“心”出发,我还有无数个可能
期中测试 | 10道高并发系统设计题目自测
演进篇 · 分布式服务篇 (9讲)
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
22 | 微服务架构:微服务化后系统架构要如何改造?
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
24 | 注册中心:分布式系统如何寻址?
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
26 | 负载均衡:怎样提升系统的横向扩展能力?
27 | API网关:系统的门面要如何做呢?
28 | 多机房部署:跨地域的分布式系统如何做?
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
演进篇 · 维护篇 (7讲)
30 | 给系统加上眼睛:服务端监控要怎么做?
31 | 应用性能管理:用户的使用体验应该如何监控?
32 | 压力测试:怎样设计全链路压力测试平台?
33 | 配置管理:成千上万的配置项要如何管理?
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
35 | 流量控制:高并发系统中我们如何操纵流量?
36 | 面试现场第三期:你要如何准备一场技术面试呢?
实战篇 (2讲)
37 | 计数系统设计(一):面对海量数据的计数器要如何做?
38 | 计数系统设计(二):50万QPS下如何设计未读数系统?
高并发系统设计40问
登录|注册

25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?

唐扬 2019-11-20
你好,我是唐扬。
经过前面几节课的学习,你的垂直电商系统在引入 RPC 框架和注册中心之后已经完成基本的服务化拆分了,系统架构也有了改变:
现在,你的系统运行平稳,老板很高兴,你也安心了很多。而且你认为,在经过了服务化拆分之后,服务的可扩展性增强了很多,可以通过横向扩展服务节点的方式进行平滑地扩容了,对于应对峰值流量也更有信心了。
但是这时出现了问题:你通过监控发现,系统的核心下单接口在晚高峰的时候,会有少量的慢请求,用户也投诉在 APP 上下单时,等待的时间比较长。而下单的过程可能会调用多个 RPC 服务或者使用多个资源,一时之间,你很难快速判断究竟是哪个服务或者资源出了问题,从而导致整体流程变慢。于是你和你的团队开始想办法如何排查这个问题。

一体化架构中的慢请求排查如何做

因为在分布式环境下,请求要在多个服务之间调用,所以对于慢请求问题的排查会更困难,我们不妨从简单的入手,先看看在一体化架构中是如何排查这个慢请求的问题的。
最简单的思路是:打印下单操作的每一个步骤的耗时情况,然后通过比较这些耗时的数据,找到延迟最高的一步,然后再来看看这个步骤要如何的优化。如果有必要的话,你还需要针对步骤中的子步骤,再增加日志来继续排查,简单的代码就像下面这样:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《高并发系统设计40问》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(15)

  • longslee
    打开。感谢老师又给我复习来一遍。 调用链追踪是我们项目比较重要的部分,我们才用的是pinpoint,原生是入HBase,我们改造了一份通过队列入ES。 使用感受 pinpoint 对服务的性能负担很小,网络压力也小(udp)。
    调用链追踪体现的始终是在服务之间,我们团队又前移了一步,通过JavaScript对XHR对象拦截,产生一个requestID,附在header上,网关透传,改造了下 pinpoint,使接下来的调用都传递这个 requestID,最后存下来的日志有 traceID 和 requestID 组合,那么监控 nginx 日志的时候,就能知道是哪个前端请求发起的问题,甚至知道是哪个按钮触发的,哪个JavaScript方法触发的,是不是很先进哈哈😂

    作者回复: 很赞~

    2019-11-24
    1
    8
  • 吃饭饭
    这不就是链路追踪

    作者回复: 是的

    2019-11-20
    2
  • 健少
    我们的日志通过啊里日志系统收集,左日志系统通过丰富的查询方式查询出某一traceID各服务的调用情况。
    2019-11-20
    1
  • 阿土
    对于老旧系统如何引入分布式Trace跟踪呢?不改代码的前提下

    作者回复: 这要分布式Trace组件来解决,比如java可以通过java agent的方式来在启动之前植入trace的代码

    2019-11-27
    1
  • fdconan
    想请教下,如果A服务并发调用B服务和C服务,spanId如何生成呢?
    2019-11-26
  • 刘冲
    golang有没有办法不侵入代码,做链路追踪

    作者回复: 可以试试jaeger

    2019-11-25
  • 枫紫深蓝
    发送到请求体中有什么特定作用吗?请求体本身已经带走当前调用的数据了,将requestId放在请求头中会不会更好?

    作者回复: 其实都好,我们习惯放在请求体里面

    2019-11-25
  • 张德
    老师 请教一下 把日志写入elasticSearch 然后供运维和开发使用的过程 这个是不是就是所谓的ELK???

    作者回复: ELK是elasticsearch,logstash和kibana的简称

    2019-11-24
    1
  • 小小
    老师,有些不明白为啥把request Id放到线程上下文,requestId本身就是私有变量线程安全吧

    作者回复: 是的,可以在线程上下文中传递

    2019-11-23
  • 彭越
    用skywalking做链路追踪怎么样?通过agent追踪系统性能,进行APM监控
    2019-11-21
    1
  • Julien
    C++有什么好的切面编程工具吗?

    作者回复: 这个我还不太清楚

    2019-11-21
    1
  • 小喵喵
    我们以前的系统都是自己写日志到文本文件,或者把日志同步写到mongdb,这样是不是很low?,反正排查问题也比较难。

    作者回复: 写文件的话排查起来不那么方便

    2019-11-20
  • Binggle
    老师,所有的日志都采集到一起,最终的数据量会不会非常大?一般放在什么样的系统中?

    作者回复: 一般写在nosql数据库里面,比如hbase

    2019-11-20
  • 杨朔
    如果日志不打印在本地.发送到消息队列..如果消息队列挂了怎么办?

    作者回复: 挂了就没有监控了,不会影响业务

    2019-11-20
    3
  • 膜法师
    我们用erlang 做的dubbo 调用链耗时采样。貌似也是官方文档支持的。不侵入业务代码靠字节码增强
    2019-11-20
收起评论
15
返回
顶部