自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(115)
  • 资源 (4)
  • 收藏
  • 关注

原创 从ZooKeeper源代码看如何实现分布式系统(四)session管理

这篇看看ZooKeeper如何管理Session。 Session相关的接口如下: Session: 表示session的实体类,维护sessionId和timeout两个主要状态SessionTracker: Session生命周期管理相关的操作SessionExpier: Session过期的操作public interface SessionTrack

2016-01-29 16:57:49 3810

原创 从ZooKeeper源代码看如何实现分布式系统(三)高性能的网络编程

对网络编程来说,最基本的三要素是IO, 协议(编解码),服务器端线程模型。这篇来看看ZooKeeper是如何实现高性能的网络程序。IO模型ZooKeeper默认提供了两种网络IO的实现,一个是Java原生的NIO,一个是基于Netty的IO。先从ServerCnxn这个抽象类看起,它表示一个从客户端到服务器端的网络连接。ServerCnxn实现了Stat服务器端统计接口,Watch

2016-01-11 17:35:42 4228

原创 从ZooKeeper源代码看如何实现分布式系统(二)数据的高可用存储

这篇先从数据的高可用存储说起。ZooKeeper提供了分布式的目录服务,它存储的数据相比一个分布式存储系统来说很少,它主要是用来做分布式协同操作的。但是麻雀虽小,五脏俱全,ZooKeeper也必须要提供数据的高可用存储,对数据进行备份和恢复,以防出现服务器宕机导致数据丢失的情况。    高可用的数据存储有一个比较通用的解决方案,就是数据文件 + 日志文件的方式。比如传统数据库中的数据文件 +

2016-01-08 11:22:23 4028

原创 从ZooKeeper源代码看如何实现分布式系统(一)概述

最近看了几篇介绍如何设计高可用,高新能的分布式系统的文章,从设计的角度来看很多共性的模式,比如Master-Slave,CAP的3个维度,负载均衡,存储,数据同步,失效转移,集群的选主策略,心跳监控,高性能的网络编程,日志,可伸缩性等等。这些名词解决的是分布式系统的核心问题。光从设计上来说比较容易,但是实现起来很有难度。实际上我们有一个很好的实现例子可以参考学习,那就是ZooKeeper。ZooK

2016-01-02 10:59:54 4173 1

原创 聊聊高并发(四十四)解析java.util.concurrent各个组件(二十) Executors工厂类

Executor框架为了更方便使用,提供了Executors这个工厂类,通过一系列的静态工厂方法,可以快速地创建相应的Executor实例。只有一个nThreads参数的newFixedThreadPool方法会创建一个ThreadPoolExecutor,corePoolSize和maximumPoolSize都是nThreads,并且keepAliveTime为0表示不会设置过期时

2015-07-22 16:10:04 4034 1

原创 聊聊高并发(四十三)解析java.util.concurrent各个组件(十九) 任务的定时执行和周期执行

ExecutorService最后一块是定时/周期执行任务的接口ScheduledExecutorService。这篇说说ScheduledExecutorService相关的内容。ScheduledExecutorService接口扩展了ExecutorService接口,在ExecutorService的生命周期管理,异步执行任务,批量执行任务的基础上,扩展了定时/周期执行任务的能力。

2015-07-21 16:15:49 4927

原创 聊聊高并发(四十二)解析java.util.concurrent各个组件(十八) 任务的批量执行和CompletionService

上一篇讲了ExecutorService关于任务的异步执行和状态控制的部分,这篇说说关于任务批量执行的部分。ExecutorSerivce中关于批量执行的

2015-07-20 15:16:48 4060

原创 聊聊高并发(四十一)解析java.util.concurrent各个组件(十七) 任务的异步执行和状态控制

这篇接着说ExecutorService相关内容。聊聊高并发(三十九)解析java.util.concurrent各个组件(十五) 理解ExecutorService接口的设计这篇说了ExecutorService接口扩展了Executor接口,在执行任务的基础上,提供了执行框架生命周期的管理,任务的异步执行,批量任务的执行的能力。AbstractExecutorService抽象类实现了Exec

2015-07-17 15:17:23 4158

原创 聊聊高并发(四十)解析java.util.concurrent各个组件(十六) ThreadPoolExecutor源码分析

