15|实践方案:如何用C++自实现链路跟踪?
徐长龙
该思维导图由 AI 生成,仅供参考
你好,我是徐长龙。
在前面几节课,我们讲解了 MySQL 和多个分布式检索系统的关键原理,明白了它们如何实现分布式数据存储和检索。写多读少系统的主要优化思路相信你已经心中有数了,主要包括:用分布式队列汇总日志、利用内存缓存新写入的数据、顺序写入磁盘、多服务器分片、分布式查询可拆分索引。
不过你可能觉得这些离我们的业务逻辑还有点远,这节课我就分享一下,之前我是怎样用 C++ 来实现链路跟踪系统的。
通过分析这个系统实现的主要思路和关键细节,你不但能学到业务场景里的实用技巧,更重要的是,把技术理解和业务实现联系在一起,更深入地理解写多读少的系统。
案例背景
2016 年我在微博任职,那时微博有很多重要但复杂的内部系统,由于相互依赖较为严重,并且不能登陆公用集群,每次排查问题的时候都很痛苦。
很多问题需要不断加日志试探,三天左右才能摸出眉目。为了更高效地排查线上故障,我们需要一些工具辅助提高排查问题效率,于是我和几个伙伴合作实现了一个分布式链路跟踪的系统。
由于那时候,我只有两台 4 核 8G 内存服务器,可用硬件资源不多,所以分布式链路跟踪的存储和计算的功能是通过 C++ 11 实现的。这个项目最大的挑战就是如何在有限的资源下,记录下所有请求过程,并能够实时统计监控线上故障,辅助排查问题。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了作者在微博工作期间面对C++自实现链路跟踪系统的技术挑战时的应对方案。文章首先介绍了分布式链路跟踪系统的背景和重要性,随后详细讨论了系统的关键功能和实现思路。作者分享了在有限硬件资源下如何记录所有请求过程并实时统计监控线上故障的挑战,并提出了日志采集、传输、存储、查询以及实时性能统计展示等关键功能。具体实现方面,文章介绍了日志采集的实现方式,包括AOP切面拦截和传输方式的选择。此外,文章还详细讨论了Kafka在日志传输中的作用,以及如何通过Consumer Group分组消费实现动态扩容。另外,作者还分享了对RocksDB的选择和其在日志存储中的应用,以及分布式查询与计算的实现方式。最后,文章提出了对于硬件资源充裕时仍需考虑成本的观点,以及对开源选择的建议。整体而言,本文通过实际案例深入探讨了C++自实现链路跟踪系统的关键技术和挑战,对于需要实现类似系统的技术人员具有一定的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统实战课》,新⼈⾸单¥59
《高并发系统实战课》,新⼈⾸单¥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归属地:浙江 - HaleC++ 实现链路跟踪 项目有开源?
作者回复: 你好,Hale,由于那时很多细节和微博内部系统有依赖,并且一些通用功能做的不成熟,开源后也没有精力持续维护,所以这里目前没有做开源。
2023-05-23归属地:广东
收起评论