欧阳亮的博客

编程不止是一份工作,还是一种乐趣!!!

图解Java字节码

 

阅读全文

Flink Fault Tolerance Mechanism

Introduction

阅读全文

Flink Distributed Runtime

The Flink runtime consists of two types of processes:

阅读全文

如何设计一个状态机

阅读全文

基于Java Agent与Javassist实现零侵入AOP

Java SE 5引入了一个静态Instrument的概念,利用它我们可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在JVM上的程序,可以在程序启动前修改类的定义。有了这样的功能,我们就可以实现更为灵活的运行时虚拟机监控和Java类操作了,这样的特性实际上提供了一种虚拟机级别支持的AOP实现方式,使得开发者无需对应用程序做任何升级和改动,就可以实现某些AOP的功能了。

阅读全文

Git笔记

前前后后看了Git好多遍,一段时间不用又忘了,年纪大了记性不好,还是写点笔记^_^

阅读全文

基于Kafka实现事件驱动架构

事件驱动是一种灵活的系统设计方法,在事件驱动的系统中,当数据发生变化时系统会产生、发布一个对应的事件,其它对这个事件感兴趣的部分会接收到通知,并进行相应的处理。事件驱动设计最大的好处在我看来有两点:一是它为系统提供了很好的扩展能力,比如我们可以对某类事件增加一个订阅者来对系统进行扩展,最主要的是我们并不需要修改任何已有的代码,它完全符合开闭原则;二是它实现了模块间的低偶合,系统间各个部分不是强依赖关系,而是通过事件把整个系统串联起来。

阅读全文

线上服务CPU100%问题快速定位

步骤一:找到最耗CPU的进程

阅读全文

《微服务架构》:限流

限流是微服务架构下保障系统的主要手段之一。通常来说系统的吞吐量是可以提前预测的,当请求量超过预期的伐值时可以采取一些限制措施来保障系统的稳定运行,比如延迟处理、拒绝服务等。

阅读全文

《微服务架构》:线程隔离

隔离是指将系统或资源分开,系统隔离是为了在系统发生故障时,能限定传播范围和影响范围,防止出现雪崩效应,从而保证在故障发生时只是部分服务不可用。微服务架构下,常见的隔离方式有线程隔离、进程隔离、集群隔离、机房隔离、动静隔离、读写分离、热点隔离等。本文主要讲解线程隔离,主要是指线程池隔离,在应用内部把请求进行分类,然后交给不同的线程池处理。当某个服务发生问题时,不会将故障扩散到其他线程池,从而保证其他服务的可用性。

阅读全文

《微服务架构》:服务粒度

微服务架构下,总是会有人问:服务最好应该切分到什么粒度?类似的问题还有:我们的程序应该拆分为多少个才合适?这类问题永远没有一个标准的正确答案,我们需要基于业务、可用性、弹性和成本等方面做一些综合的权衡,才能决定系统是否应该被组合成一个大而整的应用,还是拆分成多个小服务。过份的拆分可能会导致高额的成本和低微的回报。

阅读全文

Tomcat的acceptCount与maxConnections

在使用tomcat时,经常会遇到连接数、线程数之类的配置问题,也偶尔遇到如connection timeout、read Timeout、connection reset by peer等错误,我们知道肯定是链接出了问题,但是为什么出问题?这些错误之间有什么不同呢?Tomcat中涉及并发的参数,如maxThreads、maxConnections、acceptCount等,他们代表什么意思呢?

阅读全文

JIT即时编译

我们都知道,执行java程序需要通过javac将程序源代码编译成class字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。由于解释器在解释执行的过程中,每次只能看到一行代码,所以很难生成高效指令序列;而编译器可以事先看到所有代码,因此,一般来说,解释性代码比编译性代码要慢。为了提高Java程序的执行速度,引入了JIT技术。

阅读全文

架构设计原则

如果一个技术已经存在2年,比如现在很火的前端技术react和vue等,那么我们能预估这个技术大致还有2年的生命期,再久就不确定了;如果一个架构或设计原则已经存在15年,例如单一职责和依赖倒置原则,我可以预期它还有15年甚至更久的生命期。原则比具体技术更抽象,更接近事物本质,也更经得起时间考验的东西。这些原则沉淀在架构师的脑海中,最终内化成他的思维模式,以潜意识方式影响和指导他的架构和设计工作。

阅读全文

Kafka深度解析

Kafka简介

阅读全文

