
Java
文章平均质量分 66
后端进阶
作者张乘辉,擅长消息中间件技能,负责公司百万 TPS 级别 Kafka 集群的维护,微信公众号「后端进阶」不定期分享 Kafka、RocketMQ 系列不讲概念直接真刀真枪的实战总结以及细节上的源码分析;同时作者也是阿里开源分布式事务框架 Seata Contributor,因此也会不定期分享关于 Seata 的相关知识;当然公号也会不定期发表 WEB 相关知识比如 Spring 全家桶等。不一定面面俱到,但一定让你感受到作者对于技术的追求是认真的!
展开
-
四年磨一剑:我是如何拿到蚂蚁offer的?
萌芽我大学学的并非计算机,学的是机械工程,课程仅接触过汇编语言以及一点 C 语言,当时也算有一点点计算机编程基础吧,我一点都不喜欢这个专业,除了上单片机汇编课程时比较感兴趣。机械这个专业我不但不喜欢,还完全看不到未来,像一滩死水,自己就像一个温水里的青蛙,逐渐地死去。还好在死去前的一刻我终于想清楚了,转行!无论如何,我也要丢掉「专业」这个沉重的包袱,跟这个天坑的专业说再也不见。我也渐渐地不会去趋于平庸委屈求全地度过年轻的岁月,人生本就应该去追寻源于内心真实的自己,而不该满足于现状,趋于平庸委曲求全。原创 2021-04-24 20:08:03 · 8128 阅读 · 10 评论 -
使用 K8s 进行作业调度实战分享
最近在公司的数据同步项目(以下简称 ZDTP)中,需要使用到分布式调度数据同步执行单元,目前使用的方案是将数据同步执行单元打包成镜像,使用 K8s 进行调度。在 ZDTP 中,数据同步的动作可抽象成一个执行单元(以下称为 worker),类似于线程执行单元 Runnable ,Runnable 放入一个队列中等待线程的调度执行,执行完 Runnable 即完成了它的使命。当用户在 ZDTP 控制台中创建同步任务并启动任务时,会根据同步任务的配置,产生若干个用于该任务的 worker,假设这些 worker原创 2020-08-27 23:18:55 · 2011 阅读 · 0 评论 -
深度解析RocketMQ Topic的创建机制
我还记得第一次使用rocketmq的时候,需要去控制台预先创建topic,我当时就想为什么要这么设计,于是我决定撸一波源码,带大家从根源上吃透rocketmq topic...原创 2019-03-31 09:05:00 · 21128 阅读 · 6 评论 -
RocketMQ消息发送的高可用设计
从rocketmq topic的创建机制可知,一个topic对应有多个消息队列,那么我们在发送消息时,是如何选择消息队列进行发送的?假如这时有broker宕机了,rock...原创 2019-04-06 09:05:00 · 7518 阅读 · 0 评论 -
从源码的角度解析线程池运行原理
在讲解完线程池的构造参数和一些不常用的设置之后,有些同学还是想继续深入地了解线程池的原理,所以这篇文章科代表会带大家深入源码,从底层吃透线程池的运行原理。ThreadPoolExecutor在深入源码之前先来看看J.U.C包中的线程池类图:它们的最顶层是一个Executor接口,它只有一个方法:public interface Executor { v...原创 2019-04-25 08:05:00 · 1479 阅读 · 1 评论 -
RocketMQ为什么要保证订阅关系的一致性?
前段时间有个朋友向我提了一个问题,他说在搭建 RocketMQ 集群过程中遇到了关于消费订阅的问题,具体问题如下:然后他发了报错的日志给我看:the consumer's...原创 2019-07-29 08:03:00 · 2956 阅读 · 1 评论 -
图解 DataX 核心设计原理
DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。前段时间我在 K8s 相关文章中有提到过数据同步的项目,该项目就是基于 DataX 内核构建的,由于公司数据同步的需求,还需要在 DataX 原有的基础上支持增量同步功能,同时支持分布式调度,在「使用 K8s 进行作业调度实战分享」这篇文章中已经详细描述其中的实现。基于我在项目中对 DataX 的原创 2020-09-07 22:43:03 · 4088 阅读 · 0 评论 -
探讨缓存行与伪共享
最近项目中有个需求,需要用到有界队列对访问请求量进行流量削峰请求,同时作为一个缓冲层对请求处理进行后续处理,Java 内置有界队列 ArrayBlockingQueue 可以满足这方面的需求,但是性能上并不满足,于是使用了 Disruptor,它是英国外汇交易公司 LMAX 开发的一个高性能队列,了解到它内部解决伪共享问题,今天就和大家一起学习缓存行与伪共享相关的知识。缓存行(Cache line)对计算机组成原理相对熟悉的小伙伴都知道,CPU 的速度比内存的速度高了几个数量级,为了 CPU 更快从内存原创 2020-08-29 23:09:58 · 1044 阅读 · 1 评论 -
Seata RPC 模块的重构之路
RPC 模块是我最初研究 Seata 源码开始的地方,因此我对 Seata 的 RPC 模块有过一些深刻研究,在我研究了一番后,发现 RPC 模块中的代码需要进行优化,使得代码更加优雅,交互逻辑更加清晰易懂,本着 “让天下没有难懂的 RPC 通信代码” 的初衷,我开始了 RPC 模块的重构之路。这里建议想要深入了解 Seata 交互细节的,不妨从 RPC 模块的源码入手,RPC 模块相当于 Seata 的中枢,Seata 所有的交互逻辑在 RPC 模块中表现得淋漓尽致。这次 RPC 模块的重构将会使得原创 2020-07-30 14:41:31 · 1789 阅读 · 0 评论 -
Spring 异步实现原理与实战分享
最近因为全链路压测项目需要对用户自定义线程池 Bean 进行适配工作,我们知道全链路压测的核心思想是对流量压测进行标记,因此我们需要给压测的流量请求进行打标,并在链路中进行传递,那么问题来了,如果项目中使用了多线程处理业务,就会造成父子线程间无法传递压测打标数据,不过可以利用阿里开源的 ttl 解决这个问题。全链路压测项目的宗旨就是不让用户感知这个项目的存在,因此我们不可能让用户去对其线程池进行改造的,我们需要主动去适配用户自定义的线程池。在适配过程的过程中无非就是将线程池替换成 ttl 去解决,可通过原创 2020-06-18 10:07:50 · 2629 阅读 · 1 评论 -
我参与 Seata 开源项目的一些感悟
丁老师在他的知识星球邀请我回答以下一个问题:我觉得这个问题非常有意思,姑且把它贴到公众号这里,与大家分享一下我对这个问题的一些感悟。感谢丁老师的邀请问答:在这里我就简单说下,我这段时间参与 Seata 开源项目的一些感悟:1、如何参与到开源项目中并贡献自己的一份力量?我一直都有上 GitHub 搜索一些主流开源项目的习惯,我是从去年 5 月份从 GitHub 开始关注 Seata 项目的,经过入门上手之后,我就觉得它的设计理念非常棒,尽管当时还有很多地方没有完善,但并不阻碍我对它的赞美,我对它产原创 2020-05-18 19:46:29 · 1252 阅读 · 0 评论 -
基于Jenkins Pipeline自动化部署
最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置,也可以在每个项目中直接写Pipeline脚本,但像我那么追求极致的程序员来说,这些方案都打动不了我那颗骚动的心,下面我会跟你们讲讲我是如何通过Pipeline脚本实现自动化部署方案的,并...原创 2019-02-17 09:33:15 · 3853 阅读 · 0 评论 -
基于 Jenkins Pipeline 自动化部署
最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置,也可以在每个项目中直接写Pipeline脚本,但像我那么优秀,那么追求极致的程序员来说,这些方案都打动不了我那颗骚动的心,下面我会跟你们讲讲我是如何通过Pipeline脚本实现自动化部署方案的,并且...原创 2019-11-11 07:09:48 · 2247 阅读 · 0 评论 -
Dubbo 全链路追踪日志的实现
微服务架构的项目,一次请求可能会调用多个微服务,这样就会产生多个微服务的请求日志,当我们想要查看整个请求链路的日志时,就会变得困难,所幸的是我们有一些集中日志收集工具,比如很热门的ELK,我们需要把这些日志串联起来,这是一个很关键的问题,如果没有串联起来,查询起来很是很困难,我们的做法是在开始请求系统时生成一个全局唯一的id,这个id伴随这整个请求的调用周期,即当一个服务调用另外一个服务的时候,会...原创 2019-11-07 01:00:32 · 4797 阅读 · 1 评论 -
我对支付平台架构设计的一些思考
我在前一家公司的第一个任务是开发统一支付平台,由于公司的业务需求,需要接入多个第三方支付,之前公司的支付都是散落在各个项目中,及其不利于支付的管理,于是聚合三方支付,统一支付平台的任务就落在我手上,可以说是完全从 0 开始设计,经过一翻实战总结,我得出了一些架构设计上的思考,之前就一直很想把自己的架构设计思路写出来,但一直没动手,前几天在技术群里有人问到相关问题,我觉得有必要把它写出来,以帮助到...原创 2019-06-04 08:05:00 · 6638 阅读 · 3 评论 -
数据库总结图
学习了两个星期数据库有关知识总结出来的一张图。原创 2016-12-19 00:28:34 · 1113 阅读 · 0 评论 -
Java I/O递归查找文件
今天老板突然吩咐一个任务给我,把公共盘的资料整理一遍,我问要怎么整,他说把大于1g的文件都找出来,,,,,我这时有千万个草泥马在心中奔驰而过,但没办法,总不能拒绝老板的要求啊。一想到我最近不是在学java吗,于是就写了下面的一个小程序(勉强能看),轻松解决了老板这个特殊“任务”!PS:楼主目前还是一位机械狗,正在学习java准备转行!package ioStream;i...原创 2016-11-10 21:33:53 · 1279 阅读 · 0 评论 -
操作dom对象模型思路
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input id=...原创 2016-11-02 21:29:00 · 1069 阅读 · 0 评论 -
关于线程池你不得不知道的一些设置
看完我上一篇文章「你都理解创建线程池的参数吗?」之后,当遇到这种问题,你觉得你完全能够唬住面试官了,50k轻松到手。殊不知,要是面试官此刻给你来个反杀:初始化线程池时可以预先创建线程吗?线程池的核心线程可以被回收吗?为什么?如果此刻你一脸懵逼,这个要慌,问题很大,50k马上变5k。有细心的网友早就想到了这个问题:在ThreadPoolExecutor线程池中,还有一些不常用的设置。我...原创 2019-05-16 23:39:05 · 1772 阅读 · 0 评论 -
多线程---生产者-消费者模型
package thread;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class Resourse{ //属性 private String name; p...原创 2016-09-21 16:36:28 · 1105 阅读 · 0 评论 -
单例设计模式之懒汉模式
<pre name="code" class="java">package thread;/* * 单例设计模式:懒汉式 * * 具有延时加载的特点 */class Single{ private Single(){} private static Single s=null; private int num; //在这里加synchronized也可以...原创 2016-09-21 23:30:29 · 1161 阅读 · 0 评论 -
多线程---数据共享
package thread;/* * 需求:简单的买票程序 * 需多个窗口同时买票,实现数据共享 * * * 实现方式和继承方式有什么区别? * 实现方式避免了单继承的局限性。 * * 具体步骤: * 1.定义类实现Runnable接口 * 2.覆盖Runnable接口中的run方法 * 3.通过Thread类建立线程对...原创 2016-09-21 23:34:08 · 1118 阅读 · 0 评论 -
匿名内部类在多线程中的应用
package thread;public class InTreadTest { public static void main(String[] args) { //第三第四种利用了匿名内部类,分别是第二、第一种的简写版本 //第一种 Runnable s=new haha(); Thread t=new Thread(s); t.star...原创 2016-09-22 14:25:35 · 1116 阅读 · 0 评论 -
多线程---死锁程序
package thread;/* * 需求:创建两个线程,在运行过程中相互锁死 * * 步骤: */class DeadLock implements Runnable{ boolean flat; DeadLock(boolean flat){ this.flat=flat; } public void run(){ if(flat){ while(tr...原创 2016-09-22 16:53:00 · 984 阅读 · 0 评论 -
算法---冒泡排序
package sort;/* * 冒泡排序: * * 原理:遍历,比较相邻的两个数,每遍历一次,把最大的数往上冒 * */public class BubbleSort { public final void bubble (int [] arr)//冒泡方法,加final是为了防止被擅改 { for(int x=0;x<arr.length-1;x++)...原创 2016-09-23 00:07:09 · 1081 阅读 · 0 评论 -
算法---直接插入排序
package sort;/* * 直接插入排序: * * 思想:设前面(n-1)个数是排序好的,把第n个数插入前面第(n-1)个数之后, * 使得数组也是排序好的。 * * 原理:1、首先将第n个数保存,第n个数依次和前面第(n-1)个数左对比(即遍历n-1); * 2、若第n个数满足小于(n-1)数,继续遍历,顺便将(n-1)的数 * ...原创 2016-09-23 00:09:55 · 1082 阅读 · 0 评论 -
多态特性---主板设计模式
package duoTai_JieKou_zhuBan;//创建一个接口类interface PCI { public void run(); public void close();}class MainBoard { //主板已启动 public void run(){ System.out.println("mainboard run"); } //检查连接在...原创 2016-09-23 00:14:30 · 1070 阅读 · 0 评论 -
异常处理
package exceptionTest;/* * 比老师用电脑讲课 * * 出现的问题: * 1,电脑蓝屏 * 2,电脑冒烟, * 3,当电脑冒烟后,讲课无法进行,需要采取下一步计划,放假或者换电脑? * * 要对问题进行描述,封装成对象 * * */class LanPingException extends Exception{ LanPingEx...原创 2016-09-23 00:17:33 · 1069 阅读 · 0 评论 -
字符串练习
package string;import java.security.PrivateKey;/* * 一个子串在整串中出现的次数。"nbaernbatynbauinbaopnba" * * 思路: * 1, 要找的子串是否存在,如果存在获取其出现的位置。这个可以使用indexOf完成。 * 2, 如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串, * ...原创 2016-09-23 16:55:10 · 1174 阅读 · 0 评论 -
ArrayList容器---去除重复元素
需求:1.将自定义对象作为元素存到ArrayList集合中,并去除重复元素* 比如存人的对象,同姓名同年龄,视为同一个人,为重复元素** 思路:1.对人创建一个类,将数据封装进创建的人对象里* 2.定义容器,存入容器里* 3.遍历,查重,取出** List 集合判断元素是否相同contains,用equals* 而默认下equals是比较地址的(String类...原创 2016-09-26 05:31:13 · 1351 阅读 · 0 评论 -
FileReader、FlieWriter分别对InputStreamReader、OutputStreamWriter封装了一个构造方法
FileReader源代码:public class FileReader extends InputStreamReader{........public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fileName));//向父类传了一...原创 2016-10-11 21:58:42 · 1122 阅读 · 0 评论 -
正则表达式Pattern和Matcher
1、把相应正则表达式编译到模式中(即创建一个模式对象Pattern)2、利用此模式matcher方法创建一个匹配器Matcher3、利用Matcher相关方式对特定字符串与该模式下进行匹配例:public static void matcherTest(){ String s="zhangchenghui"; ...原创 2016-10-25 22:35:57 · 1182 阅读 · 0 评论 -
你都理解创建线程池的参数吗?
多线程可以说是面试官最喜欢拿来问的题目之一了,可谓是老生之常谈,不管你是新手还是老司机,我相信你一定会在面试过程中遇到过有关多线程的一些问题。那我现在就充当一次面试官,我来问你:现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为5,此时有4个任务同时进来,问:线程池会创建几条线程?如果4个任务还没处理完,这时...原创 2019-04-26 09:44:02 · 1125 阅读 · 0 评论