线上服务的性能分析,一直以来都是比较难的点,主要是难在无法在性能出现异常的当时捕捉到现场信息。有人可能会说,这有什么难的,直接用Go工具集里的pprof访问一下,进行采样拿下来分析就行了。话虽不假,不过抛开现实场景谈解决方案一般都会非常打脸,真的不行。举个现实中的例子,比如服务可能由于哪里的代码写的不好,内存占用率一点点涨上来,表现出来的现象就是服务隔一段时间就会重启一次(被集群重新拉起来),如果服务...
2022-08-23 16:28:46 5925浏览 0点赞 0回复 0收藏
hello,大家好呀,我是小楼。最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不...写一篇文章。问题复现遇到问题,尤其不是自己遇到的,必须要复现出来才好排查,截一个当时的聊天记录:他的问题原话是:今天发现一个问题有一个dubbo接口返回类型是boolean,把接口从同步改成异步server端返回true消费端却返回false,把boolean...
2022-08-23 16:27:50 4366浏览 0点赞 0回复 0收藏
hello,大家好呀,我是小楼。今天不写BUG,来聊一聊注册中心。标题本来想叫《如何设计一个注册中心》,但网上已经有好多类似标题的文章了。所以打算另辟蹊径,换个角度,如何组装一个注册中心。组装意味着不必从0开始造轮子,这也比较符合许多公司对待自研基础组件的态度。知道如何组装一个注册中心有什么用呢?第一可以更深入理解注册中心。以我个人经历来说,注册中心的第一印象就是Dubbo的Zookeeper(以下简称zk),后来逐渐...
2022-08-23 16:26:26 4556浏览 0点赞 0回复 0收藏
前言事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,在删好友之前,还叫我回家种田。说实话,你说我菜我是承认的,但你要我回家种田,我不理解。为什么要回家种田呢?养猪不比种田赚钱吗?我想了很久没有想明白,突然,我看到了这个新闻,瞬间明白了读者的用心良苦。于是,我决定写下这篇文...
2022-08-09 18:49:19 5034浏览 1点赞 0回复 0收藏
8.提交PR,修复Bug笔者首先向Netty社区提交了一个Issue,在Issue中详细为社区人员描述了这个Bug产生的原因。也就是上一小节中的内容。Issue:https:github.comnettynettyissues11981随后笔者按照《7.啊哈!!Bug!!》小节中介绍的修复思路为这个Issue提交了修复PR,PR:https:github.comnettynettypull11982笔者修复后的ShutdownOutput流程逻辑如下:编写单元测试,然后信心满满地等待PR被Merged。publicclassSocketHalfClosedT...
2022-08-09 18:45:26 5000浏览 0点赞 0回复 0收藏
3.3服务端程序崩溃TCP连接正常的状态下,无论是连接时发送的SYN,还是连接建立成功后发送的正常数据包,以及最后关闭连接时发送的FIN,都会收到对端的ACK确认。当服务端因为某种原因导致崩溃之后,客户端再次向服务端发送数据,就会收到RST。3.4开启SOLINGER选项设置llinger0在前边《2.1.3针对SOLINGER选项的处理》小节我们介绍SOLINGER选项的时候提到过,当我们将选项参数设置为lonoff1,llinger0时,当客户端调用close方法关...
2022-08-09 18:44:10 4925浏览 0点赞 0回复 0收藏
2.1.5Channel的关闭prepareToClose方法返回的closeExecutor是用来执行Channel关闭操作的,当我们开启了SOLINGER选项时,closeExecutorGlobalEventExecutor.INSTANCE,避免了Reactor线程的阻塞。由GlobalEventExecutor负责执行doClose0方法关闭Channel底层的Socket,并通知closeFuture关闭结果。privatevoidclose(finalChannelPromisepromise,finalThrowablecause,finalClosedChannelExceptioncloseCause,finalbooleannotify){.....
2022-08-09 17:24:35 4958浏览 0点赞 0回复 0收藏
写在前面.....本文是笔者肉眼盯Bug系列的第三弹,前两弹分别是:●抓到Netty一个Bug,顺带来透彻地聊一下Netty是如何高效接收网络连接的,在这篇文章中盯出了一个在Netty接收网络连接时,影响吞吐量的一个Bug。●抓到Netty一个隐藏很深的内存泄露Bug详解Recycler对象池的精妙设计与实现,在这篇文章中盯出了一个Netty对象池在多线程并发回收对象时可能导致内存泄露的一个Bug。而在本篇文章中笔者又用肉眼盯出了Netty在处理TCP连...
2022-08-09 17:03:24 5212浏览 0点赞 0回复 0收藏
hello,大家好呀,我是小楼。最近我又双叒叕写了个BUG,一个线上服务死锁了,不过幸亏是个新服务,没有什么大影响。出问题的是Go的读写锁,如果你是写Java的,不必划走,更要看看本文,本文的重点在于Java和Go的读写锁对比,甚至看完后你会有一个隐隐的感觉:Go的读写锁是不是有BUG?故障回放背景简单抽象一下:一个server服务(Go语言实现),提供了一个http接口,另有一个client服务来调用这个接口,整体架构非常简单,甚至都...
2022-08-09 17:01:00 4512浏览 0点赞 0回复 0收藏
一些有趣的问题Dubbo是一个优秀的RPC框架,其中有错综复杂的线程模型,本篇文章笔者从自己浅薄的认知中,来剖析Dubbo的整个IO过程。在开始之前,我们先来看如下几个问题:■业务方法执行之后,数据包就发出去了吗?■netty3和netty4在线程模型上有什么区别?■数据包到了操作系统socketbuffer,经历了什么?■Provider打出的log耗时很小,而Consumer端却超时了,怎么可以排查到问题?■数据包在物理层是一根管道就直接发过去吗...
2022-08-09 16:59:22 4319浏览 0点赞 0回复 0收藏
02.3初探clustergithub源码地址如下:https:github.comapachekafkablob2.7clientssrcmainjavaorgapachekafkacommonCluster.javahttps:github.comapachekafkablob2.7clientssrcmainjavaorgapachekafkacommonNode.javahttps:github.comapachekafkablob2.7clientssrcmainjavaorgapachekafkacommonPartitionInfo.javahttps:github.comapachekafkablob2.7clientssrcmainjavaorgapachekafkacommonTopicPartition.javapublicfinalclass...
2022-08-09 16:56:54 5645浏览 0点赞 0回复 0收藏
大家好,我是华仔,又跟大家见面了。在上一篇中,正式开启了「Kafka的源码之旅」,主要讲述了KafkaProducer初始化时用到的核心组件以及消息发送的核心流程,带你梳理生产者初始化整体的源码分析脉络,并通过「场景驱动」的方式带大家一点点的对Kafka源码进行深度剖析,一起掌握Kafka源码核心架构设计思想。今天这篇我们就来聊聊生产者是会如何拉取和管理元数据的,带你梳理生产者元数据管理整体的源码分析脉络。认真读完这篇文章...
2022-08-09 16:55:21 4890浏览 0点赞 0回复 0收藏
hello,大家好呀,我是小楼。前几天不是写了这篇文章《发现一个开源项目优化点,点进来就是你的了》嘛。文章介绍了Sentinl的自适应缓存时间戳算法,从原理到实现都手把手解读了,而且还发现SentinelGo还未实现这个自适应算法,于是我就觉得,这简单啊,把Java代码翻译成Go不就可以混个PR?甚至在文章初稿中把这个描述为:「有手就可以」,感觉不太妥当,后来被我删掉了。过了几天,我想去看看有没有人看了我的文章真的去提了个P...
2022-08-09 16:52:16 4351浏览 0点赞 0回复 0收藏
前言哈喽,大家好,我是asong;最近在看Go语言调度器相关的源码,发现看源码真是个技术活,所以本文就简单总结一下该如何查看Go源码,希望对你们有帮助。Go源码包括哪些?以我个人理解,Go源码主要分为两部分,一部分是官方提供的标准库,一部分是Go语言的底层实现,Go语言的所有源码标准库编译器都在src目录下:https:github.comgolanggotreemastersrc,想看什么库的源码任君选择;观看Go标准库andGo底层实现的源代码难易度也...
2022-08-09 16:48:44 8815浏览 0点赞 0回复 0收藏
hello,大家好呀,我是小楼。最近无聊(摸)闲逛(鱼)github时,发现了一个阿里开源项目可以贡献代码的地方。不是写单测、改代码格式那种,而是比较有挑战的性能优化,最关键的是还不难,仔细看完本文后,有点基础就能写出来的那种,话不多说,发车!相信大家在日常写代码获取时间戳时,会写出如下代码:longtsSystem.currentTimeMillis();读者中还有一些Gopher,我们用Go也写一遍:UnixTimeUnitOffsetuint64(time.Millisecondt...
2022-08-09 16:47:31 4940浏览 0点赞 0回复 0收藏
在移动互联网的业务场景中,数据量很大,我们需要保存这样的信息:一个key关联了一个数据集合,同时对这个数据集合做统计。●统计一个APP的日活、月活数;●统计一个页面的每天被多少个不同账户访问量(UniqueVisitor,UV));●统计用户每天搜索不同词条的个数;●统计注册IP数。通常情况下,我们面临的用户数量以及访问量都是巨大的,比如百万、千万级别的用户数量,或者千万级别、甚至亿级别的访问信息。今天「码哥」分别使...
2022-07-28 17:23:54 5021浏览 0点赞 0回复 0收藏
前言做开发这么多年,也碰到无数的bug了。不过再复杂的bug,只要仔细去研读代码,加上debug,总能找到原因。但是最近公司内碰到的这一个bug,这个bug初看很简单,但是非常妖孽,在一段时间内我甚至是百思不得其解。在长达几天的时间内,复现的概率非常低。几乎难以抓住任何踪迹。所以这篇文章就非常写实的来记录一下此Bug的发现和排查整个过程。起因同事之前做了个需求,提交测试。测试同事在测的一半的时候。发现了后台的一个...
2022-07-28 17:21:42 4841浏览 0点赞 0回复 0收藏
hello,大家好呀,我是小楼。之前遇到个文件监听变更的问题,刚好这周末有空研究了一番,整理出来分享给大家。从一次故障说起我们还是从故障说起,这样更加贴近实际,也能让大家更快速理解背景。有一个下发配置的服务,这个配置服务的实现有点特殊,服务端下发配置到各个服务的本地文件,当然中间经过了一个agent,如果没有agent也就无法写本地文件,然后由client端的程序监听这个配置文件,一旦文件有变更,就重新加载配置,画...
2022-07-28 17:19:41 4264浏览 0点赞 0回复 0收藏