- 博客(72)
- 收藏
- 关注
转载 不要小看小小的 emoji 表情
前言好久没更新了,最近事比较多,或许下个月就会恢复到正常的发文频次。这篇文章得从一个 emoji 表情开始,我之前开源的一个 IM 项目中有朋友提到希望可以支持 emoji 表情传输。https://github.com/crossoverJie/cim/issues/12正好那段时间有空,加上这功能看着也比较简单准备把它实现了。但在真正实现时却发现没那么简单。我首...
2019-09-10 08:21:00
313
转载 如何参与一个顶级开源项目
前言最近个人事情比较多(搬家、换工作、短暂休息)所以一直也没有顾得上博客更新,恰好最近收到一封邮件提醒了我。也是时候写一篇文章来聊聊参与开源项目的事(最近也确实进入了笔荒期)。ps:第一次收到这样的中秋节礼物,加上 Dubbo 社区的活跃及阿里的重视度,还在做 RPC 或微服务技术选型的朋友可以考虑 Dubbo。参与开源现在具体来聊聊参与开源的事;日常几乎所有的开发者都会...
2019-08-20 08:36:00
201
转载 一次难得的分库分表实践
背景前不久发过两篇关于分表的文章:一次分表踩坑实践的探讨分表后需要注意的二三事从标题可以看得出来,当时我们只做了分表;还是由于业务发展,截止到现在也做了分库,目前看来都还比较顺利,所以借着脑子还记得清楚来一次复盘。先来回顾下整个分库分表的流程如下:整个过程也很好理解,基本符合大部分公司的一个发展方向。很少会有业务一开始就会设计为分库分表,虽说这样会减少后续的坑,但...
2019-08-08 08:32:00
175
转载 设计一个全局异常处理器
前言最近稍微闲了一点于是把这个半年都没更新的开源项目 cicada 重新捡了起来。一些新关注的朋友应该还不知道这项目是干啥的?先来看看官方介绍吧(其实就我自己写的????)cicada: 基于 Netty4 实现的快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅 30KB。针对这个轮子以前也写过相关的介绍,感兴趣的可以再翻回去看看:「造个轮子」——cicada...
2019-07-15 08:34:00
120
转载 What?一个 Dubbo 服务启动要两个小时!
前言前几天在测试环境碰到一个非常奇怪的与 dubbo 相关的问题,事后我在网上搜索了一圈并没有发现类似的帖子或文章,于是便有了这篇。希望对还未碰到或正在碰到的朋友有所帮助。现象现象是这样的,有一天测试在测试环境重新部署一个 dubbo 应用的时候发现应用“启动不起来”。但过几个小时候之后又能自己慢慢恢复,并能够对外提供 dubbo 服务。但其实经过我后续排查发现刚开始其实...
2019-07-05 08:16:00
116
转载 常见的集合容器应当避免的坑
前言前不久帮同事一起 review 一个 job 执行缓慢的问题时发现不少朋友在撸码实现功能时还是有需要细节不够注意,于是便有了这篇文章。ArrayList 踩坑List<String> temp = new ArrayList() ;//获取一批数据List<String> all = getData();for(String str : all...
2019-07-04 08:27:00
276
转载 再一次生产 CPU 高负载排查实践
前言前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨。其实早在去年我也处理过类似的问题,并记录下来:《一次生产 CPU 100% 排查优化实践》不过本次问题产生的原因却和上次不太一样,大家可以接着往下看。问题分析收到邮件后我马上登陆那台服务器,看了下案发现场还在(负载依然很高)。于是我便利用这类问题的排查套...
2019-06-18 08:18:00
82
转载 分表后需要注意的二三事
前言本篇是上一篇《一次分表踩坑实践的探讨》,所以还没看过的朋友建议先看上文。还是先来简单回顾下上次提到了哪些内容:分表策略:哈希、时间归档等。分表字段的选择。数据迁移方案。而本篇文章的背景是在我们上线这段时间遇到的一些问题并尝试解决的方案。问题产生之前提到在分表应用上线前我们需要将原有表的数据迁移到新表中,这样才能保证业务不受影响。所以我们单独写了一个迁移应用,...
2019-06-13 01:01:00
134
转载 线程池没你想的那么简单(续)
前言前段时间写过一篇《线程池没你想的那么简单》,和大家一起撸了一个基本的线程池,具备:线程池基本调度功能。线程池自动扩容缩容。队列缓存线程。关闭线程池。这些功能,最后也留下了三个待实现的 features 。执行带有返回值的线程。异常处理怎么办?所有任务执行完怎么通知我?这次就实现这三个特性来看看 j.u.c 中的线程池是如何实现这些需求的。再看本文之前...
2019-06-06 08:54:00
78
转载 年轻人的第一篇博客
前言写这篇文章的前因是有位读者留言提到了相关的话题,其实在之前有一篇《如何成为一位「不那么差」的程序员》时有简要提到但没有细说;这次就借这个机会好好聊聊这个事情的前因后果。为什么要写博客为什么要写博客? 我觉得大部分人应该都知道标准答案。翻了下记录,我从 16 年四月份至今写了三年的博客,产出了 100 多篇;现在让我回忆当初为啥要写博客,我还记得那时作为一个初入职场的小...
2019-05-24 08:54:00
123
转载 线程池没你想的那么简单
前言原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它;但在动手写的过程中落地到细节时发现并没想的那么容易。结合源码对比后确实不得不佩服 Doug Lea 。我觉得大部分人直接去看 java.util.concurrent.ThreadPoolExecutor 的源码时都是看一个大概,因为其中涉及到了许多细节处理,还有部分 AQS 的内...
2019-05-20 08:23:00
94
转载 图床失效了?也许你应该试试这个工具
前言经过几个小伙伴的提醒,发现个人博客中的许多图片都裂了无法访问;原因就不多说,既然出现问题就得要解决。原本我的处理方式非常简单粗暴:找到原有的图片重新下载下来上传到新的可用图床再把图片地址替换。这样搞了一两篇之后我就绝望了。。。之前为了代码能在公众号里也有好的阅读体验,所以能截图的我绝不贴代码,导致一篇文章多的得有十几张图片。好在哪位大佬说过“以人肉XX为耻”,这种重复...
2019-05-09 08:40:00
123
转载 『并发包入坑指北』之向大佬汇报任务
前言在面试过程中聊到并发相关的内容时,不少面试官都喜欢问这类问题:当 N 个线程同时完成某项任务时,如何知道他们都已经执行完毕了。这也是本次讨论的话题之一,所以本篇为『并发包入坑指北』的第二篇;来聊聊常见的并发工具。自己实现其实这类问题的核心论点都是:如何在一个线程中得知其他线程是否执行完毕。假设现在有 3 个线程在运行,需要在主线程中得知他们的运行结果;可以分为以下几...
2019-04-29 07:59:00
92
转载 一次分表踩坑实践的探讨
前言之前不少人问我“能否分享一些分库分表相关的实践”,其实不是我不分享,而是真的经验不多????;和大部分人一样都是停留在理论阶段。不过这次多少有些可以说道了。先谈谈背景,我们生产数据库随着业务发展量也逐渐起来;好几张单表已经突破亿级数据,并且保持每天 200+W 的数据量增加。而我们有些业务需要进行关联查询、或者是报表统计;在这样的背景下大表的问题更加突出(比如一个查询功能需要跑好...
2019-04-16 12:03:00
81
转载 『并发包入坑指北』之阻塞队列
前言较长一段时间以来我都发现不少开发者对 jdk 中的 J.U.C(java.util.concurrent)也就是 Java 并发包的使用甚少,更别谈对它的理解了;但这却也是我们进阶的必备关卡。之前或多或少也分享过相关内容,但都不成体系;于是便想整理一套与并发包相关的系列文章。其中的内容主要包含以下几个部分:根据定义自己实现一个并发工具。JDK 的标准实现。实践案例。...
2019-04-10 08:16:00
82
转载 线程池中你不容错过的一些细节
背景上周分享了一篇《一个线程罢工的诡异事件》,最近也在公司内部分享了这个案例。无独有偶,在内部分享的时候也有小伙伴问了之前分享时所提出的一类问题:这其实是一类共性问题,我认为主要还是两个原因:我自己确实也没讲清楚,之前画的那张图还需要再完善,有些误导。第二还是大家对线程池的理解不够深刻,比如今天要探讨的内容。线程池的工作原理首先还是来复习下线程池的基本原理。...
2019-03-26 08:46:00
77
转载 一个线程罢工的诡异事件
背景事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。虽然是前人写的代码,但作为 Bug maker&killer 只能咬着牙上了。因为之前没有接触过出问题这块的逻辑,所以简单理了下如图:有一个生产线程一直源源不断的往队列写数据。消费线程也一直不停的取出数据后写入后续的业务线程池。业务线程池里的线程会对...
2019-03-13 08:24:00
71
转载 一致性 Hash 算法的实际应用
前言记得一年前分享过一篇《一致性 Hash 算法分析》,当时只是分析了这个算法的实现原理、解决了什么问题等。但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的一个路由需求来着手实现一次。背景看过《为自己搭建一个分布式 IM(即时通讯) 系统》的朋友应该对其中的登录逻辑有所印象。先给新来的朋友简单介绍下 cim 是干啥的:其中有一个场景是在客户...
2019-03-01 08:28:00
79
转载 利用策略模式优化过多 if else 代码
前言不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧。比如平时大家是否都会写类似这样的代码:if(a){ //dosomething}else if(b){ //doshomething}else if(c){ //doshomething} else{ ////doshomething}条件少还好,一旦 else i...
2019-01-30 17:33:00
101
转载 长连接的心跳及重连设计
前言说道“心跳”这个词大家都不陌生,当然不是指男女之间的心跳,而是和长连接相关的。顾名思义就是证明是否还活着的依据。什么场景下需要心跳呢?目前我们接触到的大多是一些基于长连接的应用需要心跳来“保活”。由于在长连接的场景下,客户端和服务端并不是一直处于通信状态,如果双方长期没有沟通则双方都不清楚对方目前的状态;所以需要发送一段很小的报文告诉对方“我还活着”。同时还有另外几个目...
2019-01-23 08:47:00
68
转载 为自己搭建一个分布式 IM 系统二【从查找算法聊起】
前言最近这段时间确实有点忙,这篇的目录还是在飞机上敲出来了的。言归正传,上周更新了 cim 第一版;没想到反响热烈,最高时上了 GitHub Trending Java 版块的首位,一天收到了 300+ 的 star。现在总共也有 1.3K+ 的 star,有几十个朋友参加了测试,非常感谢大家的支持。在这过程中也收到一些 bug 反馈,feature 建议;因此这段时间...
2019-01-14 08:34:00
104
转载 为自己搭建一个分布式 IM(即时通讯) 系统
前言大家新年快乐!新的一年第一篇技术文章希望开个好头,所以元旦三天我也没怎么闲着,希望给大家带来一篇比较感兴趣的干货内容。老读者应该还记得我在去年国庆节前分享过一篇《设计一个百万级的消息推送系统》;虽然我在文中有贴一些伪代码,依然有些朋友希望能直接分享一些可以运行的源码;这么久了是时候把坑填上了。本文较长,高能预警;带好瓜子板凳。于是在之前的基础上我完善了一些内容...
2019-01-02 08:03:00
2212
转载 2018 年度复盘
前言看着今年的进度表已经所剩无几,是时候来复盘一把了。从 16 年初写博客开始到现在我觉得写年终总结的习惯不错,毕竟每次看着去年的 flag 又可以复制粘贴了。今年我会从工作、技术、身体等方面回顾,这几块也是今年变化最大的几个点。工作先说工作吧,这个变化也贯穿了整年。从今年年初开始,我从上一个技术团队调到现在的部门;首先是组织结构上的变更,当然更主要的还是角色的变化。...
2018-12-26 08:33:00
150
转载 一次生产 CPU 100% 排查优化实践
前言到了年底果然都不太平,最近又收到了运维报警:表示有些服务器负载非常高,让我们定位问题。还真是想什么来什么,前些天还故意把某些服务器的负载提高(没错,老板让我写个 BUG!),不过还好是不同的环境互相没有影响。定位问题拿到问题后首先去服务器上看了看,发现运行的只有我们的 Java 应用。于是先用 ps 命令拿到了应用的 PID。接着使用 top -Hp pid 将这个进程的...
2018-12-17 08:25:00
230
转载 没错,老板让我写个 BUG!
前言标题没有看错,真的是让我写个 bug!刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了????。先来看看具体是要干啥吧,其实主要就是要让一些负载很低的服务器额外消耗一些内存、CPU 等资源(至于背景就不多说了),让它的负载可以提高一些。JVM 内存分配回顾于是我刷刷一把梭的就把代码写好了,大概如下:写完之后我就在想一个问题...
2018-12-12 08:21:00
74
转载 如何判断一个元素在亿级数据中是否存在?
前言最近有朋友问我这么一个面试题目:现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。需求其实很清晰,只是要判断一个数据是否存在即可。但这里有一个比较重要的前提:非常庞大的数据。常规实现先不考虑这个条件,我们脑海中出现的第一种方案是什么?我想大多数想到的都是用 HashMap 来存放数据,因为它的写入查询的效...
2018-11-26 07:51:00
268
转载 分享一些 Kafka 消费数据的小经验
前言之前写过一篇《从源码分析如何优雅的使用 Kafka 生产者》 ,有生产者自然也就有消费者。建议对 Kakfa 还比较陌生的朋友可以先看看。就我的使用经验来说,大部分情况都是处于数据下游的消费者角色。也用 Kafka 消费过日均过亿的消息(不得不佩服 Kakfa 的设计),本文将借助我使用 Kakfa 消费数据的经验来聊聊如何高效的消费数据。单线程消费以之前生产者中的...
2018-11-20 08:31:00
93
转载 设计一个可拔插的 IOC 容器
前言磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本。之所以大的版本号变为 2,确实是向下不兼容了;主要表现为:修复了几个反馈的 bug。灵活的路由方式。可拔插的 IOC 容器选择。其中重点是后面两个。新的路由方式先来看第一个:路由方式的更新。在之前的版本想要写一个接口必须的实现一个 WorkAction;而且最麻烦的是一个实现类只能...
2018-11-15 08:37:00
78
转载 不改一行代码定位线上性能问题
背景最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题。大致的现象是:我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。尝试解决由于这种也不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的测试环境贼快。没办法只能硬着头皮上了。中途有抱着侥幸心里让运维查看了 Ng...
2018-11-12 08:20:00
151
转载 一次 HashSet 所引起的并发问题
背景上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件。心中暗道不好,因为监控系统从来不会告诉我应用完美无 bug,其实系统挺猥琐。打开邮件一看,果然告知我有一个应用的线程池队列达到阈值触发了报警。由于这个应用出问题非常影响用户体验;于是立马让运维保留现场 dump 线程和内存同时重启应用,还好重启之后恢复正常。于是开始着手排查问题。分析首先了解下这个应用大...
2018-11-08 07:53:00
164
转载 1.6W star 的 JCSprout 阅读体验大提升
万万没想到 JCSprout 截止目前居然有将近1.6W star。真的非常感谢各位大佬的支持。年初时创建这个 repo 原本只是想根据自己面试与被面试的经历记录一些核心知识点,结果却是越写越多。在我自己宣传和其他技术大佬(包括阮大)的助攻之下连续两个月都在 GitHub trending Java片区的榜首。甚至有一次还一跃到整个 GitHub 的第一,同时还有帮助一些同...
2018-11-06 08:18:00
60
转载 一份针对于新手的多线程实践--进阶篇
前言在上文《一份针对于新手的多线程实践》留下了一个问题:这只是多线程其中的一个用法,相信看到这里的朋友应该多它的理解更进一步了。再给大家留个阅后练习,场景也是类似的:在 Redis 或者其他存储介质中存放有上千万的手机号码数据,每个号码都是唯一的,需要在最快的时间内把这些号码全部都遍历一遍。有想法感兴趣的朋友欢迎在文末留言参与讨论????????。网友们的方案我在公众号以及...
2018-10-31 08:40:00
68
转载 一份针对于新手的多线程实践
前言前段时间在某个第三方平台看到我写作字数居然突破了 10W 字,难以想象高中 800 字作文我都得巧妙的利用换行来完成(懂的人肯定也干过????)。干了这行养成了一个习惯:能撸码验证的事情都自己验证一遍。于是在上周五通宵加班的空余时间写了一个工具:https://github.com/crossoverJie/NOWS利用 SpringBoot 只需要一行命令即可统计自己写了多...
2018-10-29 08:07:00
266
转载 利用责任链模式设计一个拦截器
前言近期在做 Cicada 的拦截器功能,正好用到了责任链模式。这个设计模式在日常使用中频率还是挺高的,借此机会来分析分析。责任链模式先来看看什么是责任链模式。引用一段维基百科对其的解释:责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处...
2018-10-22 08:10:00
84
转载 分享几个 SpringBoot 实用的小技巧
前言最近分享的一些源码、框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的: SpringBoot 使用中的一些小技巧。算不上多高大上的东西,但都还挺有用。屏蔽外部依赖第一个是屏蔽外部依赖,什么意思呢?比如大家日常开发时候有没有这样的烦恼:项目是基于 SpringCloud 或者是 dubbo 这样的分布式服务,你需要依...
2018-10-15 08:18:00
47
转载 从源码分析如何优雅的使用 Kafka 生产者
前言在上文 设计一个百万级的消息推送系统 中提到消息流转采用的是 Kafka 作为中间件。其中有朋友咨询在大量消息的情况下 Kakfa 是如何保证消息的高效及一致性呢?正好以这个问题结合 Kakfa 的源码讨论下如何正确、高效的发送消息。内容较多,对源码感兴趣的朋友请系好安全带????(源码基于 v0.10.0.0 版本分析)。同时最好是有一定的 Kafka 使用经验,知晓基本的用...
2018-10-11 08:04:00
58
转载 「造个轮子」——设计 HTTP 请求全局上下文
前言本次 Cicada 已经更新到了 v1.0.3。主要是解决了两个 issue,#9(Boss线程数好像设置有误 ) #8(怎么返回纯字符串内容不要JSON格式?)。所以本次的主要更新为:Cicada 采用合理的线程分配来处理接入请求线程以及 IO 线程。支持多种响应方式(以前只有 json,现在支持 text)。为了满足上者引入了 context。优雅停机。其...
2018-10-09 07:55:00
62
转载 设计一个百万级的消息推送系统
前言首先迟到的祝大家中秋快乐。最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两天????)。先简单说下本次的主题,由于我最近做的是物联网相关的开发工作,其中就不免会遇到和设备的交互。最主要的工作就是要有一个系统来支持设备的接入、向设备推送消息;同时还得满足大量设备接入的需求。所以本次...
2018-09-25 08:22:00
95
转载 「造个轮子」——cicada 设计一个配置模块
前言在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。因此我按照自己的想法创建了一个 issue ,也收集到了一些很不错的建议。最终其实还是按照我之前的想法来做了这个配置管理。同时将 cicada 升级到了 v1.0.2。目标在做之前是要把需求想好,到底怎样的一个配置管理是对开发人员来说比较友好的?我认为有以下几点:可以自定义配...
2018-09-14 08:48:00
88
转载 【译】如何高效的使用 Git
原文链接代码昨天还是运行好好的今天就不行了。代码被删了。突然出现了一个奇怪的 bug,但是没人知道怎么回事。如果你出现过上面的任何一种情况,那本篇文章就是为你准备的。除了知道 git add, git commit , git push 之外,Git 中还需要其他重要的技术需要掌握。长远来看对我们是有帮助的。这里我将向你展示 Git 的最佳实践。Git 工作流...
2018-09-07 08:50:00
59
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人