ThreadPoolExecutor是Executor执行框架最重要的一个实现类,提供了线程池管理和任务管理是两个最基本的能力。这篇通过分析ThreadPoolExecutor的源码来看看如何设计和实现一个基于生产者消费者模型的执行器。生产者消费者模型生产者消费者模型包含三个角色:生产者,工作队列,消费者。对于ThreadPoolExecutor来说,1. 生产者是任务的提

2015-07-16 16:27:08 4985 2

原创 聊聊高并发(三十九)解析java.util.concurrent各个组件(十五) 理解ExecutorService接口的设计

上一篇讲了Executor接口的设计,目的是将任务的执行和任务的提交解耦,可以隐藏任务的执行策略。这篇说说ExecutorService接口。它扩展了Executor接口,对Executor的生命周期进行管理,并进行了进一步的扩展。Executor负责执行任务。它的生命周期有3个:运行,关闭和已终止。在运行的任何时刻,有些 任务可能已经完成,有些可能正在运行,有些可能正在队列中等待执行

2015-06-26 17:22:40 2853

原创 聊聊高并发(三十八)解析java.util.concurrent各个组件(十四) 理解Executor接口的设计

JCU包中除了一系列的同步类之外,就是Executor执行框架相关的类。对于一个执行框架来说,可以分为两部分1. 任务的提交2. 任务的执行。Executor接口设计的目的是专注于任务的执行,和任务的提交解耦。Executor接口封装了任务执行的细节,比如如何使用线程,是否定时执行等等。Executor接口很简单,就一个execute方法。public interface

2015-06-25 17:33:15 2897

原创 Flume NG源码分析(七)ChannelSelector

前几篇介绍了Flume NG Source组件的基本情况,接下来看看Channel相关的组件,Channel相关组件有:1. Channel2. ChannelSelector3. Interceptor / InterceptorChain4. ChannelProcessor5. Transaction这篇说说ChannelSelector之一的Replicat

2015-06-18 17:07:06 2750

原创 Flume NG源码分析(六)应用程序使用的RpcClient设计

上一篇Flume NG源码分析(五)使用ThriftSource通过RPC方式收集日志 介绍了ThriftSource利用Thrfit服务ThriftSourceProtocol来收集日志。这篇说说flume-ng-sdk中提供给应用层序使用的ThriftRPCClient类,它封装了ThriftSourceProtocol服务的客户端并提供了一些优化。先看看ThriftSourceP

2015-06-17 17:39:25 3877

原创 Flume NG源码分析(五)使用ThriftSource通过RPC方式收集日志

上一篇说了利用ExecSource从本地日志文件异步的收集日志,这篇说说采用RPC方式同步收集日志的方式。笔者对Thrift比较熟悉,所以用ThriftSource来介绍RPC的日志收集方式。整体的结构图如下:1. ThriftSource包含了一个Thrift Server,以及一个Thrift Service服务的实现。这里的Thrift Service是由ThriftSourcePr

2015-06-17 16:30:30 2998

原创 Flume NG源码分析(四)使用ExecSource从本地日志文件中收集日志

常见的日志收集方式有两种,一种是经由本地日志文件做媒介,异步地发送到远程日志仓库,一种是基于RPC方式的同步日志收集,直接发送到远程日志仓库。这篇讲讲Flume NG如何从本地日志文件中收集日志。ExecSource是用来执行本地shell命令,并把本地日志文件中的数据封装成Event事件流在Flume NG中流动。它的典型配置如下,指定source类型是exec,指定Source下游

2015-06-16 16:08:00 5143

原创 Flume NG源码分析(三)使用Event接口表示数据流

Flume NG有4个主要的组件:Event表示在Flume各个Agent之间传递的数据流Source表示从外部源接收Event数据流,然后传递给ChannelChannel表示对从Source传递的Event数据流的临时存储Sink表示从Channel中接收存储的Event数据流,并传递给下游的Source或者终点仓库这篇看一下Event接口表示的数据流。Source,

2015-06-16 15:53:21 2474

原创 Flume NG源码分析(二)支持运行时动态修改配置的配置模块

在上一篇中讲了Flume NG配置模块基本的接口的类,PropertiesConfigurationProvider提供了基于properties配置文件的静态配置的能力,这篇细说一下PollingPropertiesFileConfigurationProvider提供的运行时动态修改配置并生效的能力。要实现动态修改配置文件并生效,主要有两个待实现的功能1. 观察配置文件是否修改