Markdown使用LaTex输入数学公式

插入数学公式的方法

阅读全文

HBase简介

HBase是一个建立在Hadoop之上的高可靠、高性能、面向列、可伸缩的分布式存储系统,可以存储海量数据并对海量数据进行检索。利用HBase技术可在廉价PC上搭建起大规模结构化存储集群。HBase使用HDFS作为底层文件存储系统,在其上可以运行MapReduce任务批量处理数据。

阅读全文

G1收集器

G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用。作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信熟悉JVM的同学们都不会对它感到陌生。在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248)。在官网中,是这样描述G1的:

阅读全文

常用JVM参数

GC日志类

阅读全文

Java常用命令行工具

查看java进程

阅读全文

MapReduce简介

Hadoop的框架最核心的设计就是HDFS和MapReduce。前面我们已经介绍过HDFS是一个分布式的文件系统,为海量的数据提供了存储能力;MapReduce建立在HDFS基础上,为海量的数据提供了一个计算框架。MapReduce是一种分布式计算模型,是Google提出的,主要用于搜索领域,解决海量数据的计算问题。MR由两个阶段组成:Map和Reduce,用户只需实现map()和reduce()两个函数,即可实现分布式计算。

阅读全文

HDFS简介

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的硬件上;而且它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算框架。

阅读全文

linux netstat命令查询端口占用情况及连接数

Netstat命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

阅读全文

Thrift java入门

Thrift是一个RPC框架,由facebook开发,07年四月开放源码,08年5月进入Apache孵化器。它支持可扩展且跨语言的服务的开发,它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk and OCaml等等编程语言间无缝结合的、高效的服务。Thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

阅读全文

Storm深入浅出之部署篇

《Storm深入浅出之入门篇》文章中我介绍过Storm的并发机制,本文我们来学习下Storm集群环境由哪些部分组成,各个部分所承担的角色。最后我们再实际操作搭建一个Storm集群。

阅读全文

Storm深入浅出之高级篇

前面一篇文章《Storm深入浅出之入门篇》我们介绍了Storm的基本概念、并发性。另外我们还实现了一个简单的单词计数的例子,虽然例子很简单,但还是需要为每一个组件(Spout与Bolt)都开发一个类。对于比较复杂的业务场景来说,Storm的开发工作量可能会变得很高,另外At least once的语义保证级别对于一些关键业务场景来说是不够的。为此Storm提供了更高级别的抽象:Trident,它实现了Exactly Once的语义保证级别,另外它还提供了流式风格的API,极大的简化了开发工作量。下面我们一步步解开它神秘的面纱。

阅读全文

Storm深入浅出之入门篇

Storm是一个简单的分布式流式计算系统,它提供了对数据流进行实时处理的能力。Storm之于流式处理就像Hadoop之于批处理计算一样,区别在于Hadoop Job最终会运行结束,而Storm会一直持续下去。在设计上Storm是非常简单的,搭建一个简单的入门Sample通常不会很难,但要深入掌握Storm的各个方面,还是需要下一翻功夫的。本文会比较长,我会由浅入深的介绍Storm的各个方面,耐心看完相信您一定会有所收获。

阅读全文

Thread Dump分析

通过jcmd -ljps -l命令得到进程的pid,再通过jstack ${pid} > threaddump.txt得到线程转储。

阅读全文

ssh免密登录

一、在客户端机器生成密钥(密钥放在.ssh目录)

阅读全文

cent os7静态IP设置

修改/etc/sysconfig/network-scripts/ifcfg-ens33文件:

阅读全文

centos笔记

该文用于记录本人日常维护和操作Cent OS时的点点滴滴。

阅读全文

cent os上安装java

安装openjdk

阅读全文

Kafka笔记

一、命令行操作

阅读全文

zookeeper集群部署

一、将zookeeper安装文件解压到/opt/local目录下面:

阅读全文

基于ZooKeeper的事件驱动设计

事件驱动在软件设计中是一种常见的方法,它有很多直观的优点。比如它的思想符合开闭原则,具有极好的可扩展性,提供更好的响应性,等等。观察者模式算得上是最简单的事件驱动设计了,但是直接使用它,也存在一些难以解决的问题。比如如何保证事件的顺序消费?在流量大的时候如何把系统的负载均衡到多个服务器?本文为大家介绍一种利用ZooKeeper实现的分布式事件驱动设计的实现。

阅读全文

