- 博客(43)
- 资源 (10)
- 收藏
- 关注
原创 junit单元测试所踩到的坑
背景:某天,team内某童鞋叫我帮忙一起看个问题,原本运行正常的一个case(本人在一年前编写的),突然跑不过了,而且现象还非常诡异,搞了好久,不知道啥原因,严重影响移交进度(单测必须全过才能进行后续的发版流程)。现象:1,本地跑单元测试能够全部通过(我们是直接执行gradle clean test),打个tag,一拿到单测服务器上跑,fail了 2,单独跑这个fail...
2019-04-16 22:25:21
3822
原创 工作中遇到的sql优化相关问题总结
本文主要总结下工作以来,所遇到过的sql优化问题,至于一些通用sql优化常识,还有一些简单的场景加加索引index就可以这些情况本文就不描述了,本文主要挑选些工作中曾经遇到过的,个人认为(毕竟我不是专业的dba)还是有点价值的总结下,总体感觉下来,在优化sql的时候要多看sql的执行计划,便于你分析如何去优化sql。1,mysql相关在讲述问题前,我们先来准备下相关环境,如下:数据表:...
2018-12-07 19:32:29
813
原创 关于模块化开发的思考
缘起为曾经的一次面试,先介绍下背景。还是以本人现在工作中的业务背景为例吧,二级市场的业务有三种模式:转让、回购、质押,这三种模式构成了二级市场这条业务线的全部功能,这三个功能是分别互斥的,这导致三个功能之间彼此会有些依赖,比如回购时需要看下当前资产是否发生了转让或者质押。当前我们的业务量还不是太大,在搭建应用时,这三个功能都在同一个app中,考虑到未来万一哪天业务量大了,可以方便的(尽可能少改代码...
2018-11-25 21:19:07
482
原创 关于java单例的深入思考
整理下之前的学习笔记,发现在工作中虽然经常用到单例,但都没有怎么去深究其对与错,因为我们都是老实的按照正确的姿势去获取单例,正好翻到这个笔记,回顾下(其实要实现一个真正的单例还是比较复杂的)。单例模式应该是最简单也是最常用的一种设计模式了,个人认为对于一个单例来说,基本的几个特性必须满足:1,必须是单例!!!这点很重要,不能是个伪单例2,能够延迟加载,如果程序中一直没有用到,则不需要new...
2018-11-09 16:03:53
787
转载 假如让你来设计数据库中间件
最近在网上逛的时候看到一篇关于数据库中间件设计的文章,嗯,讲的还比较详细,转载之,再附上自己的一点点感想,原文出自《假如让你来设计数据库中间件》,原文如下:13年底负责数据库中间件设计时的设计文档,拿出来和大家分享: 可以了解下数据库中间件技术 可以了解下架构师系统设计的思路 一、总体目标数据库中间层项目背景不再展开,根据前期的调研以及和公司同事的讨论,中间层的核...
2018-11-04 10:03:51
2161
原创 数据库中间件tddl与mycat使用总结
做订单中心项目的时候正好涉及到了数据库中间件,翻了翻以前的笔记,整理下曾经学习使用过的两款中间件,嗯,简要总结下。tddl是淘宝在几年前推出的一款基于客户端分片的数据库访问中间件,mycat(社区活跃)是开源社区基于服务端分片推出的数据库中间件,具体的介绍百度上都有,这里我主要根据自己的实际使用情况来总结下其异同以及优缺点:1,基于客户端分片的方案应该是数据库分片方案中最快的,它以jar包...
2018-10-26 19:32:20
7095
原创 订单中心项目分析与总结
需求背景:随着业务的发展,公司逐步上线了多种产品和业务线,每个业务线除了一些基础的服务(比如支付,资产交割等)使用公共服务外,剩余的部分都是业务线自行处理,这样就形成了各个业务线自己的订单。在业务发展的初期,这样的方式是很方便快捷的,可以使得产品快速上线,但同时也埋下了一些问题:1,用户如果需要查自己的订单,需要到不同的业务线(网站上不同的tab)进行查询,用户体验差(比如无法按照订单金额排序...
2018-10-26 19:32:04
7499
原创 秒杀系统分析与总结
秒杀是一种常见的营销手段,商品以极低的价格,在特定的时间点开售,引发大量的用户抢购,制造轰动效应。但是它给网站技术带来了极大的挑战,下面我们首先看下秒杀活动的一些业务特性与行为:1,活动时间短,并发流量极高,对网站的其他业务形成冲击2,因为秒杀活动,用户访问量突然增加,大大超过平时网站的带宽3,秒杀活动前,用户为了不错过秒杀,不停的刷详情页,如果请求一直穿透到后端服务器和数据库,会对后...
2018-09-18 22:53:02
3152
1
原创 分布式系统延时任务方案
在实际项目开发中,我们遇到了如下需求:1,机票订单下单后,如果30分钟内未支付,则自动取消2,产品上架后,24小时都没有人买,则自动下架3,一定时间后自动评价或者自动收货4,其他类似需求...类似这样的需求,我把它叫做延时任务,叫做定时任务不大合适,因为这类任务没有固定的触发时间,下面我们来分析总结下这类任务的解决方案:a,定时轮询数据库启动一个job(job调度与业务...
2018-08-20 22:46:53
1529
原创 分布式系统全局唯一id的生成
在实际项目中,本人在做需求时遇到了以下场景需要生成全局唯一id:1,为解决mq消息可能乱序的问题,我们需要一个全局且自增的id来标识消息2,数据库分库分表也需要一个全局唯一升序的id所以下面总结下生成全局唯一id的思路:方法1:使用数据库提供的自增sequence以Oracle为例,我们可以新建一个序列seq_common,使用sql:select seq_common.nex...
2018-08-02 23:09:36
2691
原创 个人对系统拆分的理解
在本人现在的公司和本人工作过的上一家公司,本人有幸参与并实施了公司业务系统的架构拆分,现将之前的工作总结下。1,为什么要进行系统拆分首先我们需要想想,到底什么样的系统需要进行拆分?并不是所有的系统都需要进行拆分,拆分系统是一件耗时并且有风险的操作,所以再拆分前需要再三考虑是否真的需要拆分,拆分的好处是否大于风险。个人认为进行系统拆分的原因主要有以下几个方面:a,组织结构发生了变化,从最...
2018-07-18 14:25:41
9781
1
原创 netty源码阅读与分析----HashedWheelTimer
netty是一个基础通信框架,管理的连接数较多,可能多至百万级,每一个连接都有或多或少有超时任务,比如发送数据超时,心跳检测等。如果为每一个连接都启动一个Timer,不仅效率低下,而且占用资源。基于论文Hashed and hierarchical timing wheels: data structures for the efficient implementation of a timer ...
2018-07-03 17:49:45
1195
原创 设计一个简易的NIO框架
NIO框架的目的在于屏蔽了底层的NIO操作,使得程序员只需要关注本身的业务逻辑即可,这样可以大大的提高开发效率,所有框架推出的目的不外乎都是这个目的。下面我们来看下如何去做一个NIO框架,一个典型的网络通信过程如下:这里我们主要看下服务端的流程该如何处理:1,线程模型传统的方式为针对每一个新来的连接建立一个线程去处理,这样的方式太低效了,这里我们仿照netty的方式,采用reactor线程模型:a...
2018-07-02 22:55:48
3435
原创 netty4源码阅读与分析---零拷贝
在说零拷贝之前,我们先来看下传统的读写方式是怎样的,如下图:读取数据时,请求会把读操作委托给内核,由内核与磁盘进行交互。数据会从磁盘拷贝到内核的缓存区中,这个copy动作由DMA完成,整个过程中基本上不消耗CPU,但是应用程序想拿到信息得从内核缓冲区获取,经过cpu copy的动作,将数据从内核缓冲区中拷贝到应用缓冲区中,这个copy动作是需要消耗CPU的。写数据时,应用想将数据经过内核,将数据先...
2018-07-02 22:47:13
606
原创 netty4源码阅读与分析---netty的内存管理
我们首先来看下UnpooledHeapByteBuf,它是基于堆内存的字节缓冲区,没有基于对象池实现,每次读写时都会创建一个UnpooledHeapByteBuf对象,可能会有一定的性能影响,但是内存管理上却相对容易得多。它的类关系图如下:...
2018-06-27 22:14:02
3631
原创 netty4源码阅读与分析---ByteBuf
在worker线程处理read事件时,会将读取到的内容写入到ByteBuf中,供后续的操作,这里我们来研究下其内部结构,
2018-06-27 22:12:06
558
原创 netty4源码阅读与分析---netty线程模型
本文主要说下我自己对netty线程模型的理解,以及这样的线程模型的好处。通俗的来讲,netty的线程模型描述的就是老板和员工的故事。老板(通常情况下是一个老板)负责接活,与客户沟通,协调(netty的accept),谈成后(通道建立),他需要从员工中选出一位员工来负责处理后续具体的事宜(worker线程,这里我们有16位员工,编号1-16),员工做事时按照任务的先后顺序进行处理,这样可以避免错乱,...
2018-06-27 22:11:01
518
原创 netty4源码阅读与分析----服务端如何处理请求
接上一篇,当服务端接收到客户端的连接请求后(accept事件),服务端发现我们感兴趣的accept事件到了(这个过程就是NioEventLoop的run方法在不断的轮寻),交由processSelectedKeys方法处理,它会调用到这里:if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || rea...
2018-06-27 22:10:30
393
原创 netty4源码阅读与分析----服务端启动过程
首先我们编写个测试例子,然后根据例子一步步debug过程中阅读源码。EventLoopGroup bossGroup=new NioEventLoopGroup(1); EventLoopGroup workerGroup=new NioEventLoopGroup(); try { ServerBootstrap b=new ServerB...
2018-06-27 22:09:56
525
原创 disruptor源码阅读与分析----等待策略
在前一篇文中我们阅读了RingBuffer和Sequence,测试例子中我们使用的等待策略是BlockingWaitStrategy,在本文中我们重点看下都有哪些等待策略,他们都有什么不同1,BlockingWaitStrategy
2018-05-14 22:19:32
2601
原创 disruptor设计方案值得借鉴的地方以及实际中的应用
个人看来,disruptor设计方案中值得借鉴的地方主要有以下几处:1,环形数据结构为了避免垃圾回收,使用了数组而非链表,能够快速获取到数据网上搜索了下,看到了这篇文章利用环形队列解决项目中的实际问题,这里我也自己写了个测试例子:public class RingTimer { private static int currentIndex = 0; public static ...
2018-05-14 22:18:49
3345
原创 实现一个通用的池
在实际应用中,我们会接触诸如线程池,数据库连接池,各种池化技术实现的池,那是否可以实现一个通用的池,可以涵盖线程池,数据库连接池等等功能呢? 下面我们来尝试下,老规矩,我们先编写测试程序,通过测试程序看一下我们的需求是怎样的,然后该如何去实现这个通用的池.以数据库连接为例,public class Main { public static void main(String[] arg...
2018-05-03 16:18:48
2694
原创 关于分布式系统流控的思考
考虑一个场景,在1s的时间内,同一个ip只允许访问某个系统3次,都有哪些实现方式?1,基于Nginx实现Nginx使用ngx_http_limit_zone_module 模块实现,其可以按照定义的键限定每个键值的连接数。特别的,可以设定单一 IP 来源的连接数。其优点在于避免了大流量传递到后端系统,消耗后端资源。但是,由于nginx.conf不能热加载,使用这种方式只能配置一些静态的参数...
2018-01-24 16:00:18
4268
原创 我所理解的spring ioc容器
首先来想下,如果没有spring ioc的时候,程序员是如何来获取与管理对象的,考虑如下的例子A.javavoid functionA(){ ObjA a = new ObjA();}B.javavoid functionB(ObjA a){ a.funca(); ObjB b = new ObjB();}C.javavoid functionC(ObjA a,ObjB
2017-12-11 22:24:03
1876
原创 java.lang之java.lang.Object源码阅读及分析
Object是java中一切类的基础父类,下面看下Object中主要的函数1,wait函数 public final void wait() throws InterruptedException { wait(0); }该函数有段注释特别需要注意* The current thread must own this object's monitor. Th
2017-12-09 22:33:54
2148
原创 一个java程序是怎样运行起来的(2)
接上一篇---- 一个java程序是怎样运行起来的(1),当我们执行java Test后,程序会在控制台输出我们想要的结果,那么这个过程中经历了些什么呢?我们知道,java程序要想运行起来,必须建立在java虚拟机上。下面结合hotspot vm(sun实现的java虚拟机)看下执行java Test命令后,java虚拟机的处理过程。 在执行java Test命令后,会去启动java虚拟机来执
2017-11-28 22:37:48
4969
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人