正向代理和反向代理理解

1. 正向代理

正向代理:隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求。一般正向代理都需要客户端做一些额外的配置,指定需要将请求发送给哪个代理服务器。这个过程中注意,客户端是知道请求发送给了代理,由代理再去负责使用该请求访问特定的服务器。

例子:科学上网工具SS就可以理解为正向代理。客户端都要安装SS配置后才能使用正向代理。

作用:

通过代理服务器可以访问一些原本受限无法访问的服务器。

缓存,加速资源访问

客户端访问授权,上网认证

代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

2. 反向代理

反向代理:隐藏了真实的......

第5章:索引和算法

本章是mysql技术内幕这本书的读书笔记。可以点击超链接查看所有的读书笔记。

1. B+树与索引

B+树就是指一个多路平衡树,只不过记录都存放在叶子节点,其他节点都是索引节点。

1.1 B+树插入

扇出的值是固定的。在数据库里面B+树索引的层数一般都比较低,位2-4层,这样经过2-4次IO就可以取到数据。

推荐看下书上p188-p199的例子,演示了B+树上插入操作的进行过程。B+树插入操作分情况主要依据叶子节点和索引节点是否插满了数据。

对于插入操作注意以下知识点:

优先进行树的旋转避免插入时的页拆分。在某个叶子节点满,但是其兄弟节点没有满的情况下优先进行树的旋转(其实就是移......

JAVA的堆内存储VS堆外存储

1. 介绍

在很多JAVA实现的产品中我们都可以看到JVM的off heap内存空间的使用。例如kafka、ignite、alluxio等等。这说明OS管理内存是有好处的,例如可以利用os page cache来改进IO性能。

今天看到一篇PPT似乎不错,打算学习下。PPT原文见:On heap cache vs off-heap cache

2. heap上对象的开销

3. JAVA中分配堆外空间的方法

3.1 java.nio.ByteBuffer

......

分布式全局自增ID

1. 全局自增ID啥用?

MQ有序消费

MVCC实现

分表分库场景

more...

2. 生产全局唯一ID方法

2.1 数据库自增ID

当服务使用的数据库只有单库单表时,可以利用数据库的auto_increment来生成全局唯一递增ID.

优势:

简单,无需程序任何附加操作

保持定长的增量

在单表中能保持唯一性

劣势:

高并发下性能不佳,主键产生的性能上限是数据库服务器单机的上限。

水平扩展困难,在分布式数据库环境下,无法保证唯一性。

2.2 UUID

一般的语言中会自带UUID的实现,比如Java中UUID方式UUID.randomUUID().toStri......

BlockingQueue浅析

1. Queue分类

1.1 BlockingQueue

BlockingQueue是并发包里阻塞队列的一个接口。主要有(针对JDK1.8版本)如下几种(下面的ConcurrentLinkedQueue和LinkedTransferQueue不是阻塞队列哦。):

队列

有界性

数据结构

ArrayBlockingQueue

bounded

加锁

array list

LinkedBlockingQueue

optionally-bounded

加锁

linked list

PriorityBlockingQueue

unbounded

加锁

heap

Delay......

聊聊JAVA的线程池

1. 介绍

并发包提供了几种不同类型的线程池。今天我们来更加仔细地看看其实现原理。下面的分析适用于JDK1.7

2. 类分析

类的结构如下:

2.1 池分类

通过ThreadPoolExecutor创建的池: 例如Fixed pool 、Cached pool和singleThread等线程池。在1.8中还引入了WorkStealingPool这个基于ForkJoinPool里面窃取工作算法的线程池,可以关注下。

通过ScheduledThreadPoolExe......

Kafka和RocketMQ的一点对比总结

1. 介绍

Kafka和RcoketMQ是市面上比较主流的分布式消息队列。本文对他们做一番对比。如果对MQ还不是很熟悉的,可以先看看他们的文档,再来看本文。

2. MQ系统的关键问题——如何处理消息有序、消息重复

2.1 消息有序

Kafka和RocketMQ都不支持严格的消息有序。他们都仅仅保证在一个topic分区(队列)中是有序的。当然如果只使用一个分区或者队列来提供消费,性能肯定是比较差的了。

十分钟入门RocketMQ里面说RocketMQ支持严格消息有序。我觉得可能是指的生产者把消息发往一个队列中。 如果是这样的话,不能算是MQ的严格有序,因为牺牲了太多性能。后续再看看源码......

canal设计上的一些小分析

1. 介绍

canal是阿里开源的一个binlog解析工具。本文对其设计上的一些小细节进行一番琢磨。

如果还不熟悉canal可以看看canal官方wiki和我写的canal源码解析系列。然后再看我现在这篇文章,可能会有更多的共鸣。

2. binlog解析原理的小思考

按照wiki所说,从上层来看,复制分成三步:

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);

