重构,于我而言,很大的快乐在于能够解决问题。第一次重构是重构一个c版本的彩票算奖系统。当时的算奖系统在开奖后,算奖经常超时,导致用户经常投诉。接到重构的任务,既兴奋又紧张,花了两天时间,除了吃饭睡觉,都在撸代码。重构效果也很明显,算奖耗时从原来的1个小时减少到10分钟。去年,我以架构师的身份参与了家校朋友圈应用的重构。应用麻雀虽小,五脏俱全,和诸君分享架构设计的思路。01应用背景1.应用介绍移动互联网...
2022-06-27 17:20:41 5062浏览 0点赞 0回复 0收藏
英国著名哲学家培根说:“求知可以改进人性,而实验又可以改进知识本身。人的天性犹如野生的花草,求知学习好比修剪移栽。”我小时候就很喜欢看书,也喜欢买书。书就像是我的朋友,不管去任何地方,只要拿本书在手心里,就觉得有安全感。我买的第一本技术书是<<Java编程思想>>。相信很多初学者都看过这本书。书是个大块头,也有大智慧。初入职场的我看这本书却味如嚼蜡,始终不得要领。工作几年后,我才明白我为什么读不进这本书。...
2022-06-27 17:20:18 5072浏览 0点赞 0回复 0收藏
引言在斯坦福大学,乔布斯做了一场我认为他最精彩的演讲之一(另一场可能是iphone的问世发布会)。他讲了第一个故事"connectingthedots"你不可能充满预见地将生命的点滴串联起来;只有在你回头看的时候,你才发现这些点点滴滴之间的联系。所以,你要坚信,你现在所经历的将在你未来的生命中串联起来。你不得不相信某些东西,你的直觉、命运、生活、因缘际会……正是这种信仰让我不会失去希望,它让我的人生变得与众不同。什么是连...
2022-06-27 17:19:53 5161浏览 0点赞 0回复 0收藏
前言工作多年,经常遇到灵异事件,比如说:"任务为什么不跑了","没什么复杂业务呀,怎么cpu这么高","用了缓存,怎么查询还是这么慢",一些工作一两年的同学遇到这类问题可能会手足无措,所以我想写一些文字来和大家分享下。文笔有限,主要是交流。这篇是先和大家交流jstack的用法,以及编程方面的一些建议。1经典场景•场景一:任务(线程)突然不跑了程序是一段简单的quartz任务,伪代码类似:publicclassDataJobs{publicvoid...
2022-06-27 17:19:16 7404浏览 0点赞 0回复 0收藏
4编码习惯引导4.1设置线程名线程名设置主要是为了在jstack堆栈中便于查询。在logback日志中最好也标注下线程名。当遇到问题也有一个查询源。线程名有如下两种方式:•手工设置线程名ThreadtnewThread(newRunnable(){Overridepublicvoidrun(){somethingprocess}});t.setName("mytestThread");t.start();•线程工厂设置(源码来自rocketmq4.4)publicclassThreadFactoryImplimplementsThreadFactory{privatefinalAtomicLon...
2022-06-27 17:18:50 5847浏览 0点赞 0回复 0收藏
知乎上有一个热门问题:你的编程能力从什么时候开始突飞猛进?初看到这个问题,我的嘴角微微上扬。记忆闪回到了2013年,那一年,命运给我了一点点正反馈,我有点喜欢编程了。这篇文章,我想和大家聊聊勇哥读书,看源码,重构,解决线上问题的那些事。1.初心2011年,我服务于一家互联网彩票公司。坦率的讲,选择程序员这个职业,仅仅是为了生存。那个时候,我对缓存,消息队列,分布式,JVM一知半解,背了一些八股文,只是能非常...
2022-06-27 17:18:33 4467浏览 0点赞 0回复 0收藏
前言大家好,我是捡田螺的小男孩。本文是后端思维专栏的第四篇哈,今天这篇比较简单。日常工作中,我们开发接口时,一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的,没有统一处理的话,代码就不优雅,也不容易维护。所以,作为一名合格的后端开发工程师,我们需要统一校验参数,统一异常处理、统一结果返回,让代码更加规范、可读性更强、更容易维护。•使用...
2022-06-27 17:18:09 7212浏览 0点赞 0回复 0收藏
前言前一段时间,有同事使用ThreadLocal踩坑了,正好引起了我的兴趣。所以近期,我抽空把ThreadLocal的源码再研究了一下,越看越有意思,发现里面的东西还真不少。我把精华浓缩了一下,汇集成了下面11个问题,看看你能顶住第几个?1.为什么要用ThreadLocal并发编程是一项非常重要的技术,它让我们的程序变得更加高效。但在并发的场景中,如果有多个线程同时修改公共变量,可能会出现线程安全问题,即该变量最终结果可能出现异常...
2022-06-27 17:17:39 4996浏览 0点赞 0回复 0收藏
5.ThreadLocal真的会导致内存泄露?通过上面的Entry对象中的key设置成弱引用,并且使用get、set或remove方法清理key为null的value值,就能彻底解决内存泄露问题?答案是否定的。如下图所示:假如ThreadLocalMap中存在很多key为null的Entry,但后面的程序,一直都没有调用过有效的ThreadLocal的get、set或remove方法。那么,Entry的value值一直都没被清空。所以会存在这样一条强引用链:Thread变量Thread对象ThreadLocalMapEntry...
2022-06-27 17:17:12 6502浏览 0点赞 0回复 0收藏
有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16s938ms(execution:16s831ms,fetching:107ms),按照下文的方式调整SQL后,耗时347ms(execution:163ms,fetching:184ms);操作:查询条件放到子查询中,子查询只查主键ID,然后使用子查询中确定的主键关联查询其他的属性字段;原理:减少回表操作,利用延迟关联或者子查询优化超多分页场景。优化前SQLSELECT各种字段FROMtablena...
2022-06-27 17:16:47 4757浏览 0点赞 0回复 0收藏
SQL解析SQL解析过程分为词法解析和语法解析两步,比如下边这条查询用户订单的SQL,先用词法解析将SQL拆解成不可再分的原子单元。在根据不同数据库方言所提供的字典,将这些单元归类为关键字,表达式,变量或者操作符等类型。SELECTorderno,priceFROMtorderwhereuserid10086andorderstatus>0接着语法解析会将拆分后的SQL转换为抽象语法树,通过对抽象语法树遍历,提炼出分片所需的上下文,上下文包含查询字段信息(Field)、表信...
2022-06-24 17:38:23 6936浏览 0点赞 0回复 0收藏
作为ShardingJDBC分库分表实战系列的开篇文章,我们在前文中回顾了一下分库分表的基础知识,对分库分表的拆分方式有了一定的了解,下边我们介绍一下ShardingJDBC框架和快速的搭建一个分库分表案例,为讲解后续功能点准备好环境。一、ShardingJDBC简介ShardingJDBC最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为ShardingSphere,2020...
2022-06-24 17:38:14 1.3w浏览 0点赞 0回复 0收藏
很多年前,读了子柳老师的《淘宝技术这十年》。这本书成为了我的架构启蒙书,书中的一句话像种子一样深埋在我的脑海里:“好的架构是进化来的,不是设计来的”。2015年,我加入神州专车订单研发团队,亲历了专车数据层「架构进化」的过程。这次工作经历对我而言非常有启发性,也让我经常感慨:“好的架构果然是一点点进化来的”。1单数据库架构产品初期,技术团队的核心目标是:“快速实现产品需求,尽早对外提供服务”。彼时的...
2022-05-17 17:46:21 5488浏览 0点赞 0回复 0收藏
5从SQLServer到MySQL业务依然在爆炸增长,每天几十万订单,订单表数据量很快将过亿,数据库天花板迟早会触及。订单分库分表已成为技术团队的共识。业界很多分库分表方案都是基于MySQL数据库,专车技术管理层决定先将订单库整体先从SQLServer迁移到MySQL。迁移之前,准备工作很重要:1.SQLServer和MySQL两种数据库语法有一些差异,订单服务必须要适配MySQL语法。2.订单orderid是主键自增,但在分布式场景中并不合适,需要将订单i...
2022-05-17 17:46:15 4673浏览 0点赞 0回复 0收藏
阅读一篇「定时任务框架选型」的文章时,一位网友的留言电到了我:我看过那么多所谓的教程,大部分都是教“如何使用工具”的,没有多少是教“如何制作工具”的,能教“如何仿制工具”的都已经是凤毛麟角,中国软件行业,缺的是真正可以“制作工具”的程序员,而绝对不缺那些“使用工具”的程序员!......”这个业界最不需要的就是“会使用XX工具的工程师”,而是“有创造力的软件工程师”!业界所有的饭碗,本质就是“有创造力...
2022-05-17 17:46:06 6764浏览 0点赞 0回复 0收藏
4中心化流派中心化的原理是:把调度和任务执行,隔离成两个部分:调度中心和执行器。调度中心模块只需要负责任务调度属性,触发调度命令。执行器接收调度命令,去执行具体的业务逻辑,而且两者都可以进行分布式扩容。4.1MQ模式先谈谈我在艺龙促销团队接触的第一种中心化架构。调度中心依赖Quartz集群模式,当任务调度时候,发送消息到RabbitMQ。业务应用收到任务消息后,消费任务信息。这种模型充分利用了MQ解耦的特性,调度中...
2022-05-17 17:45:58 1.1w浏览 0点赞 0回复 0收藏
3后端配置后端配置我尝试过两种方式,经过两个月的测试,都能非常稳定的运行。◆MND推荐的Nginx配置;◆SpringBoot自带CorsFilter配置。▍MND推荐的Nginx配置Nginx配置相当于在请求转发层配置。location{if($requestmethod'OPTIONS'){addheader'AccessControlAllowOrigin''';addheader'AccessControlAllowMethods''GET,POST,OPTIONS';CustomheadersandheadersvariousbrowsersshouldbeOKwithbutaren'taddheader'AccessControlAll...
2022-05-17 17:44:06 8103浏览 0点赞 0回复 0收藏
跨域,对后端工程师来说,可谓既熟悉又陌生。这两个月我以架构师的角色参与一款教育产品的孵化,有了一段难忘的跨域之旅。写这篇文章,我想分享我在跨域这个知识点上的经历和思考,希望对大家有所启发。1遇见跨域产品有多端:机构端,局方端,家长端等。每端都有独立的域名,有的是在PC上访问,有的是通过微信公众号来访问,有的是扫码后H5展现。接入层调用的接口域名统一使用api.training.com这个独立的域名,通过Nginx来配置...
2022-05-17 17:44:01 5366浏览 0点赞 0回复 0收藏
最近负责教育类产品的架构工作,两位研发同学建议:“团队封装的Redis客户端可否适配SpringCache,这样加缓存就会方便多了”。于是边查阅文档边实战,收获颇丰,写这篇文章,想和大家分享笔者学习的过程,一起品味SpringCache设计之美。1硬编码在学习SpringCache之前,笔者经常会硬编码的方式使用缓存。举个例子,为了提升用户信息的查询效率,我们对用户信息使用了缓存,示例代码如下:AutowireprivateUserMapperuserMapper;Au...
2022-05-17 17:29:39 6505浏览 0点赞 0回复 0收藏
3入门例子首先我们先创建一个工程springcachedemo。caffeine和Redisson分别是本地内存和分布式缓存Redis框架中的佼佼者,我们分别演示如何集成它们。3.1集成caffeine3.1.1maven依赖<dependency><groupId>org.springframework.boot<groupId><artifactId>springbootstartercache<artifactId><dependency><dependency><groupId>com.github.benmanes.caffeine<groupId><artifactId>caffeine<artifactId><version>2.7.0<version><dep...
2022-05-17 17:29:28 9186浏览 0点赞 0回复 0收藏