您的位置:首页 >聚焦 >

天天观点:这两年捉过的虫

2022-07-17 05:44:41    来源:程序员客栈

hello,大家好,我是小楼。

1. 《记一次spring注解@Value不生效的深度排查》

时间拨回到2020年4月6日,周末,天晴,准备将上周工作中遇到的一个问题解决并记录下来。


【资料图】

是一个Spring和Dubbo结合起来无法入属性的问题。

不过时间过去实在太久,现在让我准确地描述出来,有点困难,但我知道问题大概出在bean的初始化顺序上。

文章写完后,不知放哪里,于是匆匆注册了个公众号,取啥名呢?就叫「捉虫大师」吧。

当时匆忙地甚至忘了我还有个带留言功能的公众号,后来想想,将错就错吧,没有留言也挺好,省的招来骂声,影响写作心情。

那时没有排版,没有任何技巧,朴实无华。

这便是我写公众号的初衷:记录工作、学习中遇到的问题和解决过程,以及一些思考。

2. 《Sentinel在docker中获取CPU利用率的一个BUG》

接下来的几天疯狂输出,将之前工作中遇到的问题都一一回忆,记录下来。

在搭建公司的Sentinel(限流熔断系统)时发现,Sentinel的自适应限流会根据CPU负载信息进行限流,在Docker中获取的CPU利用率是宿主机的,显然这不合适。

当时我还去github上提了issue,得到的回复是升级JDK,大家懂得,JDK万年都是8,所以这条建议基本没啥用。

不过后来,有位大佬用代码解决了这个问题,我也把这段代码Merge到了公司的系统上去。

这篇文章后来有好多小伙伴加我微信和我交流,这让我发现,写这类问题排查问题其实是有价值的。

3. 《以为是青铜,没想到是王者的dubbo标签路由》

当时在公司用Dubbo标签路由搭建了一套泳道测试环境,刚开始怎么都调不通,于是去看代码,发现每次调用完了Dubbo都会把上下文清理掉,导致第二次调用丢失了标签。

于是又去github上问这算不算标签路由的BUG,得到回复否,但可以用filter的方式去把标签继续带下去,于是就通过这个思路解决问题。

有不少小伙伴来咨询这个问题,聊过不少,还有直接要代码的。

后来我发现大家有两种方式解决这个问题,一个是像我这样利用标签路由,另一个是自己再扩展一个路由。

4. 《当dubbo多注册中心碰上标签路由》

还是标签路由,当时在做一个迁移注册中心的事,注册中心迁移的中间态是多个注册中心并存,当时测试反馈,明明有Provider为什么调用不通。

查了半天,发现存在标签和多注册中心时,不仅调用会走标签路由,甚至找注册中心的逻辑也复用了RPC调用逻辑,也会走一遍标签路由,找不到合适的注册中心时,就直接报错。

显然这是Dubbo的BUG,但2.7之后就没这个问题了。

5. 《一次漫长的dubbo网关内存泄露排查经历》

在搞注册中心之前,还搞了一段时间的Dubbo网关。

这个问题非常的棘手,网关运行地好好的,突然就内存泄露了,不定时,可能几周,可能几个月。

当时真的是绞尽脑汁,能用的方法都用上了,也查不出个所以然。刚好当时看了「闪电侠」的《Netty堆外内存排查盛宴》文章,文中通过植入一段监听代码来发现问题。

这个启发了我,于是我也在网关中植入了监控代码,终于让我抓到了到底哪里泄露。

后来在网络上看,其实有一些人的博客记录了这个问题,但当时很难从网上准确找到,只有经历过,才知道问题是不是同一个。

6. 《skywalking内存泄露排查》

虽然标题是SkyWalking,其实是SkyWalking和Sentinel共同作用的结果,这个问题当时直接导致了线上故障。

事后复盘,主要原因是测试环境与线上环境不一致导致。

所以说,灰度上线很重要。

至于问题排查,这篇可以算的上是比较典型的内存泄露问题。

7. 《从nacos客户端的TIME_WAIT说起》

再说回注册中心迁移,当时是往Nacos迁移,测试阶段遇到了Nacos客户端会出现大量TIME_WAIT的问题,还好测试充分,这要是上线了,也是个大故障。

但这要写篇文章似乎也太短了,于是就带大家复习了一下TCP的3次握手。

8. 《几个你不知道的dubbo注册中心细节》

这篇关于Dubbo注册中心配置的文章算是一个小小的问题汇总,包括如何配置backup地址,如何配置多注册中心的一些细节,都是从实际的生产中发现的。

9. 《升级dubbo,小心default.version!》

本文也是一次线上问题记录,是Dubbo2.6和2.7的一个关于version/group的兼容性问题,很容易出问题。

本文当时被一个大佬转载了,他换了个标题《升级Dubbo,竟然搞出线上P0故障》,果然标题党比较容易吸引人点击。