slave将master的binary log events拷贝到它的中继日志(relay......

再来理解下ThreadLocal类

1. 什么是ThreadLocal类

JDK官方文档对其定义如下:

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically pri......

缓存雪崩和缓存击穿

1. 缓存击穿(穿透)

1.1 定义

缓存穿透: 查询一个在缓存内必然不存在的数据。例如查询一篇文章的ID,这个ID在缓存和DB里面都是必然不存在的。如果类似这样的查询请求特别多,就会给DB带来很大的压力。

1.2 解决

使用BITMAP来过滤:最常见的则是采用布隆过滤器(bloom filter),将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。在JAVA里面使用布隆过滤器,可以使用guava里面的bloomFilter。如果需要基本的bitmap数据结构,可以使用util下面的BitSe......

mysql性能分析方法、工具、经验总结

1. 介绍

MYSQL的性能瓶颈分析一般从两个维度去排查:

操作系统层面: 这个可以利用vmstat、iostat等工具查看OS本身在CPU、磁盘、内存上的瓶颈。提前利用一些mysqlslap这种工具做一些benchmark避免硬件资源设计部合理。

MySQL本身使用不当导致的性能瓶颈(索引问题、SQL语句问题、配置问题等等)。

PS: 我这里实验用的都是5.7版本的

2. 查询与索引优化

2.1 状态检查

我们可以通过show命令查看MySQL状态及变量,找到系统的瓶颈:

#显示状态信息(扩展show status like ‘XXX’)

Mysql> show sta......

ForkJoinPool解读

1. 介绍

JDK1.7在并发包里面引入了这个玩意儿。根据 Doug Lea 的论文——《A Java Fork/Join Framework》而来。主要通过分而治之(把大任务分割成若干个小任务)然后合并结果这种思想来实现的线程池。有更加好的并发性能。之所以有更好的并发性能,是因为其充分利用了所有线程的工作能力,避免空闲线程,充分发挥多核并行的处理能力。这个关键是后面的working stealing算法。

此外强烈推荐下Java7中的ForkJoin并发框架初探(中)这个系列的文章,作为我这篇文章的补充阅读吧。写的很好。

PS: 本文的介绍主要以JDK1.7版本为例

2. Fork......

从Runnable到Callable谈到ExecutorServer的submit方法和execute方法

1. 介绍Runnable和Callable

创建线程类一般使用的方式有三种:

继承Thread调用start方法

实现Runnable接口调用run方法

实现Callable接口调用call方法

如今,第一种方式肯定是差不多淘汰了。因为用继承约束很大。

关于使用Runnable和Callable接口的异同在StackoverFlow的一篇帖子The difference between the Runnable and Callable interfaces in Java中说的比较清楚。

主要区别就是:

Runnable能做得,Callable都能做。但是Callable......

第五章:调优案例分析与实战

本文是深入理解Java虚拟机-读书笔记系列的文章,查看所有文章目录可以点击该超链接查看。

1. 高性能硬件上的程序部署策略

一个PV比较大的网站,有时候长时间失去响应,这是由于GC造成。JVM默认使用PS这种吞吐量优先收集器,一次full GC停顿高达14秒。程序设计导致大量较大的文档数据驻留在内存。

心得:如果full GC比较少、绝大多数对象的存活时间都比较短,才建议使用较大的堆。否则GC的开销会比较大,有较长的时间停顿。

2. 集群间同步导致的内存溢出

由于集群同步大量数据,导致数据过多,而超过内存限制。

心得:

发生OOM的时候自动生成堆dump文件可以加参数: -XX......

第四章:虚拟机性能监控与故障处理工具

本文是深入理解Java虚拟机-读书笔记系列的文章,查看所有文章目录可以点击该超链接查看。

这部分的内容之前我有文章写过了,具体可以查看:

JVM调优排错工具jps、jstack、jmap、jhat、jstat、jvisualvm等的使用

PS: jhat在JAVA9中要被移除,该命令的功能可以用其他命令代替,所以可以不用看了。

关于《深入理解Java虚拟机》的书中第四章,以下内容可以了解下:

HSDIS反汇编插件: 工具下载的话可以去HLLVM看看,具体用法可以参考书上的P112-P114的内容

书上没有详细写thread dump和heap dump如何操作分析,不过这个自己还是要......

谈谈kafka的exactly once

1. 介绍

今天在复习kafka的一些知识。然后又对消息分发的语义进行了一番思考,还与小伙伴好好讨论了一番。这里小做总结。

2. mq如何做exactly once

要满足exactly once需要同时满足:

发送消息阶段,不允许发送重复的消息。

消费消息阶段,不允许消费重复的消息。

这个是文章十分钟入门RocketMQ里面写到的。

2.1 发送者如何保证不发送重复消息

在mq系统中,不采用重发策略(前提网络是完美的。。否则会丢消息,不符合整个系统是exactly once)

业务本身确保不发送重复的消息

2.2 消费者如何保证不重复消费

这里的不重复消费,主要指处......

kafka压力测试

1. 介绍

最近kafka集群要换机房了。为了确保新环境正常,我们来做一些压力测试。这次压力测试重点会关注一些异常情况下,kafka收发消息的状况。

2. 基本信息

3台broker,使用kafka0.10.1版本,每台broker使用6T硬盘,内存100G。broker配置按照官方文档推荐的生产配置来配置。

3. broker挂掉的情况

3.1 整个broker集群挂掉

这个同事做过测试,所以这里直接放结论了:

即使设置了acks=all,但是如果整个集群都连接不上了,也是不能避免消息丢失的(重发次数到了设定的值,或者发送请求超时了都会导致生产者丢弃该条消息,发送下一条消息)。重......

JAVA后端问题定位和排错

1. 介绍

原本打算自己总结一下的。但是觉得人家总结的很好,我这里就不浪费笔墨了,给大家推荐一下文章即可。

linux后端诊断与调试技术

PPT-JVM问题定位和排错

下面我对文章中可以重点关注的一些点做一下强调。大家看的时候可以留意下。

2. 查找JAVA进程中消耗CPU最多的线程

这个问题大家可能经常碰到。传统的做法是:

top命令找出有问题Java进程及线程id:

a. 开启线程显示模式(shift+h)

b. 按CPU使用率排序(shift+p,如果按照内存排就shift+m)

c. 记下Java进程id及其CPU高的线程id

用进程id作为参数,jstack有问题的......

sed和awk命令浅析

1. 介绍

这两个命令在使用Linux的过程中比较常用,这里小做总结,对其核心用法进行记录。

2. sed

sed命令主要用于对行的处理。可以对制定的行进行编辑(增加删除内容)、替换。

2.1 基本使用说明

其man文件的说明如下:

[root@www ~]# sed [-nefr] [动作]

选项与参数:

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e :直接在命令列模式上进行 sed 的动作编辑;

-f :直接将 sed......

聊聊一致性哈希

其实,这次主要不是我聊。而是推荐一篇知乎专栏的文章:聊聊一致性哈希

我这里就简单讲下一致性哈希应该明白的几个重点:

使用一致性哈希可以避免重新计算分布(分布式多节点场景下,重新分布代价可是很大的);

使用一致性哈希可以让分布式系统无锁化、无状态化(通过引入虚拟桶来避免哈希碰撞;HASH到哪里都确定了,一人一个坑)

跳表(logN)来改进HASH到桶的时间复杂度。(PS: 普通的HASH算法,都是常量时间)

环状来保证顺利找到要HASH的桶

防止雪崩效应。采用一致性哈希,如果一个节点由于压力太大挂了,不会发生大量数据HASH到下一个节点上,引起压力。如果按照原来的哈希方式,可能下一个节......

第3章:docker核心原理解读

1. Docker背后的内核知识

用一句话来概括docker的实现原理即:docker通过namespace实现了资源隔离,通过cgroup实现了资源限制,通过写时复制机制(copy-on-wirite)实现了高效的文件操作。

接下来我们更加细致的来看看原理细节。

2. namespace资源隔离

做资源隔离主要涉及6项隔离。linux内核中6种namespace隔离的系统调用如下:

Namespace

系统调用参数

隔离内容

UTS

CLONE_NEWUTS

主机名与域名

IPC

CLONE_NEWIPC

信号量、消息队列和共享内存

PID

CLONE_NEWPI......

netty4中的InboundHandler和OutboundHandler的执行顺序

1. 介绍

netty4的基本原理这里不再赘述。感兴趣的可以从CSDN下载netty in action的内容学习一下基础原理。

本节主要讨论InboundHandler和OutboundHandler的理解。

2. 术语回顾

2.1 基本术语

Channel和ChannelPipeline: 一个Channel对应一个ChannelPipeline。Channel代表一个传输通道,ChannelPipeline是ChannelHandler的容器

ChannelHandler: 用于对数据进行处理,其子类细分为ChannelInboundHandler和ChannelOutbou......

开源序列化框架google prorobuf3使用

1. 介绍

protobuf是一种非常流行的开源序列化框架。在很多开源软件中被广泛应用。例如netty4中就有protobuf的编码器。

本节主要参考propobuf官方文档和Language Guide (proto3)来对该序列化框架的JAVA中的使用做一些介绍。

2. protobuf3新特性

在Protocol Buffers v3.0.0 release note中我们可以看看protobuf3的新特性:

2.1 主要新特性

移除了required域和用户自定义默认值(类似[default = 1.0]这样的选项没有了)

移除了unknown域

移除了extension......

kafka问题收集

1. 介绍

本文记录一些kafka生产使用的一些问题。

org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed due to group rebalance

原因分析: consumer进行poll的时候耗时太久,导致发送hearbeat间隔太长,coordinator认为consumer死了,就发生了rebalance

解决方案:Kafka CommitFailedException consumer exception

Marking the coordinator......

gradle安装使用

1. 介绍

有些开源项目用gradle来构建的,所以也稍微学习下怎么用吧。

2. 安装使用

到[gradle官方]下载,然后安装好设置下环境变量PATH和GRADLE_HOME

然后用gradle -version看看是否安装好了

3. 构建项目

这里假设我们需要构建的开源项目为hystrix。从github clone之后。我们打开其目录,发现有build.gradle文件(类似maven的pom文件)

使用Hystrix完成熔断、限流和降级

1. 介绍

为了保证系统不被突发流量击垮,进行容量保障是十分有必要的。从架构的稳定性角度看,在有限资源的情况下,所能提供的单位时间服务能力也是有限的。假如超过承受能力,可能会带来整个服务的停顿,应用的Crash,进而可能将风险传递给服务调用方造成整个系统的服务能力丧失,进而引发雪崩。另外,根据排队理论,具有延迟的服务随着请求量的不断提升,其平均响应时间也会迅速提升,为了保证服务的SLA,有必要控制单位时间的请求量。这就是限流为什么愈发重要的原因。

本文主要讨论内容为:

解决容量保障(雪崩效应)问题的三大方法——熔断、限流和降级相关的概念

Hystrix的基本原理

2. 雪崩效应

......

阿里双11背后的技术

1. 介绍

近期阿里出了一本电子书阿里双11背后的技术

本文仅做下目录的记录,对某些章节感兴趣的同学可以直接点击链接访问查看。

PS: 有些章节需要登入后才能查看

第一章 基础设施

1.1 万亿交易量级下的秒级监控

1.2 双11背后基础设施软硬结合实践创新

1.3 阿里视频云ApsaraVideo是怎样让4000万人同时狂欢的

第二章 存储

2.1 数据库优化之路

2.2 AliCloudDB--双11商家后台数据库的基石

第三章 中间件

3.1 万亿级数据洪峰下的分布式消息引擎

第四章 电商云化

4.1 17.5W秒级交易峰值下的混合云弹性架构之路

4.2 集团Ali......

使用阿里云的maven仓库加速依赖下载

之前一直用的公司的maven仓库,但是有些新的开源依赖总是下载不到。但是maven的官方仓库在国内实在太慢了。近期随便网上搜索下,发现原来有阿里的maven仓库,真是可喜可贺啊。

打开自己的maven配置文件 setting.xml,添加如下内容吧:

<mirror>

<id>nexus-aliyun</id>

<mirrorOf>*</mirrorOf>

<name>Nexus aliyun</name>

<url>http:......

github的star项目管理

1. 介绍

作为一名开源爱好者,平时关注了不少在github上的项目。但是很坑爹的是,github没有推出相关功能来方便star项目的管理。事实上这个需求还是蛮多的。不过幸运的是,我们有第三方的工具可以使用。今天就推荐个工具astral

2. 使用介绍

进入首页,点击注册,并且在github上授权。然后就可以方便的使用了。

Linux常用命令个人收集

1. 介绍

本文记录一些个人常用的Linux命令

2. 文件系统

df -T #T选项查看文件系统

ls | grep -v keep | xargs rm #删除keep文件之外的所有文件,其中-v表示过滤含有keep字符的行

du -sh * | sort -nr | head -10 #显示前十个占用空间最大的文件或目录

dd if=/dev/urandom bs=64M count=48 of=3G.txt # 生成3G随机文件

3. 进程和线程

cat /proc/173570/environ |tr ......