从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 ......

top命令使用说明

1. 介绍

top命令是一个比较常用的LINUX命令。本文对其使用做简单介绍。

2. 内容理解

一个典型的top视图如下:

第一行

18:25:43 up # 系统当前时间

121 days # 系统运行时间

1 users # 系统当前登录用户数......

kafka producer性能调优

1. 介绍

原文来自linkedin的一篇PPTproducer-performance-tuning-for-apache-kafka。

2. 本文的一些前提

讨论的kafka版本为0.10.0

没有broker端的再压缩

消息都有8字节的时间戳介绍信息

3. 优化目标

给定一个要发送的数据集,在满足持久性、有序性的前提下优化以下两点:

吞吐量

延迟

优化专注于优化平均性能,这样对所有的producer都有效。

4. kafka producer原理回顾

4.1 生产者的关键配置

batch.size: 基于大小的batching策略

linger.ms: 基于......

网络通讯之长连接、长轮询、短轮询理解

1. 介绍

标题中几个关键字在平常经常见到。本文小作总结。注意本文讨论的轮询均指网络通信中的“轮询”,请区别下CPU轮询。

2. 长连接

2.1 介绍

一般我们说长连接,主要描述的对象是一个TCP请求连接。当一个TCP通道一直保持着连接状态,即称这个连接为长连接。现在的HTTP1.1协议都使用的长连接,可以看到http报文5头部的connection为keep-alive,即为长连接。使用长连接和不使用长连接的效果对比下图:

优点:节约频繁创建连接的开销......

http协议和websocket协议的区别

1. 介绍

websocket和http都属于应用层协议,网络层都基于TCP协议。

PS:

虽然TCP协议是全双工的协议,但是应用层不一定是全双工的(看具体实现)

websocket和socket是两个东西:Socket是一个针对TCP和UDP编程的接口。应用程序通过它来发送和接收数据,借助它建立TCP连接等等。这里需要重点说明的,socket不是一个协议,只是一个编程接口。当然,websocket也用到了socket接口来实现其协议。

2. websocket

websocket的特点主要如下:

全双工协议:http协议基于请求应答,现在只能做单向传输,是半双工协议;web......

zookeeper vs Eureka

1.介绍

现在提到做服务发现、分布式协调同步可以想到很多工具:zookeeper、eureka、etcd、Consul(直接集成了服务发现的系统,不用自己实现)等等。很多时候选择哪一个,关键是看对CAP的选择。

本篇主要简单讨论下zk和eureka这两个。

2. 关于服务发现

根据 服务发现方案梳理及NetflixEureka简介一文可知,做分布式下的服务发现还是使用eureka更好,也就是AP特性的分布式协调工具。

在我们的讨论中, zk就是CP类工具......

zookeeper滚动日志设置

1. 介绍

默认启动ZK会有一个zookeeper.out作为ZK日志输出的地方。时间久了就会形成一个非常大的文件,也不利于查看日志。所以这里说下如何设置ZK的滚动日志。

2. 设置滚动日志

2.1 修改/bin/zkEnv.sh

配置ZOO_LOG_DIR的环境变量,ZOO_LOG_DIR是zookeeper日志输出目录,ZOO_LOG4J_PROP是log4j日志输出的配置:

if [ "x${ZOO_LOG_DIR}" = "x" ]

then

ZOO_LOG_DIR="/home/appadmin/zookeeper-3......

java中的future和completableFuture区别

1. 介绍

java自带的实现任务异步执行的API主要就是future和completableFuture。这里简单介绍下。

2. future

future是JAVA5就引入的。主要是创建一个线程池,然后提交Runnable或者Callable的任务。然后可以用get来获取返回结果(执行完毕才会返回)

优点:一定程度上让一个线程池内的任务异步执行了

缺点:回调无法放到与任务不同的线程中执行。传统回调最大的问题就是不能将控制流分离到不同的事件处理器中。例如主线程等待各个异步执行的线程返回的结果来做下一步操作,则必须阻塞在future.get()的地方等待结果返回。这时候又变成同步了。

......

kafka集群间的数据同步和数据转移

1. 介绍

有时候需要跨集群之间的数据同步和数据迁移的需求。这个可以利用官方提供的工具:官方文档的6.1 Basic Kafka Operations

2. 原理说明

这个工具就是启动了一个消费者从源集群消费数据,然后交给一个生产者往目标集群发送消息。

3.使用技巧以及注意点

3.1 使用技巧

开启多个mirror maker进程:mirror maker进程可以同时开启多个,提高吞吐量。如果其中一个进程挂了,其他线程还能接管其同步任务。

3.2 ......

基于idea的golang开发环境搭建

1. 介绍

golang优秀的开源项目挺多,抽点空也准备学习下golang。这里就简单介绍下如何用idea搭建golang开发环境

2. 基本准备

2.1 go

到go官网下载最新的安装包安装。解压后配置下环境变量GOPATH(工作目录)和GOROOT(GO的安装目录)

我的配置是这样的:

GOPATH=C:\Go\

GOROOT=C:\GoProjects;C:\GoProjects\src\docker;C:\GoProjects\src\learning

关于GOROOT的设置可以看下第三节的“项目组织”

2.2 idea

idea安装go插件。这个搜索下插件安装即可。......

设置代理解决Git、IDEA、GO get等各种下载问题

1. 介绍

作为中国程序员,总没法避免要使用科学上网。有些小伙伴已经成功科学上网,但是仍然在使用git clone、idea下载插件或者go get的时候没法成功下载。本篇就简单以3个例子来介绍下如何配置代理来解决下载问题。

我们不讲解如何科学上网,所以前提是你已经弄好了ss。我这边的SS本地端口是1080。

2. git

git config –global http.proxy “127.0.0.1:1080”

git config –global https.proxy “127.0.0.1:1080”

然后可以愉快使用git clone了

3. IDEA

ctrl+alt......

kafka集群YGC问题排查

1. 介绍

最近kafka集群总是有偶发的YGC问题。今天上午花了点时间好好研究了下。

2. 现状

我们的kafka集群用的是kafka官方的推荐配置。server配置参考kafka官方文档第六章来配置。另外我们的硬件环境比Linkedin用的机器还好点,40核,60G内存。

3. YGC问题回顾

YGC出问题后可以查看下kafka服务器上的GC日志,在KAFKA_HOME/logs/kafkaServer-gc.log

可以看到GC日志:

主要信息是:

......

spark streaming消费kafka消息的两种方式对比

1. 介绍

spark streaming去消费kafka消息相信是一种比较常见的情景。一般来说获取kafka消息的spark streaming流有以下两种:

基于Receiver的流(传统老方法)

Direct Stream(推荐的新方法)

本文主要参考官方文档Spark Streaming + Kafka Integration Guide (Kafka broker version 0.8.2.1 or higher)和Spark Streaming + Kafka Integration Guide (Kafka broker version 0.10.0 or highe......