- 博客(41)
- 收藏
- 关注
原创 一次生产问题的排查---解决springboot集成dubbo并使用外部容器部署在应用重启出现dataSource has already close 异常
一、场景复现:1、生产环境在上线得时候,重启应用,出现如下报错2、使用技术栈 springboot 1.5.7 dubbo 2.6.1 druid 1.1.0 …二、问题分析 上面错误是说 拿到得数据库连接已经被关闭,这种情况一般是由于停机得时候应用里面还有请求在处理,而这些处理中得请求所需要得资源,比如依赖的某个bean已经被spring容器关闭。三、错误复现主要复现流程...
2019-05-24 17:02:58
4743
原创 深入浅出MYSQL索引实现机制
一、什么是索引 提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如 我们的某一个SQL查询语句响应很慢,你可能第一反应是 给这个SQL 加个索引吧,那么到底什么是索引昵,今天我们就来聊一下这个话题(本文以MYSQL 5.6 为例)。 索引是为了加速对表中数据的检索速度而创建的一种数据结构,索引是在存储引擎层实现的,在MYSQL里面,不同的存储引擎实现索引...
2019-04-11 23:07:16
530
2
原创 浅析MyBatis的工作原理
一、Mybatis是什么 myBatis是常见的Java数据库访问层框架,相比于传统的JDBC,Mybatis可以进行更为细致的SQL优化,减少查询字段、统一的SQL管理。二、Mybatis的原理 当我们使用mybatis的时候,通常需要配置一个xml文件,假如叫mybatis-config.xml文件,类似下面这样<?xml version="1.0"...
2019-03-30 23:36:05
536
原创 kafka提交异常org.apache.kafka.clients.consumer.CommitFailedException
一、背景 kafka使用版本为0.10.1.0,今天在测试kafkaConsumer的时候,代码如下public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "192.168.80.132:909...
2018-06-03 14:08:55
21710
原创 Springboot集成Rabbitmq实现延时消费,并实现可靠的消息处理
一、Rabbitmq简介1.1 rabbitmq 架构1.2 rabbitmq相关组件介绍exchange: 交换机,主要用来将生产者发送的消息路由给服务器中的队列。routing-key: 消息路由的key,生产者在将消息发到到exchange的时候,需要指定routing-key,这样exchange才知道将这条消息路由给哪些队列。message: 消息体,主要由消息头和消息body组成,消息...
2018-05-30 19:18:46
9766
87
原创 Kafka生产端源码分析之RecordAccmulator
一、RecordAccmulator分析 注意,当前使用的kafka版本是0.10.1.0。 在kafkaProducer发送消息的时候,其实它并不是直接和kafka server进行通信,而是将消息暂存在一个缓冲区里面,主线程通过send方法发送后就可以立即返回而无需阻塞,业务线程不断通过KafkaProducer.send方法将消息发送到RecordAcccmulat...
2018-04-09 14:43:36
1467
原创 深入分析KafkaProducer消息发送流程
一、Kafka生产者发送消息示例 注意:以下所用kafka版本为0.10.1.0 KafkaProducer是线程安全对象,建议可以将其封装成多线程共享一个实例,效率反而比多实例更高,在深入分析前,先简单看一个生产者生产消息的demo package com.tanjie.kafka;import java.util.List;import java.util.P...
2018-04-06 13:20:09
17780
3
原创 Kafka多线程生产消费
一、kafka生产者 kafka目前在0.9版本后采用java版本实现,生产者KafkaProducer是线程安全对象,所以我们建议KafkaProducer采用单例模式,多个线程共享一个实例 package com.kafka.singleton;import java.io.IOException;import java.io.InputStream;import j...
2018-03-20 10:00:35
7566
6
原创 Hdfs 架构浅析
导读:最近因工作需要,学习了下hdfs,将学习笔记分享出来,与大家共勉,也欢迎大家指正。一、HDFS的特点 1:一次写入,多次读取:HDFS适合一次写入多次读取的模式,不支持对文件系统进行大量的随机修改。简化数据一致性处理。 2:适合批量处理文件,不建议大量存储小文件,其更倾向于高吞吐而不是低延迟。 3:成本低廉,廉价的机器就可以组成一个大集群。二、HDFS的架构 ...
2018-03-20 09:54:34
593
原创 Hadoop NameNode 高可用实现源码分析
一、NameNode的单节点问题 在hadoop1.x版本中,我们知道HDFS架构中的NameNode节点存在单点问题,一旦NameNode节点宕机了,整个HDFS集群将不可用,因为NameNode保存了整个HDFS的元数据信息。不过在Hadoop2.x版本解决了单点问题,下面我们结合源代码来分析其具体实现。二、NameNode的高可用架构 先上一张图片(来源于网络) 从上图可...
2018-03-20 09:51:45
1646
原创 Jdk1.8版本Semaphore实现源码分析
一、Semaphore Semaphore,信号量,常用在限流的场景,一般用来构建一些对象池,资源池之类的,Semaphore用来管理一组许可,当没有许可时,线程阻塞等待其他线程用完后归还许可后阻塞的线程才能获取许可。Semaphore里面分为了公平和非公平模式,默认是非公平的。二、看个例子import java.util.concurrent.CountDownLatch;impor...
2018-03-09 13:57:44
439
原创 深入分析JAVA线程池的实现原理
一、前言 线程是属于稀缺资源,在应用中,如果频繁的创建销毁线程,势必会造成大量的CPU资源浪费,因此,合理的使用线程池不仅能加快任务处理速度还可以提高资源利用率,本篇主要基于JDK1.8来深入分析JAVA线程池的核心实现原理,由于能力有限,难免会有遗漏或错误的地方,欢迎读者指正。二、Exectors 在JAVA里面,主要是通过Exectors框架来提供了多种...
2018-03-09 13:57:24
338
原创 如何将多个java源文件打包成可执行jar包
一、背景 今天在开发中,遇到个问题,我们的应用依赖了一个第三方jar包,于是第三方开发人员就打了个包过来,刚开始一切正常,等开发完了准备放到服务器上跑的时候,启动服务报错了 这个错误以前遇到过,52.0表示是需要Jdk1.8运行的,而我的linux服务器上的jdk版本是1.7(不方便改),所以唯一的解决办法就是让第三方开发人员将java源文件给我自己打包(当然,...
2018-03-01 16:58:49
10682
原创 JAVA栈-实现字符串反转
一、需求分析 前段时间出去招聘,主要是面向大四学生,问的问题都比较基础,其中也问了一个在网上可以找见的题目,如何实现字符串反转,我发现很多同学都是有一定思路的,比如反向遍历,或者使用stringbuilder.reverse等都可以,然而这里我们要分享的是通过栈来实现。 栈是一种先进后出的数据结构,恰好可以用来实现对字符串的反转操作。二、代码实现 import jav...
2018-03-01 08:48:25
902
原创 设计模式之-观察者模式
一、观察者模式 JAVA设计模式有23种,平时工作中也使用了一些,比如单例,模板,策略,建造者等,但最近在学习zk过程中,发现zk提供的发布订阅功能和设计模式里面的观察者模式原理差不多,故顺便了解观察者模式是如何实现的,整体来说比较简单,一个被观察者,N个观察者,当被观察者的行为发生改变的时候,观察者能够监听到这个变化,从而做出相应的行为处理。二、代码实现 这里我们模拟实现一个这...
2018-03-01 08:47:24
494
原创 如何找到占用CPU最高的是哪一个线程
一、需求分析 经常听到朋友说他们线上CPU有时候突然飙升,想找到是哪个线程导致的,我相信他们肯定有自己的定位方法,今天我要分享的也仅仅是其中一种而已。二、如何定位 为了模拟这种现象,写一个程序,先看代码 public static void main(String[] args) { for(int i=1;i<=3;i++) { new Thr...
2018-03-01 08:46:33
2091
转载 深入探究JVM | 探秘 Metaspace
Java 8 彻底将永久代 (PermGen) 移除出了 HotSpot JVM,将其原有的数据迁移至 Java Heap 或 Metaspace。这一篇文章我们来总结一下Metaspace(元空间)的特性。如有错误,敬请指出,谢谢~引言:永久代为什么被移出HotSpot JVM了?在 HotSpot JVM 中,永久代中用于存放类和方法的元数据以及常量池,比如Class和Method。每当一个类...
2018-02-13 10:27:57
486
原创 flume自定义拦截器(Interceptor)拼接header和body信息
一、需求背景 最近项目有这样一个需求,分别采集不同应用不同机器上的日志,在做日志清洗后存入DB,数据库表字段需要存当前日志的来源,比如,来自于哪个项目,该项目的哪台机器,由于我们使用的是flume来做日志采集,故去翻flume的官网,发现有拦截器可以支持我的需求,一个是主机拦截器,可以在source之后配置,在header里面拼上ip信息,另一个是static拦截器,可以自定义key和...
2018-02-12 15:18:28
6325
1
原创 Storm集成Redis(使用redis的发布订阅功能)
一、需求分析 在上一篇中,我们搭建了一套实时日志分析平台,目前该平台的主要需求就是监测日志中是否含有某些敏感信息,对于不同的日志来源渠道,规则是不同的,有些是默认规则,有些是用户个性化需求,比如A系统,我的日志里面不允许出现hello这个单词,B系统我的日志里面不允许出现world这个单词,当用户新增了敏感信息后,要求应用能够近乎实时的更新其本地缓存(默认情况下,当storm启动的时候...
2018-02-08 15:43:06
3425
2
原创 使用flume-ng+kafka+storm+mysql 搭建实时日志处理平台
一、架构介绍 因为要采集的日志已经在线上,为了不侵入代码(主要也是其他产品不会因为我们搞这个日志监控而修改代码后重新上线),已经不能再规范日志化输出,也就是需要对老系统进行日志分析。对于不同的应用,不同的日志类型,比如nginx日志、tomcat日志、应用日志等都需要分别采集;调研了flume和Logstash,当然还有更轻量级的filebeta;最后选择了flume,有以下几个
2018-02-07 15:25:45
1598
1
原创 Zookeeper实现分布式互斥锁
一、分布式互斥锁 分布式锁主要用来在分布式系统中同步共享资源的访问,在zookeeper中,并没有像JAVA里一样有Synchronized或者是ReentrantLock机制来实现锁机制,但是在zookeeper中,实现起来更简单: 我们可以讲将zk的一个数据节点代表一个锁,当多个客户端同时调用create()节点创建节点的时候,zookeeper会保证只会有一个客户端创建
2018-02-05 08:25:00
826
原创 Zookeeper实现分布式屏障
一、分布式屏障 分布式barrier一般出现在类似这样的场景,某个任务最终的执行需要基于很多并行计算的子结果。二、zookeeper实现分布式屏障思路 某个node路径为"/queue_barrier",在该节点下有个子节点给子节点赋值为某个值,假设为10,当根路径"/queue_barrier"下的子节点个数为10时,则所有子进程都完成了任务
2018-02-02 20:24:37
440
原创 springboot集成disconf实现配置文件实时刷新
一、disconf介绍 disconf是百度的一个分布式配置中心,由于我们项目配置文件较多,都是properties文件,虽然也支持实时生效,但是没有一个可视化的WEB端用来管理(每次修改配置文件需要提上线流程上线修改),目前采用disconf来实现。二、springboot集成disconf 本篇只是一个入门,因为还在调研阶段,本篇
2018-02-02 20:17:53
11191
1
原创 springboot集成disconf配置文件下载路径问题
一、前言 最近因项目需要,准备入手研究百度开源的分布式配置中心disconf,在涉及到配置文件下载路径的时候,发现本地测试的情况跟官网说的不太一样(官网点击打开链接 ),这里做个记录以便及时查看。后面的测试主要是基于springboot的。 二、测试模拟 我使用的disconf版本是目前的最新版2.6.36。在测试之前,先说明几个和路径相关的配置。
2018-02-02 19:59:56
2648
原创 Jdk1.8版本CountDownLatch实现源码分析
一、CountDownLatch CountDownLatch的主要应该场景是,可以用来等待其他线程处理完某个任务后再执行主流程,比如,现在我们有一个运算结果依赖于其它几个线程的运行结果,类似这样的场景就可以考虑用CountDownLatch来实现,CountDownLatch是基于AQS实现的,使用了AQS提供的共享模式。 二、先看一个使用的简单例
2018-02-02 08:43:37
474
原创 JAVA常用负载均衡算法实现
一、负载均衡的概念 在大型的分布式架构中,对于负载较高的服务来说,往往对应着多台机器组成的集群,当请求到来的时候,为了将请求均衡的分配给后端服务器需要有相应的负载均衡算法来支持,通过相应的负载均衡算法选取一台机器来处理客户端请求,这个过程称为服务的负载均衡。二、常用负载均衡算法实现 常用的负载均衡算法主要有随机法,轮询法,加权随
2018-01-31 14:15:35
917
1
原创 Jdk1.8版本并发包基类AQS(AbstractQueuedSynchronizer)实现原理分析
一、AbstractQueuedSynchronizer是干嘛的? AbstractQueuedSynchronizer(以下简称AQS)是理解JAVA并发包里面各种类使用的一个重要的基础抽象基类,最近也在网上看了一些博客专门讲这个,感觉有些地方没有说清楚,也有一些笔误或者理解的问题,所以自己决定也写一篇。做个笔记,方便以后查阅,如果理解有误的地方,欢迎大家批评指正。
2018-01-26 23:14:53
577
原创 Jersey请求springboot
一、理解springboot的bean装载规则 SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!“Application类”是指SpringBoot项目入口类。这个类的位置很关键: 如果Application类所在的包为:com.boot.app,则只会扫描com.boot.app包及其所有子包,如果serv
2018-01-26 08:57:33
306
原创 JAVA实现LRU缓存淘汰
一、缓存淘汰算法 常用的缓存淘汰算法有FIFO,LRU,LFU;最常用的当属于LRU,比如分布式缓存服务memcached其默认的缓存淘汰算法也是LRU;LRU的意思是淘汰最近最少使用的数据,本篇主要采用LinkedHashMap和双向链表来分别实现。二、LinkedHashMap实现 LinkedHashMap用来实现LRU非常简单,LinkedHashma
2018-01-26 08:45:26
665
原创 HBase常用服务调用封装
一、前言 生产刚刚接入HBase,应用对其数据的获取的几种方式如get,scan,scan range进行了相关服务封装二、服务封装 package com.hbase.sources;import java.io.IOException;import java.util.ArrayList;import java.util.Date;
2018-01-24 09:53:16
760
原创 HBase1.2.3版本客户端请求如何定位HRegion的位置
一、为什么需要定位 hbase是一个主从的master/slave架构,默认使用zk的选举来支持HMaster的高可用实通过监听临时节点,使用类似分布式锁的方法来争抢创建节点后成为新的master。 一个HMaster通常会对应多个HRegionServer,而每一个HRegionServer又可以有多个HRegion,需要注意的是,我们的Table数据刚开始的
2018-01-24 09:39:40
1835
原创 HBase1.2.3版本memstore flush触发机制以及HRegionServer级别触发源码分析
一、Memstore存在的意义? 在HBase中,每个HRegionServer上有多个HRegion,每个HRegion上有多个HStore,而Memestore作为一个HStore的组成部分,当我们大量写操作发生的时候,如果超过了Memstore的设置阀值,就会执行flush到Hfile文件的操作。默认情况下hbase底层存储的文件系统为hdfs,但是HDFS在存储的
2018-01-24 09:19:48
1123
1
原创 HBase1.2.3版本HRegion的Spilt操作触发机制
第一节:触发时机 一、如果某个HRegion下的某个HStore下的所有的HFile的大小超过了 这个默认配置, 那么这个HRegion会被拆分 二、 当某个HS上的HRegion个数达到这个数量时,不进行拆分 三、在hfile合并的时候,如果合并后的store的大小超过了 hbase.hregio
2018-01-24 08:55:11
826
原创 HBase1.2.3版本常用配置参数说明
一、前言 主要针对HBase的1.2.3版本参照官网,对其常用配置参数进行翻译说明,供查阅。二、配置参数说明 hbase.tmp.dir ${java.io.tmpdir}/hbase-${user.name} Temporary directory on the local filesystem. Change this setting to
2018-01-24 08:43:36
3262
原创 HBase1.2.3版本表属性介绍
一、查看表 二、属性介绍 2.1 BLOOMFILTER 布隆过滤器,可选值NONE|ROW|ROWCOL,默认为NONE,该参数可以单独对某个列簇启用。对于get操作以及部分scan操作可以剔除掉不会用到的存储文件,减少实际IO次数,提高随机读性能。Row类型适用于只根据Row进行查找,而RowCol类型适用于根据R
2018-01-24 08:35:25
741
原创 JAVA的CAS机制
一、什么是CAS CAS即比较并替换,是一种轻量级锁,一般用于并发量不大的场景,CAS机制中用了3个变量:内存值V,旧的预期值A,要修改的新值B;只有当内存中的值和旧的预期值相等的情况下才更新值为B,否则该线程会一直自旋等待,下面我们用大白话来解释CAS。二、CAS 应用 想象一下假如现在我们有2个线程,对共享变量进行i++操作,如果不加锁会出现什么
2018-01-22 21:19:34
519
原创 Storm1.0版本重要知识点梳理
一、Storm topology提交到集群分析 storm目前1.x版本支持nimbus的高可用(其实也可以不需要高可用,因为nimbus是无状态的,只要运行的topology没有故障且没有新的任务需要提交到storm集群,那么也可以不要nimbus,因为是worker在运行任务,nimbus只是负责任务分配,资源调度且和supervisor保持心跳我们可以做好整个集群的监控即可,当ni
2018-01-20 13:26:59
569
1
原创 Storm1.0版本任务调度策略实现源码分析
一、任务调度策略 当我们将topology提交到storm集群的时候,任务是怎样分配的呢,这就需要理解storm的任务调度策略,这里主要给大家分享默认的调度策略DefaultScheduler,在storm的1.1.0版本已经支持4种调度策略,分别是DefaultScheduler,IsolationScheduler,MultitenantScheduler,ResourceAwareS...
2018-01-20 13:22:57
950
原创 HBase1.2.3版本存储结构分析
一、Hbase能做什么 1、海量数据存储(几百亿的行+上百亿列) 2、检索数据(get,scan,scan range)------>准实时(毫秒,秒级别) 特点: 1、伸缩性强:数据量在无法预估的情况下增大,比如使用MySQL,大到一定程度,添加机器,使用mysql集群做读写分离,然后分库分表,复杂度增大很多,而hbase只需要简单的添加一台机器就可实现负载均衡。
2018-01-19 19:01:31
524
原创 HBase1.2.3版本HRegion的负载均衡实现源码分析
一、HRegion的负载均衡 负载均衡主要用来解决热点问题,使请求更均匀的发送给不同的应用服务器,Hbase是一个典型的主从架构,HMaster负载整个集群的资源调度,任务分配,而数据的IO操作是在HRegionServer上,每个HRegionServer会有N个HRegion,存的是每张表的一部分数据,而HRegionServer里的HRegion之间的负载影响着整个Hbase集
2018-01-19 18:52:31
958
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人