
后端
文章平均质量分 79
后端进阶
作者张乘辉,擅长消息中间件技能,负责公司百万 TPS 级别 Kafka 集群的维护,微信公众号「后端进阶」不定期分享 Kafka、RocketMQ 系列不讲概念直接真刀真枪的实战总结以及细节上的源码分析;同时作者也是阿里开源分布式事务框架 Seata Contributor,因此也会不定期分享关于 Seata 的相关知识;当然公号也会不定期发表 WEB 相关知识比如 Spring 全家桶等。不一定面面俱到,但一定让你感受到作者对于技术的追求是认真的!
展开
-
四年磨一剑:我是如何拿到蚂蚁offer的?
萌芽我大学学的并非计算机,学的是机械工程,课程仅接触过汇编语言以及一点 C 语言,当时也算有一点点计算机编程基础吧,我一点都不喜欢这个专业,除了上单片机汇编课程时比较感兴趣。机械这个专业我不但不喜欢,还完全看不到未来,像一滩死水,自己就像一个温水里的青蛙,逐渐地死去。还好在死去前的一刻我终于想清楚了,转行!无论如何,我也要丢掉「专业」这个沉重的包袱,跟这个天坑的专业说再也不见。我也渐渐地不会去趋于平庸委屈求全地度过年轻的岁月,人生本就应该去追寻源于内心真实的自己,而不该满足于现状,趋于平庸委曲求全。原创 2021-04-24 20:08:03 · 8128 阅读 · 10 评论 -
深度解析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 评论 -
中通消息平台 Kafka 顺序消费线程模型的实践与优化
各类消息中间件对顺序消息实现的做法是将具有顺序性的一类消息发往相同的主题分区中,只需要将这类消息设置相同的 Key 即可,而 Kafka 会在任意时刻保证一个消费组同时只能有一个消费者监听消费,因此可在消费时按分区进行顺序消费,保证每个分区的消息具备局部顺序性。由于需要确保分区消息的顺序性,并不能并发地消费消费,对消费的吞吐量会造成一定的影响。那么,如何在保证消息顺序性的前提下,最大限度的提高消费者的消费能力?本文将会对 Kafka 消费者拉取消息流程进行深度分析之后,对 Kafka 消费者顺序消费线程模原创 2020-12-01 11:55:30 · 6070 阅读 · 5 评论 -
图解 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 评论 -
使用 K8s 进行作业调度实战分享
最近在公司的数据同步项目(以下简称 ZDTP)中,需要使用到分布式调度数据同步执行单元,目前使用的方案是将数据同步执行单元打包成镜像,使用 K8s 进行调度。在 ZDTP 中,数据同步的动作可抽象成一个执行单元(以下称为 worker),类似于线程执行单元 Runnable ,Runnable 放入一个队列中等待线程的调度执行,执行完 Runnable 即完成了它的使命。当用户在 ZDTP 控制台中创建同步任务并启动任务时,会根据同步任务的配置,产生若干个用于该任务的 worker,假设这些 worker原创 2020-08-27 23:18:55 · 2011 阅读 · 0 评论 -
图解 K8s 核心概念和术语
我第一次接触容器编排调度工具是 Docker 自家的 Docker Swarm,主要解决当时公司内部业务项目部署繁琐的问题,我记得当时项目实现容器化之后,花在项目部署运维的时间大大减少了,当时觉得这玩意还挺新鲜的,原来自动化运维可以这么玩。后面由于工作原因,很久没碰过容器方面的知识了。最近在公司的数据同步项目中,需要使用到分布式调度数据同步执行单元,目前使用的方案是将数据同步执行单元打包成镜像,使用 K8s 进行调度,正好趁这个机会了解一下 K8s,下面我就用图解的形式将我所理解的 K8s 分享给大家。K原创 2020-08-24 09:16:43 · 3231 阅读 · 0 评论 -
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 评论 -
彻底搞懂 Kafka 消息大小相关参数设置的规则
前段时间接到用户要求,调整某个主题在 Kafka 集群消息大小为 4M。根据 Kafka 消息大小规则设定,生产端自行将 max.request.size 调整为 4M 大小,Kafka 集群为该主题设置主题级别参数 max.message.bytes 的大小为 4M。以上是针对 Kafka 2.2.x 版本的设置,需要注意的是,在某些旧版本当中,还需要调整相关关联参数,比如 replica.fetch.max.bytes 等。从上面例子可看出,Kafka 消息大小的设置还是挺复杂的一件事,而且还分版原创 2020-05-21 13:33:13 · 11248 阅读 · 6 评论 -
我参与 Seata 开源项目的一些感悟
丁老师在他的知识星球邀请我回答以下一个问题:我觉得这个问题非常有意思,姑且把它贴到公众号这里,与大家分享一下我对这个问题的一些感悟。感谢丁老师的邀请问答:在这里我就简单说下,我这段时间参与 Seata 开源项目的一些感悟:1、如何参与到开源项目中并贡献自己的一份力量?我一直都有上 GitHub 搜索一些主流开源项目的习惯,我是从去年 5 月份从 GitHub 开始关注 Seata 项目的,经过入门上手之后,我就觉得它的设计理念非常棒,尽管当时还有很多地方没有完善,但并不阻碍我对它的赞美,我对它产原创 2020-05-18 19:46:29 · 1252 阅读 · 0 评论 -
当 Kafka 分区不可用且 leader 副本被损坏时,如何尽量减少数据的丢失?
经过上次 Kafka 日志集群某节点重启失败导致某个主题分区不可用的事故之后,这篇文章专门对分区不可用进行故障重现,并给出我的一些骚操作来尽量减少数据的丢失。故障重现下面我用一个例子重现现分区不可用且 leader 副本被损坏的例子:使用 unclean.leader.election.enable = false 参数启动 broker0;使用 unclean.leader.elect...原创 2020-03-29 20:26:55 · 1645 阅读 · 0 评论 -
基于Jenkins Pipeline自动化部署
最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置,也可以在每个项目中直接写Pipeline脚本,但像我那么追求极致的程序员来说,这些方案都打动不了我那颗骚动的心,下面我会跟你们讲讲我是如何通过Pipeline脚本实现自动化部署方案的,并...原创 2019-02-17 09:33:15 · 3853 阅读 · 0 评论 -
Seata 动态配置订阅与降级实现原理
Seata 的动态降级需要结合配置中心的动态配置订阅功能。动态配置订阅,即通过配置中心监听订阅,根据需要读取已更新的缓存值,ZK、Apollo、Nacos 等第三方配置中心都有现成的监听器可实现动态刷新配置;动态降级,即通过动态更新指定配置参数值,使得 Seata 能够在运行过程中动态控制全局事务失效(目前只有 AT 模式有这个功能)。那么 Seata 支持的多个配置中心是如何适配不同的动态配置...原创 2019-12-22 21:50:29 · 5752 阅读 · 0 评论 -
Seata 配置中心实现原理
Seata 可以支持多个第三方配置中心,那么 Seata 是如何同时兼容那么多个配置中心的呢?下面我给大家详细介绍下 Seata 配置中心的实现原理。配置中心属性加载在 Seata 配置中心,有两个默认的配置文件:file.conf 是默认的配置属性,registry.conf 主要存储第三方注册中心与配置中心的信息,主要有两大块:registry { # file 、nacos 、...原创 2019-12-16 20:43:05 · 5072 阅读 · 0 评论 -
Seata 客户端需要同时启动 TM 和 RM 吗?
在分析启动部分源码时,我发现 GlobalTransactionScanner 会同时启动 RM 和 TM client,但根据 Seata 的设计来看,TM 负责全局事务的操作,如果一个服务中不需要开启全局事务,此时是不需要启动 TM client的,也就是说项目中如果没有全局事务注解,此时是不是就不需要初始化 TM client 了,因为不是每个微服务,都需要 GlobalTransactio...原创 2019-12-14 14:54:36 · 2256 阅读 · 0 评论 -
Seata AT 模式启动源码分析
从上一篇文章「分布式事务中间件Seata的设计原理」讲了下 Seata AT 模式的一些设计原理,从中也知道了 AT 模式的三个角色(RM、TM、TC),接下来我会更新 Seata 源码分析系列文章。今天就来分析 Seata AT 模式在启动的时候都做了哪些操作。客户端启动逻辑TM 是负责整个全局事务的管理器,因此一个全局事务是由 TM 开启的,TM 有个全局管理类 GlobalTr...原创 2019-12-12 19:22:43 · 1903 阅读 · 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 评论 -
匿名内部类在多线程中的应用
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;/* * 需求:简单的买票程序 * 需多个窗口同时买票,实现数据共享 * * * 实现方式和继承方式有什么区别? * 实现方式避免了单继承的局限性。 * * 具体步骤: * 1.定义类实现Runnable接口 * 2.覆盖Runnable接口中的run方法 * 3.通过Thread类建立线程对...原创 2016-09-21 23:34:08 · 1118 阅读 · 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;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 评论 -
你都理解创建线程池的参数吗?
多线程可以说是面试官最喜欢拿来问的题目之一了,可谓是老生之常谈,不管你是新手还是老司机,我相信你一定会在面试过程中遇到过有关多线程的一些问题。那我现在就充当一次面试官,我来问你:现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为5,此时有4个任务同时进来,问:线程池会创建几条线程?如果4个任务还没处理完,这时...原创 2019-04-26 09:44:02 · 1125 阅读 · 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 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 评论 -
数据库总结图
学习了两个星期数据库有关知识总结出来的一张图。原创 2016-12-19 00:28:34 · 1113 阅读 · 0 评论 -
Java 后端自学之路
微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。老司机倾囊相授,带你一路进阶,来不及解释了快上车!最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很迷茫,不知从何下手。我就以过来人的经历,写在这篇...原创 2019-05-31 23:33:27 · 3587 阅读 · 1 评论