2015-06-08 17:08:34 4222

原创 Flume NG源码分析(一)基于静态properties文件的配置模块

日志收集是互联网公司的一个重要服务,Flume NG是Apache的顶级项目,是分布式日志收集服务的一个开源实现,具有良好的扩展性,与其他很多开源组件可以无缝集成。搜了一圈发现介绍Flume NG的文章有不少,但是深入分析Flume NG源代码的却没有。最近准备写一个系列分析一下Flume NG的源码。这篇先从基础的配置模块说起。Flume NG支持两种配置模式,一种是基于proper

2015-06-03 21:02:12 4449

原创 实现一个支持运行时并发修改配置生效的Configuration类

可配置性是一个好的应用程序的重要指标。我们常常需要实现类似能够运行时修改配置的功能。最近在开发一个中间层的服务程序,最终发布的方式是把代码打成jar包交给调用方使用。这个中间层服务需要一些配置信息,考虑了一下有几个基本的需求:1. 在ja包中提供一个service-defalut.properties配置文件来提供全部的默认配置。这样的好处是尽量减少对调用方的侵入。调用方可以不提供额外的配置。

2015-05-08 18:00:18 2938

原创 用Java搭建微信公众号(二)生成access_token

当自己的程序需要访问微信的HTTP接口时,需要传递access_token作为校验的参数。access_token需要通过APPID和APPSecret秘钥来生成,有效期是7200秒,2小时。access_token最好是做成全局变量共享,然后由一个线程定时去刷新,这样可以减少access_token生成的次数,微信服务器对access_token的生成次数有限制。代码如下,首先是使用Http

2015-04-30 22:35:54 11067 3

原创 用Java搭建微信公众号(一)构建基础请求框架

最近帮朋友搭建一个微信公众号,通过查看微信公众号的开发者手册把基本功能实现了。把一些基本的可以通用的代码贴出来。微信公众号提供了两种模式,一种是直接编辑模式,通过操作页面就能搭建基本的功能,比如自定义菜单功能就很好用。一种是开发者模式,需要写代码来搭建,基于HTTP接口(不完全符合REST风格)。比较麻烦的是两种模式是二选一的关系,使用了开发者模式,就得丢弃一些直接编辑的方便。使用开发者模

2015-04-30 21:46:21 4456

原创 Log4j优化(一)扩展Log4j来实现性能优化的异步日志收集器

日志收集在互联网企业尤其是大数据时代是一件非常重要的事情,日志记录着用户行为和系统行为,是一种重要的数据来源。Log4j是Java应用程序使用的最多的一种日志收集工作。目前大量的Java应用程序都使用着Lo4j 1.2.X版本,Log4j 1.X版本饱受诟病的原因是使用了大量的锁,在高并发的情况下影响了系统的性能。这篇简单提供一种思路,说说如何扩展一下Log4j,提升一下Log4j的性能。

2015-04-23 10:33:50 10200

原创 Thrift源码分析(九)-- 扩展Thrift框架来实现Attachable的RPC调用

最近有一个分布式调用跟踪系统,需要给基于Thrift的RPC调用添加调用链上下文信息,从而可以生成一次调用的调用链。这篇讲讲如何扩展Thrift框架来实现RPC过程中无侵入地添加额外attachment信息的场景。Thrift框架本身提供了很多机制来支持扩展,比如1. 实现TProtocol接口来实现

2015-04-20 18:27:55 5048 4

原创 计算机底层知识拾遗(十)理解进程调度

这篇说说内核的进程调度机制,进程调度是内核的一个重要工作,由调度器完成。调度器主要解决两个问题1. 决定为每个进程分配多少运行时间,何时切换到下一个进程,下一个进程是什么2. 从进程A切换到进程B时,要保证进程B的执行环境和上次被撤销执行时完全一致,比如寄存器的内容,虚拟地址空间的各个数据结构。内核调度器调度的实体(KSE, kernal schedule entry)是进程和

2015-03-18 15:00:53 5049 1

原创 计算机底层知识拾遗(九)深入理解内存映射mmap

