线程池没你想的那么简单

2019-05-20
阅读 8 分钟
2.5k
原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它;但在动手写的过程中落地到细节时发现并没想的那么容易。结合源码对比后确实不得不佩服 Doug Lea 。

图床失效了?也许你应该试试这个工具

2019-05-09
阅读 2 分钟
1.8k
前言 经过几个小伙伴的提醒,发现个人博客中的许多图片都裂了无法访问;原因就不多说,既然出现问题就得要解决。 原本我的处理方式非常简单粗暴:找到原有的图片重新下载下来上传到新的可用图床再把图片地址替换。 这样搞了一两篇之后我就绝望了。。。 之前为了代码能在公众号里也有好的阅读体验,所以能截图的我绝不贴...

『并发包入坑指北』之向大佬汇报任务

2019-04-29
阅读 5 分钟
1.5k
前言 在面试过程中聊到并发相关的内容时,不少面试官都喜欢问这类问题: 当 N 个线程同时完成某项任务时,如何知道他们都已经执行完毕了。 这也是本次讨论的话题之一,所以本篇为『并发包入坑指北』的第二篇;来聊聊常见的并发工具。 <!--more--> 自己实现 其实这类问题的核心论点都是:如何在一个线程中得知其他...

一次分表踩坑实践的探讨

2019-04-16
阅读 4 分钟
2k
前言 之前不少人问我“能否分享一些分库分表相关的实践”,其实不是我不分享,而是真的经验不多?;和大部分人一样都是停留在理论阶段。 不过这次多少有些可以说道了。 先谈谈背景,我们生产数据库随着业务发展量也逐渐起来;好几张单表已经突破亿级数据,并且保持每天 200+W 的数据量增加。 而我们有些业务需要进行关联查...

『并发包入坑指北』之阻塞队列

2019-04-10
阅读 5 分钟
1.7k
较长一段时间以来我都发现不少开发者对 jdk 中的 J.U.C(java.util.concurrent)也就是 Java 并发包的使用甚少,更别谈对它的理解了;但这却也是我们进阶的必备关卡。

线程池中你不容错过的一些细节

2019-03-26
阅读 3 分钟
2k
背景 上周分享了一篇《一个线程罢工的诡异事件》,最近也在公司内部分享了这个案例。 无独有偶,在内部分享的时候也有小伙伴问了之前分享时所提出的一类问题: 这其实是一类共性问题,我认为主要还是两个原因: 我自己确实也没讲清楚,之前画的那张图还需要再完善,有些误导。 第二还是大家对线程池的理解不够深刻,比如...

一个线程罢工的诡异事件

2019-03-13
阅读 5 分钟
2.2k
背景 事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。 虽然是前人写的代码,但作为 Bug maker&killer 只能咬着牙上了。 <!--more--> 因为之前没有接触过出问题这块的逻辑,所以简单理了下如图: 有一个生产线程一直源源不断的往队列写数据。 ...

一致性 Hash 算法的实际应用

2019-03-01
阅读 7 分钟
3k
前言 记得一年前分享过一篇《一致性 Hash 算法分析》,当时只是分析了这个算法的实现原理、解决了什么问题等。 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的一个路由需求来着手实现一次。 背景 看过《为自己搭建一个分布式 IM(即时通讯) 系统》的朋友应该对其中的登录逻辑有所印象。 ...

利用策略模式优化过多 if else 代码

2019-01-30
阅读 2 分钟
5.4k
前言 不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧。 比如平时大家是否都会写类似这样的代码: {代码...} 条件少还好,一旦 else if 过多这里的逻辑将会比较混乱,并很容易出错。 比如这样: 摘自 cim 中的一个客户端命令的判断条件。 刚开始条件较少,也就没管那么多直接写的;现在功能多...

长连接的心跳及重连设计

2019-01-23
阅读 5 分钟
3.2k
前言 说道“心跳”这个词大家都不陌生,当然不是指男女之间的心跳,而是和长连接相关的。 顾名思义就是证明是否还活着的依据。 什么场景下需要心跳呢? 目前我们接触到的大多是一些基于长连接的应用需要心跳来“保活”。 由于在长连接的场景下,客户端和服务端并不是一直处于通信状态,如果双方长期没有沟通则双方都不清楚对...

为自己搭建一个分布式 IM 系统二【从查找算法聊起】

2019-01-14
阅读 6 分钟
2.8k
言归正传,上周更新了 cim 第一版;没想到反响热烈,最高时上了 GitHub Trending Java 版块的首位,一天收到了 300+ 的 star。

为自己搭建一个分布式 IM(即时通讯) 系统

2019-01-02
阅读 10 分钟
3.1k
老读者应该还记得我在去年国庆节前分享过一篇《设计一个百万级的消息推送系统》;虽然我在文中有贴一些伪代码,依然有些朋友希望能直接分享一些可以运行的源码;这么久了是时候把坑填上了。

2018 年度复盘

2018-12-26
阅读 3 分钟
3k
前言 看着今年的进度表已经所剩无几,是时候来复盘一把了。 从 16 年初写博客开始到现在我觉得写年终总结的习惯不错,毕竟每次看着去年的 flag 又可以复制粘贴了。 今年我会从工作、技术、身体等方面回顾,这几块也是今年变化最大的几个点。 工作 先说工作吧,这个变化也贯穿了整年。 从今年年初开始,我从上一个技术团...

一次生产 CPU 100% 排查优化实践

2018-12-17
阅读 4 分钟
5.6k
前言 到了年底果然都不太平,最近又收到了运维报警:表示有些服务器负载非常高,让我们定位问题。 还真是想什么来什么,前些天还故意把某些服务器的负载提高(没错,老板让我写个 BUG!),不过还好是不同的环境互相没有影响。 定位问题 拿到问题后首先去服务器上看了看,发现运行的只有我们的 Java 应用。于是先用 ps ...

没错,老板让我写个 BUG!

2018-12-12
阅读 4 分钟
2.1k
先来看看具体是要干啥吧,其实主要就是要让一些负载很低的服务器额外消耗一些内存、CPU 等资源(至于背景就不多说了),让它的负载可以提高一些。

如何判断一个元素在亿级数据中是否存在?

2018-11-26
阅读 8 分钟
4.3k
前言 最近有朋友问我这么一个面试题目: 现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。 需求其实很清晰,只是要判断一个数据是否存在即可。 但这里有一个比较重要的前提:非常庞大的数据。 常规实现 先不考虑这个条件,我们脑海中出现的第一种方案是什么? ...

分享一些 Kafka 消费数据的小经验

2018-11-20
阅读 4 分钟
8.4k
就我的使用经验来说,大部分情况都是处于数据下游的消费者角色。也用 Kafka 消费过日均过亿的消息(不得不佩服 Kakfa 的设计),本文将借助我使用 Kakfa 消费数据的经验来聊聊如何高效的消费数据。

设计一个可拔插的 IOC 容器

2018-11-15
阅读 4 分钟
2.6k
前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本。 之所以大的版本号变为 2,确实是向下不兼容了;主要表现为: 修复了几个反馈的 bug。 灵活的路由方式。 可拔插的 IOC 容器选择。 其中重点是后面两个。 新的路由方式 先来看第一个:路由方式的更新。 在之前的版本想要写一个接口必须的实现一个 ...

不改一行代码定位线上性能问题

2018-11-12
阅读 4 分钟
2.7k
背景 最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题。 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。 尝试解决 由于这种也不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的测试环境贼快。...

一次 HashSet 所引起的并发问题

2018-11-08
阅读 4 分钟
4.1k
背景 上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件。 心中暗道不好,因为监控系统从来不会告诉我应用完美无 bug,其实系统挺猥琐。 打开邮件一看,果然告知我有一个应用的线程池队列达到阈值触发了报警。 由于这个应用出问题非常影响用户体验;于是立马让运维保留现场 dump 线程和内存同时重启...

1.6W star 的 JCSprout 阅读体验大提升

