摘要: 前言 作为一个 Java 程序员,必须知道Java社区最强网络框架 Netty,且必须看过源码,才能说是了解这个框架,否则都是无稽之谈。今天楼主不会讲什么理论和概念,而是使用debug 的方式,走一遍 Netty (服务器)的启动过程。 1. demo 源码 楼主 clone 的 netty 的源码 阅读全文
posted @ 2018-05-19 23:44 莫那-鲁道 阅读(1380) 评论(0) 推荐(1) 编辑
摘要: 前言 在分布式系统中,常常需要使用缓存,而且通常是集群,访问缓存和添加缓存都需要一个 hash 算法来寻找到合适的 Cache 节点。但,通常不是用取余hash,而是使用我们今天的主角—— 一致性 hash 算法。 今天楼主就来说说这个一致性 hash 算法。 1. 为什么普通的 hash 算法不行 阅读全文
posted @ 2018-05-19 23:42 莫那-鲁道 阅读(1486) 评论(0) 推荐(1) 编辑
摘要: 前言 在前文 "分布式理论(八)—— Consistent Hash(一致性哈希算法)" 中,我们讨论了一致性 hash 算法的原理,并说了,我们会自己写一个简单的算法。今天就来写一个。 普通 hash 的结果 先看看普通 hash 怎么做。 首先,需要缓存节点对象,缓存中的存储对象,还有一个缓存节 阅读全文
posted @ 2018-05-19 23:42 莫那-鲁道 阅读(548) 评论(0) 推荐(0) 编辑
摘要: 1. 服务框架的设计 尽管不同的分布式服务框架实现细节存在差异,但是核心功能差异不大,下面的架构图描绘了一个分布式服务框架的整体逻辑架构。 总共分为 3 层: 1. 服务层,Service,其中主要部分就是动态代理,主要用于将服务提供者的接口封装成远程服务调用。上层的服务接口用于 Spring 之类 阅读全文
posted @ 2018-05-19 23:42 莫那-鲁道 阅读(1832) 评论(0) 推荐(0) 编辑
摘要: 前言 我们说为了实现 BASE 理论,需要在可用性和一致性之间找到一个合适的一致性理论,于是,我们在上篇文章中了解了 2PC 理论,也就是两阶段提交,二阶段提交原理简单,实现方便,但是缺点则是同步阻塞,单点问题,数据不一致,过于保守。 而为了弥补二阶段提交的缺点,研究者们在他的基础上,提出了三阶段提 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(3483) 评论(1) 推荐(0) 编辑
摘要: 前言 Paxos 算法如同我们标题大图:世界上只有一种一致性算法,就是 Paxos。出自一位 google 大神之口。 同时,Paxos 也是出名的晦涩难懂,推理过程极其复杂。楼主在尝试理解 Paxos 算法的过程中历经挫折。 今天,楼主不会讲推理过程,因为就算是尝试使用大白话来讲,也非常的难懂。当 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(2781) 评论(0) 推荐(2) 编辑
摘要: 前言 我们之前讲述了 Paxos 一致性算法,虽然楼主尝试用最简单的算法来阐述,但仍然还是有点绕。楼主最初怀疑自己太笨,后来才直到,该算法的晦涩难懂不是只有我一个人这么认为,而是国际公认! 所以 Paxos 算法在 1990 就发表出来,但却得不到运用。真正的名声大噪还是在兰伯特使用 “更简单” 的 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(2560) 评论(1) 推荐(2) 编辑
摘要: 前言 在前面的文章中,我们说了很多一致性协议,比如 Paxos,Raft,2PC,3PC等等,今天我们再讲一种协议,ZAB 协议,该协议应该是所有一致性协议中生产环境中应用最多的了。为什么呢?因为他是为 Zookeeper 设计的分布式一致性协议! 1. 什么是 ZAB 协议? ZAB 协议介绍 1 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(24208) 评论(13) 推荐(14) 编辑
摘要: 前言 在前文 "分布式理论(一) —— CAP 定理" 中,我们说,CAP 不可能同时满足,而分区容错是对于分布式系统而言,是必须的。最后,我们说,如果系统能够同时实现 CAP 是再好不过的了,所以出现了 BASE 理论,今天就来讲讲 Base 理论。 1. 什么是 Base 理论 BASE:全称: 阅读全文
posted @ 2018-05-19 23:40 莫那-鲁道 阅读(10825) 评论(2) 推荐(3) 编辑
摘要: 前言 为了使系统尽量能够达到 CAP,于是有了 BASE 协议,而 BASE 协议是在可用性和一致性之间做的取舍和妥协。 人们往往需要在系统的可用性和数据一致性之间反复的权衡。于是呢,就产生我们标题中的一致性协议,而且还不止一个呢。 为了解决分布式问题,涌现了很多经典的算法和协议,最著名的就是二阶段 阅读全文
posted @ 2018-05-19 23:40 莫那-鲁道 阅读(2855) 评论(0) 推荐(0) 编辑
摘要: 目录: 1. 什么是 CAP 定理 2. 为什么只能 3 选 2 3. 能不能解决 3 选 2 的问题 4. 引用 1. 什么是 CAP 定理 2000 年的时候,Eric Brewer 教授提出了 CAP 猜想,2年后,被 Seth Gilbert 和 Nancy Lynch 从理论上证明了猜想的 阅读全文
posted @ 2018-05-19 23:39 莫那-鲁道 阅读(4296) 评论(3) 推荐(3) 编辑
摘要: 前言 每一次总结都意味着重新开始,同时也是为了更好的开始。ConcurrentHashMap 一直是我心中的痛。虽然不敢说完全读懂了,但也看了几个重要的方法,有不少我觉得比较重要的知识点。 然后呢,放一些楼主写的关于 ConcurrentHashMap 相关源码分析的文章链接: 1. "Concur 阅读全文
posted @ 2018-05-19 23:28 莫那-鲁道 阅读(604) 评论(1) 推荐(0) 编辑
摘要: 前言 楼主自1月14号就停更了,这段时间一直在看JVM,因此没有更新任何文章,但楼主觉得有必要总结一下之前学习并发的过程,因为这一次的总结其实就是下一次的开始。主要时总结一下并发的学习路线,因为在楼主的工作环境中,并不是每天都在编写高并发的程序。然而,即使是这样,我们也要知道并发的每个知识点,这样才 阅读全文
posted @ 2018-05-19 23:28 莫那-鲁道 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 前言 ConcurrentHashMap 精华代码很多,前面分析了 helpTransfer 和 transfer 和 putVal 方法,今天来分析一下 addCount 方法,该方法会在 putVal 方法中调用。 该方法可以配合 size 方法一起查看,关于该方法,楼主也写了一篇文章分析过: 阅读全文
posted @ 2018-05-19 23:27 莫那-鲁道 阅读(468) 评论(0) 推荐(1) 编辑
摘要: 前言 这是一篇对 transfer 方法的拾遗,关于之前那篇文章的一些一笔带过,或者当时不知道的地方进行回顾。 疑点 1. 为什么将链表拆成两份的时候,0 在低位,1 在高位? 回顾一下 transfer 的相关代码: 关键看上面注释的代码,如果 runBit 是 0,那么就设置在低位节点,反之,如 阅读全文
posted @ 2018-05-19 23:27 莫那-鲁道 阅读(2069) 评论(0) 推荐(0) 编辑
摘要: 前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结果,之前的文章中,我们介绍了 putVal 方法。 "并发编程之 ConcurrentHashMap(JDK 1.8) putVal 源码分析" 。其中分析了 initTable 方法和 putVal 方法,但也留下了一 阅读全文
posted @ 2018-05-19 23:25 莫那-鲁道 阅读(1912) 评论(1) 推荐(1) 编辑
摘要: 前言 ConcurrentHashMap 鬼斧神工,并发添加元素时,如果 map 正在扩容,其他线程甚至于还会帮助扩容,也就是多线程扩容。就这一点,就可以写一篇文章好好讲讲。今天一起来看看。 源码分析 为什么帮助扩容? 在 putVal 方法中,如果发现线程当前 hash 冲突了,也就是当前 has 阅读全文
posted @ 2018-05-19 23:24 莫那-鲁道 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 前言 RPC 服务中,每个服务的容量都是有限的,即资源有限,只能承受住给定的网络请求,所以,在设计 RPC 框架的时候,一定要考虑流量控制这个问题。而 Java 中,实现流量控制有很多中方式,今天说 2 种。 Semaphore 实现流控 代码: 这段代码和上面的类似,只是使用的 API 不同,这里 阅读全文
posted @ 2018-05-19 23:23 莫那-鲁道 阅读(822) 评论(0) 推荐(0) 编辑
摘要: 前言 如何中断一个线程,肯定不会使用 stop。而是使用 interrupt 方法。同时,我们知道,中断一个线程只是打个标志位。不会真的中断线程,但,如果线程是阻塞状态的呢? 而 Java 中,想要阻塞一个线程有很多种方式。 1. synchronized 2. Object.wait() 3. L 阅读全文
posted @ 2018-05-19 23:23 莫那-鲁道 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 Java 中总的算起来有 8 种阻塞队列。 我们分析了: "并发编程之 SynchronousQueue 核心源码分析" "并发编程之 ConcurrentLinkedQueue 源码剖析" "并发编程之 LinkedBolckingQueue 源码剖析" 在 "并发编程 —— Sche 阅读全文
posted @ 2018-05-19 23:22 莫那-鲁道 阅读(3663) 评论(0) 推荐(2) 编辑