10. 《排查dubbo接口重复注销问题,我发现了一个巧妙的设计》

写这篇文章时,我已经开始负责自研的注册中心了,当时用户经常反馈Dubbo在停止时会报错,我查了下发现有些版本的Dubbo会重复注销。

当时还查了不少资料,也找到了徐妈(Kirito的技术分享)关于Dubbo优雅停机的文章,至今印象深刻。

11. 《rocketmq优雅停机往事》

这是一篇旧文,我还在做业务时发现的问题,并尝试了各种方法解决,虽然问题不大,但解决起来还是蕴藏着很多技术点,后来也看到了官方在rocketmq的spring-boot-starter是如何解决的。

这篇文章最早写的比较朴素,发布在博客上,当时我想试验下在文章中插入表情包,会不会读者反响很好,但结果是并没有多好。

我想并不是表情包不好,而是要合乎时宜、适度地使用。

12. 《给dubbo贡献源码,做梦都在修bug》

本文是当时看Dubbo的Redis注册中心源码时发现的一个问题,并且提交源码解决了。

当时很神奇的一个事情是一个单元测试运行时间稍微久了一点,然后当天晚上竟然在梦里发现了白天提交的代码有BUG,第二天早上起来看,果然有问题,而且梦里精准到了出问题的代码行数,简直不可思议。

故事绝对真实。

13. 《Dubbo No provider问题排查思路》

这也是篇总结性质文章,对于工作中有人问我Dubbo为什么调用时报No Provider错时,我就把这篇文章甩给他,让他先自查。

后来发现Dubbo的新版本在日志中透出了更详细的信息,让排查变得非常简单,如果当时更近一步,应该也能想到这个方法。

14. 《案例分享 | dubbo 2.7.12 bug导致线上故障》

这篇文章算是个分水岭,在这之前,我都是闷头写文,在这之后,开启了投稿之旅。

当时这篇文章被歪歪(why技术)转发了下,于是很多大佬纷纷前来转载。

虽然对我来说,本质上没有变化,但读者变得更多了。

15. 《dubbo 配置 loadbalance 不生效?撸一把源码》

也是一篇非常偏细节的文章,但写文我也在想,关于Dubbo的文章,本身受众就不算多,而且如此细节,有没有写的必要?

于是后面有意减少了关于Dubbo的文章,但实在碰到有意思的我还是会写下来。

16. 《Java 问题排查技术分享》

这是在前公司的一次分享,分享主题是如何排查Java问题,当时只是分享了一点点想法和案例。

后来我还有个写一本问题排查方法论+案例的电子书,但始终没有下手。

可能是太懒了吧。

17. 《我好像发现了一个Go的Bug?》

再后来,开始写Go,一次用Go做Benchmark时,发现竟然超时了。

不得不说问题排查久了,是有一种感觉的,这个超时感觉就有问题。

于是花了2天时间,把Benchmark的源码看了一遍,发现确实有问题,于是给Go提了BUG,官方也承认有BUG。

而且也提交了修复代码,但直到现在也没合并。

不过也水了2篇文章,不亏。

18. 《踩了个DNS解析的坑,但我还是没想通》

遇到了这么多问题,有没有没查出原因的?还真有。

这次就是,用Go的httpClient遇到了DNS的问题,虽然解决了,但没查出根因。

由于时间比较紧张,于是不再纠结,遂记录下此文,趁着这个机会把Go的DNS解析流程撸了一遍,后来也看了Java的实现,大差不差。

19. 《眼见不一定为实:调用链HBase倾斜修复》

这是一位朋友的投稿,其实跟HBase关系不大,但大家看到HBase就不想点开。

于是这篇文章的阅读率很低。

20. 《太极限了,JDK的这个BUG都能被我踩到》

其实是个很简单的BUG,不错的地方是结合了实践。

这篇文章也是写了很久没写完,当时一个劲地钻牛角尖,想从JVM实现的角度看看为什么会出这种BUG,后来发现没啥好写的。

直到某一天想到是否可以换个角度写,没想到写出来效果还挺好。

21. 《这不会又是一个Go的BUG吧?》

这篇文章记录了一个线上Go读写锁使用不当导致的问题。

写Java出身的我,感觉Go的实现很奇怪,于是和很多小伙伴讨论,写Java的小伙伴说Go的读写锁有问题,写Go的小伙伴认为Java的锁实现不合理。

究竟谁有问题?

Go没有问题,Java也没有问题,有问题的是我们不够了解他们,所以学习一门编程语言,还是得脚踏实地,系统地学习一遍。

22. 《抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会》

这篇文章来源一个技术群,群里讨论了大半天基本把结论说了出来,我只是事后又验证了一遍,用有趣的文字记录下来。

好久没用Arthas的我,又复习了一下它的用法,感觉很爽。

这22个问题只是开端,未完待续~

关键词: 这个问题 发现了一个 没有问题

相关阅读