2018-11-06
阅读 2 分钟
2.3k
万万没想到 JCSprout 截止目前居然有将近1.6W star。真的非常感谢各位大佬的支持。 年初时创建这个 repo 原本只是想根据自己面试与被面试的经历记录一些核心知识点,结果却是越写越多。 <!--more--> 在我自己宣传和其他技术大佬(包括阮大)的助攻之下连续两个月都在 GitHub trending Java片区的榜首。 甚至有一次还...

一份针对于新手的多线程实践--进阶篇

2018-11-01
阅读 3 分钟
1.9k
这只是多线程其中的一个用法,相信看到这里的朋友应该多它的理解更进一步了。 再给大家留个阅后练习,场景也是类似的: 在 Redis 或者其他存储介质中存放有上千万的手机号码数据,每个号码都是唯一的,需要在最快的时间内把这些号码全部都遍历一遍。

一份针对于新手的多线程实践

2018-10-29
阅读 7 分钟
2.1k
前段时间在某个第三方平台看到我写作字数居然突破了 10W 字,难以想象高中 800 字作文我都得巧妙的利用换行来完成(懂的人肯定也干过?)。

利用责任链模式设计一个拦截器

2018-10-22
阅读 5 分钟
9k
前言 近期在做 Cicada 的拦截器功能,正好用到了责任链模式。 这个设计模式在日常使用中频率还是挺高的,借此机会来分析分析。 责任链模式 先来看看什么是责任链模式。 引用一段维基百科对其的解释: 责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它...

分享几个 SpringBoot 实用的小技巧

2018-10-15
阅读 5 分钟
2.3k
最近分享的一些源码、框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的: SpringBoot 使用中的一些小技巧。

从源码分析如何优雅的使用 Kafka 生产者

2018-10-11
阅读 6 分钟
8.9k
前言 在上文 设计一个百万级的消息推送系统 中提到消息流转采用的是 Kafka 作为中间件。 其中有朋友咨询在大量消息的情况下 Kakfa 是如何保证消息的高效及一致性呢? 正好以这个问题结合 Kakfa 的源码讨论下如何正确、高效的发送消息。 内容较多,对源码感兴趣的朋友请系好安全带?(源码基于 v0.10.0.0 版本分析)。同时最...

「造个轮子」——设计 HTTP 请求全局上下文

2018-10-09
阅读 4 分钟
5.2k
前言 本次 Cicada 已经更新到了 v1.0.3。 主要是解决了两个 issue,#9(Boss线程数好像设置有误 ) #8(怎么返回纯字符串内容不要JSON格式?)。 所以本次的主要更新为: Cicada 采用合理的线程分配来处理接入请求线程以及 IO 线程。 支持多种响应方式(以前只有 json,现在支持 text)。 为了满足上者引入了 context。 优雅...

设计一个百万级的消息推送系统

2018-09-25
阅读 6 分钟
12.9k
前言 首先迟到的祝大家中秋快乐。 最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。 鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两天?)。 先简单说下本次的主题,由于我最近做的是物联网相关的开发工作,其中就不免会遇到和设备的交互。 最主要的工作就是要有...

「造个轮子」——cicada 设计一个配置模块

2018-09-14
阅读 4 分钟
1.6k
前言 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。 因此我按照自己的想法创建了一个 issue ,也收集到了一些很不错的建议。 最终其实还是按照我之前的想法来做了这个配置管理。 同时将 cicada 升级到了 v1.0.2。 目标 在做之前是要把需求想好,到底怎样的一个配置管理是对开发人员来说...

【译】如何高效的使用 Git

2018-09-07
阅读 3 分钟
2.1k
原文链接 [链接] 代码昨天还是运行好好的今天就不行了。代码被删了。 突然出现了一个奇怪的 bug,但是没人知道怎么回事。 如果你出现过上面的任何一种情况,那本篇文章就是为你准备的。 除了知道 git add, git commit , git push 之外,Git 中还需要其他重要的技术需要掌握。长远来看对我们是有帮助的。这里我将向你展示...