一个线程罢工的诡异事件
原文地址:https://crossoverjie.top/2019/03/12/troubleshoot/thread-gone/
背景
事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。虽然是前人写的代码,但作为 Bug maker&killer 只能咬着牙上了。因为之前没有接触过出问题这块的逻辑,所以简单理了下如图:
阅读全文原文地址:https://crossoverjie.top/2019/03/12/troubleshoot/thread-gone/
事情(事故)是这样的,突然收到报警,线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。虽然是前人写的代码,但作为 Bug maker&killer 只能咬着牙上了。因为之前没有接触过出问题这块的逻辑,所以简单理了下如图:
阅读全文记得一年前分享过一篇《一致性 Hash 算法分析》,当时只是分析了这个算法的实现原理、解决了什么问题等。
但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的一个路由需求来着手实现一次。
阅读全文大家新年快乐!
新的一年第一篇技术文章希望开个好头,所以元旦三天我也没怎么闲着,希望给大家带来一篇比较感兴趣的干货内容。
老读者应该还记得我在去年国庆节前分享过一篇《设计一个百万级的消息推送系统》;虽然我在文中有贴一些伪代码,依然有些朋友希望能直接分享一些可以运行的源码;这么久了是时候把坑填上了。
阅读全文上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件。
心中暗道不好,因为监控系统从来不会告诉我应用完美无 bug
,其实系统挺猥琐。
打开邮件一看,果然告知我有一个应用的线程池队列达到阈值触发了报警。
由于这个应用出问题非常影响用户体验;于是立马让运维保留现场 dump
线程和内存同时重启应用,还好重启之后恢复正常。于是开始着手排查问题。
已经记不清有多少读者问过:
博主,你是怎么学习的?像我这样的情况有啥好的建议嘛?
也不知道啥时候我居然成人生导师了。当然我不排斥这些问题,和大家交流都是学习的过程。
因此也许诺会准备一篇关于学习方面的文章;所以本文其实准备了很久,篇幅较长,大家耐心看完希望能有收获。
以下内容仅代表我从业以来所积累的相关经验,我会从硬技能、软实力这些方面尽量阐述我所认为的
“不那么差的程序员”
应当做到哪些技能。
首先迟到的祝大家中秋快乐。
最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。
鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两天?)。
先简单说下本次的主题,由于我最近做的是物联网相关的开发工作,其中就不免会遇到和设备的交互。
最主要的工作就是要有一个系统来支持设备的接入、向设备推送消息;同时还得满足大量设备接入的需求。
所以本次分享的内容不但可以满足物联网领域同时还支持以下场景:
WEB
的聊天系统(点对点、群聊)。WEB
应用中需求服务端推送的场景。平时接触过多线程开发的童鞋应该都或多或少了解过线程池,之前发布的《阿里巴巴 Java 手册》里也有一条:
可见线程池的重要性。
简单来说使用线程池有以下几个目的:
Map 这样的 Key Value
在软件开发中是非常经典的结构,常用于在内存中存放数据。
本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ConcurrentHashMap。
在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache
的相关原理。
文末提到了回收机制、移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析。
在开始之前先补习下 Java 自带的两个特性,Guava 中都有具体的应用。
最近有些朋友在面试阿里,加上 Java-Interview 项目的原因也有小伙伴和我讨论,近期也在负责部门的招牌,这让我想起年初那段长达三个月的奇葩面试经历?。
本来没想拿出来说的,毕竟最后也没成。但由于那几个月的经历让我了解到了大厂的工作方式、对候选同学的考察重点以及面试官的套路等都有了全新的认识。
当然最重要的是这段时间的查漏补缺也让自己精进不少。
Google 出的 Guava 是 Java 核心增强的库,应用非常广泛。
我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。
本次主要讨论缓存。缓存在日常开发中举足轻重,如果你的应用对某类数据有着较高的读取频次,并且改动较小时那就非常适合利用缓存来提高性能。
缓存之所以可以提高性能是因为它的读取效率很高,就像是 CPU 的 L1、L2、L3
缓存一样,级别越高相应的读取速度也会越快。
但也不是什么好处都占,读取速度快了但是它的内存更小资源更宝贵,所以我们应当缓存真正需要的数据。其实也就是典型的空间换时间。下面谈谈 Java 中所用到的缓存。
Netty 是一个高性能的 NIO 网络框架,本文基于 SpringBoot 以常见的心跳机制来认识 Netty。
最终能达到的效果: