【JRaft源码分析03】成员变化

第三篇说成员变化,有了对选举和日志复制的认识,这个模块就很轻松简单了。


成员变化就两种情况,增加删除更换节点,和转移领导人。

1、更改一般节点

一般成员节点变化

阅读全文

【JRaft源码分析02】心跳机制以及日志复制

日志复制是所有分布式共识算法最重要也是最复杂的部分,需要考虑各种各样安全性,比如机器挂了持久化没做、网络分区导致term&logindex不一致、成员变化带来两个任期相同的leader、异步网络出现日志乱序等等。

很多个细节,我边看源码边照着论文理解,一个异常判断反复推敲它的作用,想象发生的场景。这是源码级熟悉raft的好处,多多少少能身临其境,获取更多的实战校验。

阅读全文

【JRaft源码分析01】启用以及选举过程

最近潜心cap理论和raft算法,选用了蚂蚁金服的sofa-jraft,深入研究具体的实现。该框架参考自百度的BRAFT,可以说是非常优秀的分布式通用框架,很值得学习。


Raft算法的理论就不再多说了,感性认识的话可以看这个动画,非常好懂。

阅读全文

【Redis源码分析】Redis真的不是单线程,后台IO服务(BIO)

面试总喜欢被问Redis是单线程还是多线程,千篇一律的回答单线程却不知所以然,严格来说Redis是多线程多进程、单线程处理请求,本文说的就是多线程下的BIO(Background I/O service)。


由于redis单线程处理请求,所以某些耗时的操作被作为异步任务,有三种任务分别是:关闭文件、AOF同步磁盘、释放空间。

阅读全文

【Redis源码分析】Redis启动过程是这样的!

redis的源码确实是比我想象中要好读,本身是过程式编程,所以很多核心逻辑已经包含在main函数的调用链,流程非常长,耐心看下去还是能get到些东西的。


main函数包含了很多逻辑:哨兵模式、定时任务、持久化、模块加载、从磁盘加载数据等等,每个地方都能单独拎出来讲,这里就不说太多了

阅读全文

【Java并发】new Thread时JVM做了什么?

最近兴致勃勃捡起C++,打算深入Unix网络编程,但输出博客想从比较简单的问题入手,所以对标一下Java与C的线程创建过程,加深一下理解。(注,Linux)


Java创建线程是简单的,new Thread()start()即可启动并执行线程,但由于posix提供的api还涉及不少线程属性,真实过程显然要复杂得多。可以看到前者new Thread只是初始化属性,后者才是真正意义上调用本地接口JVM_StartThread,创建线程。

阅读全文

【网络编程】从Linux角度以及JVM源码,深入NIO的细节

最近一段时间都在啃Linux内核, 也给了自己机会再度深入理解Java的NIO实现,希望能获得更多东西,尝试理解以前未能理解的,会涉及少量OpenJDK源码。


因为NIO本身的实现很多牵扯到操作系统,所以需要先稍微过一下,有理解不对的地方,请指出。

涉及的Linux知识

文件描述符

对于Linux来说,一切皆为文件,设备文件、IO文件还是普通文件,都可以通过一个叫做文件描述符(FileDescriptor)的东西来进行操作,其涉及的数据结构可以自行了解VFS。

阅读全文

【Spring源码分析】BeanFactory体系的作用

最近静下心开始研读spring源码,从容器开始,直入眼帘的就是BeanFactory这个终极boss。通过BeanFactory及其子接口能得知不同的注入方式与获取方式,在尝试拓展自己的实例化时,有必要的用处。


先看看BeanFactory的最终实现类DefaultListableBeanFactory,生成出来的类关系图,看起来相当的复杂。本文暂且只讨论BeanFactory本身,与一代子接口AutowireCapableBeanFactoryHierarchicalBeanFactoryListableBeanFactory,还有个ConfigurableBeanFactory实在不想展开讲,东西有点多。

阅读全文

【Dubbo源码分析】四种负载均衡

Dubbo选择在客户端做负载均衡,提供了四种选择:随机、轮询、最少活跃调用数、一致性Hash。四种算法简单且有趣,可以稍微研究以下。


首先LoadBalance接口是一个SPI,select()方法被声明为Adaptive,通过URL参数找到对应的负载均衡方式,如果以下四种无法满足,可以自行拓展。

阅读全文

【Dubbo源码分析】SPI机制,将URL与可插拔拓展融合到极致

开始啃Dubbo时候,对其功能多样被吓到,若干功能由xml配置可任意组装,担心其复杂度过高,源码难啃。当我开始啃启动步骤的代码后,发现ExtensionLoader经常出现在较重要实例化的地方。
是的,ExtensionLoader、@SPI、@Adaptive、@Activate可以说是Dubbo的核心,Cluster、Protocol、Filter等接口都被声明为SPI,什么作用呢?能根据配置动态调用被声明为SPI接口的实现类,dubbo提供了URL方式作为参数配置。

阅读全文