Night Field's Blog

Make it work, make it right, make it fast.

优化 maven 依赖实践

背景 Maven 是非常优秀的项目管理工具,我们可以方便地在 pom 文件里配置 Java 工程的依赖。但是随着项目的迭代和时间推移,pom 文件在新老需求的不断增删改之下变得越来越臃肿,到后来连自己都不知道哪些是有效依赖。 下面将简单介绍如何用 Maven 插件 maven dependency plugin 来解决这个问题。 maven dependency plugin maven...

漫谈zookeeper watcher单次触发特性

架构师 Hooya 正带领着他的团队着手开发一款高性能分布式协调工具,暂名 zookeeper。 Hooya开场白:同学们,作为一个分布式协调软件,通知功能是必不可少的。今天我们来 brainstorm 一下如何设计咱 zookeeper 的通知机制吧。 攻城狮小A抢先道:这简单呀,不就是实现一个大号的观察者模式嘛,Client 注册 watcher,Server 在数据改动的时候通知 ...

zookeeper的watcher是一次性的吗

zookeeper zookeeper 是流行的高性能分布式协调工具,它提供了分布式环境中需要的命名服务,配置管理,分布式锁,注册中心,Leader 选举等等功能,应用十分广泛。 zookeeper 的 watcher Client 可以在 zookeeper 的节点(znode)上设置监听器(watcher),当节点被修改时,zookeeper 会向客户端发送一个相应的通知。 可以通过 ...

漫谈分布式

前言 互联网时代,分布式是一个绕不过去的话题。本文将谈谈个人对分布式的理解。 何为分布式 维基百科上对分布式系统(Distributed System)的定义如下: A distributed system is a system whose components are located on different networked computers, which commun...

Connection Timeout 问题排查

背景 我们组开发维护了一个 Agent 工程,帮客户采集一些客户有用的网络数据。客户需要下载一个 MSI,然后安装并注册。 问题描述 某个客户下载安装 Agent 之后,提示注册失败。其实 Agent 注册就是一个用户登陆验证服务,然后创建一个 Machine ID 的过程。所谓 Machine ID,就跟用户帐号一样,是 Agent 的一个唯一标识。注册的流程大致如下: 注册的主...

MyBatis内置DataSource连接池实现原理

前言 MyBatis是一个流行的ORM框架,它简单易用,支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。 作为一款优秀的持久层框架,连接池是必不可少的。本文将分析MyBatis内置的数据源是如何实现连接池功能的(源码基于MyBatis3.4.5)。 JDBC对数据库的操作 回忆一下,我们用原生的JDBC来操作数据库的一般...

Redis的键过期策略以及内存淘汰策略

Redis Redis是高性能的基于内存的NoSQL数据库。因为内存是比较宝贵的资源,无法无限制使用,所以Redis提供了: 键过期策略来防止内存饱和。 内存淘汰策略来使得内存饱和之后继续对外提供服务。 内存过期策略 expire命令 Redis提供了expire命令来给一个键(key)设置过期时间: 1 2 3 4 5 6 redis> SET foo "bar" "...

Hotspot早期的垃圾收集器简介

前言 很多人的博文里面会提到JVM三种垃圾收集器:串行,并行和并发。这么分类也不能说错,但事实上也没有这么简单。本文简要介绍Hotspot早期的垃圾收集器(Garbage Collector)。 名词解释 年轻代和老年代:JVM中不同的对象,生命周期是不同的。比如线程中的临时变量,在方法结束之后便会被销毁;而静态变量,则会一直存在直到其所对应的类被销毁为止。基于这样的事实,才有了...

记一次由Netty的ChannelPool导致内存泄漏的排查经历

背景 接到了线上机器的报警,登上服务器,发现是Java进程挂了,看日志报了OOM: 1 java.lang.OutOfMemoryError: Java heap space 问题描述 内存溢出,那当然是看dump文件了。这里推荐大家在产线机器上都加上JVM参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={path}/{to}/{...

自定义Classloader导致ClassCastException

背景 1 java.lang.ClassCastException: cn.com.nightfield.Plugin cannot be cast to cn.com.nightfield.Plugin 相同的class,竟然不能cast?这是什么鬼? 问题描述 自定义类加载器(Classloader)是很常见的,它可以让我们从自定义的文件系统目录,网络甚至是数据库的各种文件类型(...