分类 默认分类 下的文章

分布式一致性机制整理


分布式中一致性是非常重要的,分为弱一致性强一致性。现在主流的一致性协议一般都选择的是弱一致性的特殊版本:最终一致性。下面就从分布式系统的基本原则讲起,再整理一些遵循这些原则的协议或者机制,争取通俗易懂。但是要真正实施起来把这些协议落地,可不是一片文章能说清楚的,有太多的细节,要自己去看论文呐(顺着维基百科找就行了)。

基本原则与理论

CAPConsistency一致性,Availability可用性,Partition tolerance分区容错性)理论是当前分布式系统公认的理论,亦即一个分布式系统不可能同时满足这三个特性,只能三求其二。对于分布式系统,P是基本要求,如果没有P就不是分布式系统了,所以一般都是在满足P的情况下,在CA之间寻求平衡。

ACIDAtomicity原子性,Consistency一致性,Isolation隔离性,Durability持久性)是事务的特点,具有强一致性,一般用于单机事务,分布式事务若采用这个原则会丧失一定的可用性,属于CP系统。

BASEBasically Availabe基本可用,Soft state软状态,Eventually consistency最终一致性)理论是对大规模的互联网分布式系统实践的总结,用弱一致性来换取可用性,不同于ACID,属于AP系统。


源码分析JDK8之AbstractQueuedSynchronizer


前言

源码分析我认为主要有两个作用:满足好奇心,我想每一个有追求的人都不会满足于仅仅做一个API Caller实现功能就好,我们也想知道它到底是怎么实现的;借鉴与升华,当我们明白了一个类的设计原理,在一定的情境下我们可以借鉴其设计哲学,甚至针对我们自己特殊的业务场景对其进行改良与优化。

下面我就以这篇文章开启我的源码阅读之旅。总体而言,我会从这个类基本结构入手,然后分析原理,再看看已有的应用,并进行分析与理解。

我之前一篇文章里提到过java的显示锁ReentrantLock。此外,如果你编写过并发程序那你一般也应该用过CountDownLatch,Semaphore等等,这些都是同步器,而它们都基于AbstractQueuedSynchronizer(简称AQS)实现的,那么我们今天就来看看这个牛逼的AQS是怎么实现这么多功能的。

首先打开IDEA,随便新建一个类,然后输入CountDownLatch,在它上面敲下Ctrl+B,就打开了CountDownLatch的源码,然后发现有一个非常重要的静态内部类Sync继承了AbstractQueuedSynchronizer,再次Ctrl+B,我们就打开了AQS的源码,马上就可以解开它的神秘面纱了,哼哼。

映入眼帘的首先就是大段大段的文档,大意就是这个类 提供了一个基于FIFO队列的实现了阻塞锁和相关同步器(信号量,事件等)的框架...... 读完了大概就了解这个类到底是怎么工作的了。下面我们开始分类型研究源码,当然不可能全部分析一遍,这里只把重点的列出来。


MySQL InnoDB 锁——官方文档翻译


个人认为学习MySQL最好的书面材料莫过于官方文档了,它不仅详细介绍了方方面面的使用方法,还讲解了原理,让你知其然并且知其所以然。这里就把官网的InnoDB Locking这一小节翻译过来,抛砖引玉。

InnoDB锁类型包括


一文理清21种设计模式:用实例分析和对比


设计模式无论是对于最底层的的编码实现还是较高层的架构设计都有着重要的指导作用。所谓光说不练假把式,今天我就把项目中常见的应用场景涉及到的主要设计模式及其相关设计模式总结一下,用实例分析和对比的方式在一片文章中就把最常见的21种设计模式梳理清楚。

Redis发布订阅

在项目中常常使用redis的发布/订阅功能,用来实现进程间通信甚至IM等业务。
使用 jedis 实现频道订阅的模式一般如下:

try( Jedis jedis =  RedisClient.getJedis() ) {
    JedisPubSub listener = new MySubListener();
    // 订阅
    jedis.subscribe(listener, "channel");
}


后端好书阅读与推荐(续四)


后端好书阅读与推荐系列文章:
后端好书阅读与推荐
后端好书阅读与推荐(续)
后端好书阅读与推荐(续二)
后端好书阅读与推荐(续三)
后端好书阅读与推荐(续四)

这里依然记录一下每本书的亮点与自己读书心得和体会,分享并求拍砖。

Docker生产环境实践指南

Docker生产环境实践指南 (豆瓣) https://book.douban.com/subject/26825958/

前面docker的基本概念和一些核心原理都看的差不多了,那么现在该关注一下具体的生产环境的使用方法了。

亮点:

  • 在生产环境中运行docker与在其它环境中相比,最主要的差异是需要在其安全性与稳定性上投入更多的注意力
  • 书中提到docker 容器与宿主机是通过IPtables实现的nat转换来进行通信,这点官网有说明 Docker container networking,然后就说了不适宜网络吞吐量有很高要求的应用(但是可以禁用Docker的NAT来提升网络性能),但是docker已经做出了一些努力,效果并不差,见:1,2,3
  • 书中对于docker相关常见的概念解释得非常清晰易懂,这一部分尤其适合初学者
  • docker生产环境最好的方式是将应用程序及其依赖预先打包成一个镜像,而包含数据库凭证等铭感信息在运行时动态添加(安全起见);常见流程是开发机上打包并推送到仓库,然后服务器从仓库拉取镜像,这种用例简单但是从工作流和安全角度看并不理想,更标准的做法是使用持续集成 / 持续交付系统在应用程序代码或者dockerfile发生变化时自动从新构建镜像