摘要: 前言 在前文 "Netty 启动过程源码分析 (本文超长慎读)(基于4.1.23)" 中,我们分析了整个服务器端的启动过程。在那篇文章中,我们重点关注了启动过程,而在启动过程中对核心组件并没有进行详细介绍,比如 EventLoop ,Pipeline,Unsafe 等。实际上,Netty 的大部分组 阅读全文
posted @ 2018-05-19 23:46 莫那-鲁道 阅读(1179) 评论(3) 推荐(2) 编辑
摘要: 前言 Netty 作为高性能框架,对 JDK 中的很多类都进行了封装了和优化,例如 Thread 类,Netty 使用了 FastThreadLocalRunnable 对所有 DefaultThreadFactory 创建出来的 Runnable 都进行了包装。包装的目的是 run 方法的不同,看 阅读全文
posted @ 2018-05-19 23:46 莫那-鲁道 阅读(1182) 评论(2) 推荐(1) 编辑
摘要: 前言 在前文中,我们分析了服务器是如何启动的。而服务器启动后肯定是要接受客户端请求并返回客户端想要的信息的,否则要你服务器干啥子呢?所以,我们今天就分析分析 Netty 在启动之后是如何接受客户端请求的。 开始吧! 1. 从源头开始 从之前服务器启动的源码中,我们得知,服务器最终注册了一个 Acce 阅读全文
posted @ 2018-05-19 23:45 莫那-鲁道 阅读(2741) 评论(0) 推荐(0) 编辑
摘要: 前言 作为一个 Java 程序员,必须知道Java社区最强网络框架 Netty,且必须看过源码,才能说是了解这个框架,否则都是无稽之谈。今天楼主不会讲什么理论和概念,而是使用debug 的方式,走一遍 Netty (服务器)的启动过程。 1. demo 源码 楼主 clone 的 netty 的源码 阅读全文
posted @ 2018-05-19 23:44 莫那-鲁道 阅读(1752) 评论(1) 推荐(1) 编辑
摘要: 前言 在分布式系统中,常常需要使用缓存,而且通常是集群,访问缓存和添加缓存都需要一个 hash 算法来寻找到合适的 Cache 节点。但,通常不是用取余hash,而是使用我们今天的主角—— 一致性 hash 算法。 今天楼主就来说说这个一致性 hash 算法。 1. 为什么普通的 hash 算法不行 阅读全文
posted @ 2018-05-19 23:42 莫那-鲁道 阅读(1670) 评论(0) 推荐(1) 编辑
摘要: 前言 在前文 "分布式理论(八)—— Consistent Hash(一致性哈希算法)" 中,我们讨论了一致性 hash 算法的原理,并说了,我们会自己写一个简单的算法。今天就来写一个。 普通 hash 的结果 先看看普通 hash 怎么做。 首先,需要缓存节点对象,缓存中的存储对象,还有一个缓存节 阅读全文
posted @ 2018-05-19 23:42 莫那-鲁道 阅读(630) 评论(0) 推荐(0) 编辑
摘要: 1. 服务框架的设计 尽管不同的分布式服务框架实现细节存在差异,但是核心功能差异不大,下面的架构图描绘了一个分布式服务框架的整体逻辑架构。 总共分为 3 层: 1. 服务层,Service,其中主要部分就是动态代理,主要用于将服务提供者的接口封装成远程服务调用。上层的服务接口用于 Spring 之类 阅读全文
posted @ 2018-05-19 23:42 莫那-鲁道 阅读(2031) 评论(0) 推荐(0) 编辑
摘要: 前言 我们说为了实现 BASE 理论,需要在可用性和一致性之间找到一个合适的一致性理论,于是,我们在上篇文章中了解了 2PC 理论,也就是两阶段提交,二阶段提交原理简单,实现方便,但是缺点则是同步阻塞,单点问题,数据不一致,过于保守。 而为了弥补二阶段提交的缺点,研究者们在他的基础上,提出了三阶段提 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(5020) 评论(1) 推荐(0) 编辑
摘要: 前言 Paxos 算法如同我们标题大图:世界上只有一种一致性算法,就是 Paxos。出自一位 google 大神之口。 同时,Paxos 也是出名的晦涩难懂,推理过程极其复杂。楼主在尝试理解 Paxos 算法的过程中历经挫折。 今天,楼主不会讲推理过程,因为就算是尝试使用大白话来讲,也非常的难懂。当 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(3254) 评论(0) 推荐(2) 编辑
摘要: 前言 我们之前讲述了 Paxos 一致性算法,虽然楼主尝试用最简单的算法来阐述,但仍然还是有点绕。楼主最初怀疑自己太笨,后来才直到,该算法的晦涩难懂不是只有我一个人这么认为,而是国际公认! 所以 Paxos 算法在 1990 就发表出来,但却得不到运用。真正的名声大噪还是在兰伯特使用 “更简单” 的 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(2866) 评论(1) 推荐(2) 编辑
摘要: 前言 在前面的文章中,我们说了很多一致性协议,比如 Paxos,Raft,2PC,3PC等等,今天我们再讲一种协议,ZAB 协议,该协议应该是所有一致性协议中生产环境中应用最多的了。为什么呢?因为他是为 Zookeeper 设计的分布式一致性协议! 1. 什么是 ZAB 协议? ZAB 协议介绍 1 阅读全文
posted @ 2018-05-19 23:41 莫那-鲁道 阅读(26371) 评论(14) 推荐(14) 编辑
摘要: 前言 在前文 "分布式理论(一) —— CAP 定理" 中,我们说,CAP 不可能同时满足,而分区容错是对于分布式系统而言,是必须的。最后,我们说,如果系统能够同时实现 CAP 是再好不过的了,所以出现了 BASE 理论,今天就来讲讲 Base 理论。 1. 什么是 Base 理论 BASE:全称: 阅读全文
posted @ 2018-05-19 23:40 莫那-鲁道 阅读(11928) 评论(2) 推荐(3) 编辑
摘要: 前言 为了使系统尽量能够达到 CAP,于是有了 BASE 协议,而 BASE 协议是在可用性和一致性之间做的取舍和妥协。 人们往往需要在系统的可用性和数据一致性之间反复的权衡。于是呢,就产生我们标题中的一致性协议,而且还不止一个呢。 为了解决分布式问题,涌现了很多经典的算法和协议,最著名的就是二阶段 阅读全文
posted @ 2018-05-19 23:40 莫那-鲁道 阅读(3529) 评论(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 莫那-鲁道 阅读(4625) 评论(3) 推荐(3) 编辑
摘要: 前言 每一次总结都意味着重新开始,同时也是为了更好的开始。ConcurrentHashMap 一直是我心中的痛。虽然不敢说完全读懂了,但也看了几个重要的方法,有不少我觉得比较重要的知识点。 然后呢,放一些楼主写的关于 ConcurrentHashMap 相关源码分析的文章链接: 1. "Concur 阅读全文
posted @ 2018-05-19 23:28 莫那-鲁道 阅读(681) 评论(1) 推荐(0) 编辑
摘要: 前言 楼主自1月14号就停更了,这段时间一直在看JVM,因此没有更新任何文章,但楼主觉得有必要总结一下之前学习并发的过程,因为这一次的总结其实就是下一次的开始。主要时总结一下并发的学习路线,因为在楼主的工作环境中,并不是每天都在编写高并发的程序。然而,即使是这样,我们也要知道并发的每个知识点,这样才 阅读全文
posted @ 2018-05-19 23:28 莫那-鲁道 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 前言 ConcurrentHashMap 精华代码很多,前面分析了 helpTransfer 和 transfer 和 putVal 方法,今天来分析一下 addCount 方法,该方法会在 putVal 方法中调用。 该方法可以配合 size 方法一起查看,关于该方法,楼主也写了一篇文章分析过: 阅读全文
posted @ 2018-05-19 23:27 莫那-鲁道 阅读(537) 评论(0) 推荐(1) 编辑
摘要: 前言 这是一篇对 transfer 方法的拾遗,关于之前那篇文章的一些一笔带过,或者当时不知道的地方进行回顾。 疑点 1. 为什么将链表拆成两份的时候,0 在低位,1 在高位? 回顾一下 transfer 的相关代码: 关键看上面注释的代码,如果 runBit 是 0,那么就设置在低位节点,反之,如 阅读全文
posted @ 2018-05-19 23:27 莫那-鲁道 阅读(2138) 评论(0) 推荐(0) 编辑
摘要: 前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结果,之前的文章中,我们介绍了 putVal 方法。 "并发编程之 ConcurrentHashMap(JDK 1.8) putVal 源码分析" 。其中分析了 initTable 方法和 putVal 方法,但也留下了一 阅读全文
posted @ 2018-05-19 23:25 莫那-鲁道 阅读(2218) 评论(2) 推荐(2) 编辑
摘要: 前言 ConcurrentHashMap 鬼斧神工,并发添加元素时,如果 map 正在扩容,其他线程甚至于还会帮助扩容,也就是多线程扩容。就这一点,就可以写一篇文章好好讲讲。今天一起来看看。 源码分析 为什么帮助扩容? 在 putVal 方法中,如果发现线程当前 hash 冲突了,也就是当前 has 阅读全文
posted @ 2018-05-19 23:24 莫那-鲁道 阅读(516) 评论(0) 推荐(0) 编辑