内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点。mmap和虚拟内存管理先来看看Linux内核的用户进程虚拟内存管理。内核定义了mm_struct结构来表示一个用户进程的虚拟内存地址空间。1. start_code, end_code指定了进程的代码段的边界,start_data, end_dat

2015-03-16 17:08:18 8303

原创 计算机底层知识拾遗(八)理解物理内存管理

内存管理是Linux内核最复杂的组件。内存管理包括虚拟内存机制和物理内存管理。这篇说说物理内存管理的一些要点。说到虚拟内存的时候我们知道虚拟内存地址空间分为两部分:内核地址空间和用户进程地址空间。这两个地址空间都使用虚拟地址,也就是说程序使用的都是虚拟地址。从虚拟地址映射到实际物理地址时有所区别:1. 内核使用物理内存时可以直接通过虚拟地址和内核地址空间的起始值的偏移量来计算得到实际物理内

2015-03-12 15:18:56 4844

原创 计算机底层知识拾遗(七)页缓存数据同步和页回收机制

这篇说说Linux的页缓存数据同步和页回收机制。数据同步和页回收是两个独立的概念,数据同步处理的是内存/缓存的数据和后备设备的数据一致问题,页回收处理的是在内存空间不足时如何回收已分配的物理内存页,来获得足够空间分配干净页,支持优先级更高的工作。数据同步在任意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发。数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件中去

2015-03-12 13:27:41 3869

原创 计算机底层知识拾遗(六)理解页缓存page cache和地址空间address_space

在这篇计算机底层知识拾遗(五)理解块IO层 中讲了块缓存buffer cache块缓存,这篇说说页缓存page cache以及相关的地址空间address_space的要点。在Linux 2.4内核中块缓存buffer cache和页缓存page cache是并存的,表现的现象是同一份文件的数据,可能即出现在buffer cache中,又出现在页缓存中,这样就造成了物理内存的浪费。Linux

2015-03-11 10:48:54 18781 5

原创 计算机底层知识拾遗(五)理解块IO层

上一篇讲了文件系统计算机底层知识拾遗(四)理解文件系统,说了文件按照inode-block的结构存储在磁盘上。这篇说说操作系统是如何来读取磁盘上的块的Linux把设备分为三种1. 块设备,用来永久存储文件信息的,支持顺序访问和随机访问(按块号访问),比如磁盘,光盘等2. 字符设备,只能顺序访问,比如键盘3. 网络设备,只能顺序访问,比如网卡,蓝牙设备我们常说的一

2015-01-29 14:15:15 9370

原创 计算机底层知识拾遗(四)理解文件系统

操作系统的很多核心组件都是相互关联的,比如虚拟内存管理,物理内存管理,文件系统,缓存系统,IO,设备管理等等,都要放在一起来看才能从整体上理解各个模块到底是如何交互和工作的。这个系列的目的也就是从整体上来理解计算机底层硬件和操作系统的一些重要的组件是如何工作的,从而来指导应用层的开发。这篇讲讲文件系统的重要概念,为后面的IO系统做铺垫。文件系统主要有三类1. 位于磁盘的文件系统,在

2015-01-29 13:25:38 8113

原创 计算机底层知识拾遗(三)理解磁盘的机制

磁盘是一种重要的存储器,位于主存结构的下方,是永久存储的介质。在计算机底层知识拾遗(一)理解虚拟内存机制 这篇中说了虚拟内存是面向磁盘的,理解磁盘的工作原理对理解计算机的很多概念有很大的帮助。尤其是在数据库和分布式存储领域,要经常和磁盘打交道。磁盘这块主要有几个部分的概念:1. 磁盘的基本结构和工作原理2. 如何在虚拟内存机制下与内存高效地交换数据3. 磁盘如何保证数据存储

2015-01-22 18:45:39 6922

原创 Java中如何获得文件的inode信息

熟悉Linux操作系统的同学应该知道Linux文件系统采用了inode - block的结构来表示和存储文件,inode包含了文件的元数据信息,block存储实际的文件内容。Linux把一切的IO都抽象成文件,那么目录和普通文件一样,也都是文件。每个文件都有一个唯一的inode号。可以用stat命令来查看一个文件的inode信息,比如下面这个文件 stat log.txt可

2015-01-21 11:56:00 8600 1

原创 计算机底层知识拾遗(二)深入理解进程和线程

关于进程和线程,大家总是说的一句话是“进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元”。这句话理论上没问题,我们来看看什么是所谓的“资源”呢。什么是计算机资源经典的冯诺依曼结构把计算机系统抽象成 CPU + 存储器 + IO,那么计算机资源无非就两种:1. 计算资源2. 存储资源CPU是计算单元,单纯从CPU的角度来说它是一个黑盒,它只对

2015-01-16 11:16:43 9717 3

原创 计算机底层知识拾遗(一)理解虚拟内存机制

这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了。随着工作的时间越久,越体会到这些基础知识的重要性。做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长。我自己深有体会,这些基础知识,底层原理是助你打破瓶颈的灵丹妙药。当理解了一些底层原

2015-01-12 16:33:34 18654 5

原创 聊聊高并发(三十七)整理一下并发基础中的一些知识点

最近在准备并发基础的PPT,想到了一些知识点,记录下来以后也可以做个参考。大部分的知识点在之前的博客中都多少涉及到了这里的并发基础指的是单机多处理器的情况下的一些并发问题,不涉及到分布式环境下的并发问题。并发基础主要解决的是可见性,有序性和原子性的问题,让不可控的进程/线程变得可以预测,可以控制行为。Java解决可见性/有序性的主要技术是通过Java内存模型来解决的。J

2014-12-23 13:09:23 6758 1

原创 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则

在前几篇将Java内存模型的那些事基本上把这个域底层的概念都解释清楚了,聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障 这篇分析了在X86平台下,volatile,synchronized, CAS操作都是基于Lock前缀的汇编指令来实现的,关于Lock指令有两个要点:1. lock会锁总线,总线是互斥的,所以lock后面的写操作会写入缓存和内存,可以理解为在lock后面的写缓存

2014-12-19 11:53:35 7293 13

原创 聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障

在聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了硬件层提供了满足某些一致性需求的能力,Java内存模型利用了硬件层提供的能力指定了一系列的语法和规则,让Java开发者可以隔绝这种底层的实现专注于并发逻辑的开发。这篇我们来看看硬件层是如何提供这些实现一致性需求的能力的。硬件层提供了一系列的内存屏障 memory barrier / memory

2014-12-18 16:08:03 13628 4

原创 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理

在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象,它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的统一的接口来提供保证内存一致性的编程能力。在一致性这个问题域中,各个层面扮演的角色大致如下:1. 一致性模型,定义了各种一致性模型的理论基础2. 硬件层,提供了实现某些一致性模型的硬件能力

2014-12-17 11:06:34 15164 3

原创 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型

可以说并发系统要解决的最核心问题就是一致性的问题,关于一致性的研究已经有几十年了,有大量的理论,算法支持。这篇说说一致性这个主题一些经常提到的概念,理清Java内存模型在其中的位置。一致性问题在单机器单CPU的情况下是最简单的,由于只有一个CPU,所有的读写操作都可以按照全局的时间顺序执行在单机器多CPU的情况下,多CPU并发执行,公用一个内存,一般通过共享内存的方式来处理一致性问

2014-12-15 14:31:07 10943 1

原创 推荐一下《聊聊JVM》的专栏

按照惯例新开了一个专栏后要单推一下,推荐一下《聊聊JVM的专栏》,网上关于JVM的文章太多,这个专栏希望能在已有的资料的基础上写出点新意,对一些重要的概念归纳总结,说说自己的观点、理解和实际开发中的经验等等,多多交流

2014-12-15 10:08:05 5623 1

聊聊锁的那些事

包括硬件,操作系统的一些核心概念 线程,进程的实现原理 锁的原理 各种自旋锁算法 Java synchronized内置锁的实现原理 Java并发包的多种同步工具类的实现原理

2015-09-22

深入理解Java内存模型

Agenda: •什么是Java内存模型JMM •内存可见性 •有序性 •指令重排序 •内存屏障 •顺序一致性与Happens-before规则 •volatile, synchronized, 原子变量,锁, final的原理

2015-09-22

数据系统实现

数据库原理的经典书籍,描述了数据库原理,对于想深入理解数据库的人员有很大的指导意义

2014-10-24

jsr133.pdf

Java内存模型JSR官方文档,定义了Java内存模型的概念模型涉及到的所有方面,对理解JMM有很大的帮助

2014-10-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除