分布式锁:ZooKeeper与Redis的区别

在分布式系统中,分布式锁的应用场景是非常广泛的。Redis和ZooKeeper是目前比较常见的实现方案,那它们之间有什么区别呢,我们应该如何选择?

阅读全文

基于ZooKeeper的分布式锁(二)

前一篇文章介绍了ZooKeeper实现简单的分布式锁算法,但是当并发量很高,锁冲突机率大的情况下这种算法会导致羊群效应。解决羊群问题的算法,其实Zookeeper官网就有:

阅读全文

基于ZooKeeper的分布式锁(一)

借助ZooKeeper的临时节点,很容易实现分布式锁。为了获得一个锁,客户端尝试创建一个znode节点,如果znode节点创建成功,就表示客户端获得了锁并可以继续执行临界区中的代码;如果znode节点创建失败,就监听znode节点的变化,并在检测到znode节点被删除时再次创建节点来获得锁。如果要实现一个非阻塞锁的话,当znode节点创建失败时,就直接返回失败而不是去监听。

阅读全文

基于单Redis节点的分布式锁

首先,Redis客户端为了获取锁,向Redis节点发送如下命令:

阅读全文

Redis缓存数据一致性

在互联网行业,使用缓存来提升应用的性能已经是一件非常常见的手段,但是如何保证缓存与数据库的一致性确不是一件容易的事。比如下面的场景都可会导致数据不一致性。

阅读全文

聊聊ActiveMQ

消息队列在互联网系统架构中一直是最关键的组件之一,起着举足轻重的作用,它:

阅读全文

2016上海站QCon大会参后感

一. 概要

阅读全文

JVM调优

工作这么多年,有过很多次通过JVM来分析和定位问题、调优生产服务器的性能的经历,却从来没有系统化的总结过JVM的调优过程。正好最近比较有些时间,系统化的总结一下多年积累下来的经验。

阅读全文

通过JVM定位和分析一次生产案例

早晨刚到公司,牛牛同学就走过来跟我说昨天上线的一个数据同步的功能有点问题,大概情况是一开始时执行得很好,然后越来越慢,过一会儿就报错了。

阅读全文

深入理解ThreadLocal

ThreadLocal类,字面含义是线程局部变量,它为多线程的并发问题提供了一种新的思路:当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。从线程的角度看,目标变量就象是线程的本地变量,这也是类名中Local所要表达的意思。

阅读全文

JVM内存区域学习笔记

工作中时常需要根据Java虚拟机的知识来分析问题,不赖相关的知识总是学了忘,忘了学,为了加深和巩固这块知识,特意把周志明老师《深入理解Java虚拟机:JVM高级特性与最佳实践》书中的知识记录下来,以供参考。

阅读全文

非阻塞算法CAS

在解决并发问题时,锁是最简单易解的方式,但是其代价也是最高的。在竞争的情况下系统的性能会因为加锁产生上下文切换与调度延迟而降低,而非竞争的情况下多余的加锁操作本身也会消耗掉一部分性能。

阅读全文

通过生产者消费者问题深入学习java多线程

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

阅读全文

深入理解ConcurrentHashMap

从名字就能看出来,ConcurrentHashMap是专门为并发场景而设计的,相比HashTable,ConcurrentHashMap采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于HashTable对整个Map加锁的设计,分段锁极大的提升了高并发环境下的处理能力。但同时,由于不是对整个Map加锁,也导致一些需要扫描整个Map的方法(如size)使用了特殊的实现,还有一些方法(比如clear)甚至放弃了对一致性的要求,ConcurrentHashMap是一弱一致性的。

阅读全文

HashMap原理

在阅读HashMap的原码之前,一直对它的原理感到好奇。HashMap是如何在以接近O(1)的时间复杂度来实现根据一个对象(key)定位到另一个对象(value)的。带着这样的疑问慢慢品味着原码,一步步解开HashMap神秘的面纱。

阅读全文

MySQL InnoDB锁机制

在我们的日常工作中,经常会遇到各种死锁的场景,有的死锁分析起来是比较容易的,比如同类型的事务并发引起的死锁;而不同类型事务并发引起的死锁,分析起来就不是那么容易了。系统化的了解数据库的加锁机制,不仅有助于对现有问题的分析,在设计阶段也能更好的把握系统的性能与复杂业务场景的解决方案。

阅读全文

MySQL InnoDB事务并发控制

1. 什么是事务

阅读全文