高并发系统实战课
徐长龙
前微博架构师、极客时间架构师
11663 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语&结课测试 (2讲)
高并发系统实战课
15
15
1.0x
00:00/00:00
登录|注册

15|实践方案:如何用C++自实现链路跟踪?

通过TraceID从RocksDB查询所有相关日志
通过Trace SDK在接口返回中包含TraceID
利用Kafka的分组消费和内存汇总计算实现服务器状态统计
通过HTTP和Memcache协议提供查询接口服务
通过TraceID从RocksDB查询相关日志
利用RocksDB的写性能和Merge操作实现高性能追加日志
使用RocksDB作为存储引擎
落地到本地磁盘,通过Filebeat实时抓取推送
使用memcache长链接协议推送日志
AOP切面拦截实现日志采集
收集哪些日志
存储服务中选择哪种方式实现更适合
解决Kafka消费乱序和重复问题的方法
对比学习不同技术实现的关键点
写多读少系统的关键方案
利用Kafka的分组消费和内存汇总计算实现服务器状态统计
通过TraceID从RocksDB查询相关日志
利用RocksDB的写性能和Merge操作实现高性能追加日志
使用RocksDB作为存储引擎
动态扩容消费服务器的能力
使用Kafka的Consumer Group分组消费
通过memcache和Filebeat实现日志传输
通过AOP切面拦截实现日志采集
在接口被请求时记录访问日志和业务日志
故障线索收集
实时性能统计展示
日志查询
日志存储
日志传输
日志采集
需要一个分布式链路跟踪系统来辅助排查线上故障
微博内部系统的依赖和排查问题的困难
思考题
总结
分布式查询与计算
写多读少的RocksDB
可动态扩容的分组消费
抓取、采集与传输
链路跟踪系统的关键功能
案例背景
实践方案:如何用C++自实现链路跟踪?

该思维导图由 AI 生成,仅供参考

你好,我是徐长龙。
在前面几节课,我们讲解了 MySQL 和多个分布式检索系统的关键原理,明白了它们如何实现分布式数据存储和检索。写多读少系统的主要优化思路相信你已经心中有数了,主要包括:用分布式队列汇总日志、利用内存缓存新写入的数据、顺序写入磁盘、多服务器分片、分布式查询可拆分索引。
不过你可能觉得这些离我们的业务逻辑还有点远,这节课我就分享一下,之前我是怎样用 C++ 来实现链路跟踪系统的。
通过分析这个系统实现的主要思路和关键细节,你不但能学到业务场景里的实用技巧,更重要的是,把技术理解和业务实现联系在一起,更深入地理解写多读少的系统。

案例背景

2016 年我在微博任职,那时微博有很多重要但复杂的内部系统,由于相互依赖较为严重,并且不能登陆公用集群,每次排查问题的时候都很痛苦。
很多问题需要不断加日志试探,三天左右才能摸出眉目。为了更高效地排查线上故障,我们需要一些工具辅助提高排查问题效率,于是我和几个伙伴合作实现了一个分布式链路跟踪的系统。
由于那时候,我只有两台 4 核 8G 内存服务器,可用硬件资源不多,所以分布式链路跟踪的存储和计算的功能是通过 C++ 11 实现的。这个项目最大的挑战就是如何在有限的资源下,记录下所有请求过程,并能够实时统计监控线上故障,辅助排查问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了作者在微博工作期间面对C++自实现链路跟踪系统的技术挑战时的应对方案。文章首先介绍了分布式链路跟踪系统的背景和重要性,随后详细讨论了系统的关键功能和实现思路。作者分享了在有限硬件资源下如何记录所有请求过程并实时统计监控线上故障的挑战,并提出了日志采集、传输、存储、查询以及实时性能统计展示等关键功能。具体实现方面,文章介绍了日志采集的实现方式,包括AOP切面拦截和传输方式的选择。此外,文章还详细讨论了Kafka在日志传输中的作用,以及如何通过Consumer Group分组消费实现动态扩容。另外,作者还分享了对RocksDB的选择和其在日志存储中的应用,以及分布式查询与计算的实现方式。最后,文章提出了对于硬件资源充裕时仍需考虑成本的观点,以及对开源选择的建议。整体而言,本文通过实际案例深入探讨了C++自实现链路跟踪系统的关键技术和挑战,对于需要实现类似系统的技术人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • John
    第一题,针对消息乱序可以使用分区的partition key将需要保证顺序的消息放到同一个分区。针对消息重复,可以在业务侧做好幂等,如幂等token,或者数据库的唯一索引或通过业务判断等 第二题,我认为存储服务是一个写多读少的服务,需要将连接的读写放到从reactor,主reactor读写接受连接,这样能充分发挥多核优势,也能快速接收新链接

    作者回复: 你好,John,优秀~

    2022-11-28归属地:北京
    1
  • Six Days
    有没有大佬能够分享下类似的java开源项目学习下呢?

    作者回复: 你好, java版本 https://github.com/weiboad/fiery

    2023-10-25归属地:广东
  • 柳十三
    单Reactor多线程更合适

    作者回复: hi,这个模式适合读多的情况,这样多个线程之间需要无锁才能发挥性能

    2023-08-22归属地:浙江
  • Hale
    C++ 实现链路跟踪 项目有开源?

    作者回复: 你好,Hale,由于那时很多细节和微博内部系统有依赖,并且一些通用功能做的不成熟,开源后也没有精力持续维护,所以这里目前没有做开源。

    2023-05-23归属地:广东
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部