自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 redis+定时 模拟滑动窗口实现熔断降级

业务背景公司业务现用的通道为 A、B,为了降本,引入新的支付通道 Y,但 Y 通道的稳定性要低于 A、B,系统要能在 Y 通道故障时自动切回到 A、B,等 Y 恢复正常后,再切换到 Y。乍一看很简单,不就是熔断降级、故障恢复吗,有很多成熟的解决方案了。但有个特殊的业务场景,在支付通道的页面中(也就是输入密码的这一步)可能因为商户原因,无法继续支付。这一步已经脱离了我们自己业务的页面,所以也无法获知...

2024-02-28 10:24:30 350

原创 1小时带你成为 Excel 大神 -- 程序员也应掌握的 Excel 骚操作

文章内容背景工作中经常遇到处理数据的场景,比如:1)给一批订单ID数据,看看哪些在库里没有。查有的好查,查没有的就要复杂一些了;2)给了一张表格,用订单ID列拼成SQL 的 IN 的查询条件,英文逗号拼接;3)给定某些列的数据,生成批量操作的SQL......这些事情如果靠写代码搞定的话,成本有点高,可复用性差。如果掌握了 Excel 的一些操作,这些操作几个公式分分钟就能搞定。下面就分 3 大块...

2024-01-11 10:24:56 768

原创 线上陈年老代码,Spring Event 一个事件每次都执行 2 次,为啥?

1、现象@Componentpublic class RecomputeBaojieAmountListener implements ApplicationListener<RecomputeBaojieAmountEvent> { @EventListener @Override public void onApplicationEvent(Recompu...

2024-01-09 10:24:15 863

原创 史上最详讲解,MySQL 的 json 数据类型的存储结构(源码+图)

1、前情交代本篇文章以 MySQL 5.7 版本为例。官方文档:https://dev.mysql.com/doc/refman/5.7/en/json.html5.7.8 及以后的版本才支持,遵循 RFC7159 标准(https://datatracker.ietf.org/doc/html/rfc7159)。json 内容只能是 json object 或者 json array。支持的...

2023-12-16 10:24:59 550

原创 工作多年,第一次上手排查线上CPU飚高问题

1、背景收到 zabbix 持续报警2、排查过程2.1 先登录上报警机器,查看是哪个服务进程占用 CPU使用 top 命令查看占用 CPU 最高的进程IDTasks: 188 total, 1 running, 187 sleeping, 0 stopped, 0 zombieCpu(s): 62.3%us, 5.7%sy, 0.0%ni, 31.7%id, 0.0%wa, ...

2023-12-02 10:24:28 94

原创 NoClassDefFoundError/ClassNotFoundException 到底从哪引用到了这个类?排查思路

1、背景公司内网登录改造升级,使用方需要配合升级 jar 包。本以为很简单的事情,升级版本上线就 OK 了。没想到升级头一个服务,部署到测试环境就有问题。2、表象访问所有页面报 404。3、排查思路3.1 排除法,确定是不是升级 jar 包的问题版本回退后,一切正常,所以可以肯定是新版本 jar 包的问题。3.2服务启动是否正常升到新版本继续排查,看了服务进程在,启动日志也正常,查看 tomca...

2023-07-03 10:24:25 144

原创 接口优化从哪些方面入手?

1、背景新接手的一个服务,对整个服务熟悉后,发现调用量 TOP1 的一个接口,完全超乎我对这个接口使用场景的预期,预期几万的接口,实际调用量近 400万,和调用方交涉后,暂时无法推动调用方优化,所以只能从接口内部优化。2、存在的问题2.1 不合理的重复调用同一调用链内,连续调用3次貌似还有定时任务10分钟一次2.2 日志文件过大,浪费磁盘空间且不利于排查问题24G,一个下游且相对边缘的服务,单节点...

2023-05-11 10:24:42 127

原创 RPC 服务优雅停机、优雅重启,你的服务重启够优雅吗?

背景由于最近上线比较频繁,就遇到了一个小概率的数据不一致的问题。具体过程如下:很明显,是服务没有做到优雅停机,导致的两个服务的数据不一致。优雅停机、优雅重启,本质到底是什么?优雅重启涵盖了优雅停机、优雅启动。优雅停机:就是 JVM 进程杀掉之前,要做好各项收尾工作;常说的优雅停机一般是指 RPC 框架的工作线程 和 Spring 容器的销毁(容器中可能包含各种连接池对象的管理)。但服务复杂了之后,...

2023-04-11 10:24:26 527

原创 redis 大 key 删除踩坑记

业务场景接受某个定时任务处理流水的一个接口,使用 redis 缓存流水ID,用做幂等控制,用的数据类型是 hash,hash 内的 key=流水ID(长这个样子625736952578072728),value=UUID(长这个样子9def28a8-cd48-4fb6-9c93-0ac66b8450f5),数据量约 1600W,每月增量60W,约占 3G 内存空间。任务每月 5 号执行一次,耗时 ...

2023-04-07 10:24:05 214

原创 一次性解决打日志时的4个重复低效场景(日志脱敏、日期格式化、json序列化)...

本篇文章是对之前的两篇文章的一个总结、补充。《日志里打出来的都是时间戳?教你一行代码搞定它》《日志里的敏感信息还在打明文?3 种日志脱敏方案任你选》之前的解决方案是基于 fastjson + logback,本次补充了 fastjson + log4j。至于其他的 json 序列化框架、日志框架,大家可以继续深究,重点是解决问题的思路。背景我们在打日志的过程有 4 个重复低效的场景1、对象都是 j...

2023-03-22 10:24:09 877 2

原创 超级实用的 IDEA debug 技巧

本文截图中的图标仅供参考,不同版本的IDEA图标存在差异。进入指定方法(非常实用)shift + F7当一行代码有多个方法时,常规 F7 会按顺序一层一层的进入方法,效率低。shift + F7 能够快速选择要进入的方法。条件断点在断点处右键,设定条件,只有在满足设定的条件时,才会暂停。通过下拉箭头还能切换历史条件。光标断点Alt + F9debug 逻辑很长的方法,或者 debug 过程中提前查...

2022-12-29 10:24:31 1231

原创 述职晋升怎么准备?

核心目的是向评委展示你有给公司解决问题的能力,还有解决更高阶问题的能力素质,能给公司带来价值。什么时候开始准备?一直准备,很多人会问不应该是收到参加述职的通知再准备吗?真要等到通知再准备,不是不行,而是会少很多胜算。在你决定要参加下次述职时,就可以着手准备了。从以下三方面入手:1)主动争取一些有挑战、能做出成绩、可以体现你的价值的工作。避免机会来的时候,发现自己就是个打杂的,没什么可以拿的出手的。...

2022-12-10 10:24:45 245 2

原创 H5 通用收银台实战总结

收银台的定位为业务提供安全、多样化的收/退款能力,对业务屏蔽支付大小类和收款账户的复杂路由,对支付网关屏蔽复杂的业务场景。解释一下收银台为什么要提供退款能力?我们都知道超市里的收银台只负责收钱,退钱需要去服务台。但是线上的系统设计不能照搬线下的模式,交易类场景不能凭空产生一笔退款,一定要在某笔收款的基础上才能产生退款,因此,退款能力放在收银台不管是校验正向的收款数据,还是生成退款数据都是很方便合理...

2022-12-08 10:24:23 1429

原创 日志里的敏感信息还在打明文?3 种日志脱敏方案任你选

背景我们打的日志中经常包含姓名、手机号、银行卡号等敏感信息,如果不做任何处理,就会以明文的形式展示在日志中,存在安全风险。像下面这样:我们需要一种能自动帮我们脱敏的工具,效果如下:方案1 - 基于 logback我们得先搞清楚消息内容是在哪里处理的,也就是配置文件中这个占位符的内容:对应到源码是这里 ch.qos.logback.classic.PatternLayout :这里可以看出来都是通...

2022-09-23 10:24:55 10687 3

原创 日志里打出来的都是时间戳?教你一行代码搞定它

背景基于 fastjson1.x我们在打日志的时候,习惯把对象用 fastjson 转换成字符串后再交给日志打印。像下面这样:但等我们需要通过日志里的日期排查问题时就傻眼了,看到的日志是这个样子的:看到都是时间戳,还得拷出来找个时间戳转换工具才能知道真实的时间。看到这里是不是突然意识到这确实是个痛点啊,只是平时也没多想凑合看了。那么怎么才能把 Date 类型的数据,自动序列化成人类一眼就能看懂的...

2022-09-22 10:24:54 1343

原创 服务迁移 - RPC 服务迁移

前两篇文章总结了数据库服务迁移、Redis 服务迁移,今天继续看一下 RPC 服务的迁移。如果单纯从节点迁移考虑,就相当于扩容、缩容。但实际操作过程中会有很多坑,还是先看一下示例图。(一)假设我们要迁移 userService 服务,从 10.0.0.1、10.0.0.2 的机器迁到 10.0.0.3、10.0.0.4 的机器上。userService 调用了数据库 和 orderService。...

2022-09-10 10:24:39 368

原创 服务迁移 - Redis 服务迁移

前面我们说过了数据库服务的迁移,今天继续聊一下 Redis 服务的迁移。由于纯 [主 - 从] 结构主节点挂掉后不能自动切换的缺陷,生产环境一般很少使用此结构,我们就直接从哨兵结构说起。哨兵结构的迁移场景一:只迁移 redis 实例节点操作步骤(一)在新的机器上先搭建一套端口相同的主从节点,M2,R2,把 M2 作为从节点,挂在老的 R1 上,通过 Redis 自有的主从同步功能,同步数据。(二)...

2022-09-05 10:24:19 1273

原创 Windows 环境安装 Redis

18 年的时候由于好奇 + 装X + 活动优惠,买了个 3 年的阿里云服务器,想着没事练练手,可直到服务器过期,也没练过几次,不知道有多少小伙伴跟我一样...最近想在本地(Windows 系统)装个 Redis,发现得先装 Linux 环境,才发现当初年少无知,花了冤枉钱..话不多说,直接看整个安装过程。重点是 使用 Xshell 连接 WSL 有点坑。先确认 Windows 系统版本必须高于 W...

2022-09-03 10:24:45 2145

原创 服务迁移 - 数据库服务迁移

服务迁移是个大的概念,可以细分到很多种服务, 数据库服务迁移、redis 服务迁移、RPC 服务迁移 等等。本次就聊一下我经历过的数据库服务迁移。场景一:连接信息都不变,业务服务不重启操作步骤(一)先开启 DTS 同步全量、增量数据(二)数据同步一致后,切换域名指向新库此时连接池里新创建的连接(c4、c5、c6)会和新库建立 TCP 连接,连接池里老的连接(c1、c2、c3)对应的 TCP 连接还...

2022-08-20 10:24:22 640

原创 事务提交了,数据却丢了?-- 一次锁等待问题排查

|| 问题现象技术栈:Spring 事务 + 阿里云 RDS (MySQL 5.6.16)用了好几年且没有任何改动的一个功能,从管理后台通过文件往系统里导入 2120 条数据,代码逻辑是在一个事务里处理这批数据,结果发现丢了 1596.5 条数据。有 0.5 是因为每条数据同时有 插入 t1、更新 t2 两个动作,插入 t1 丢了,更新t2成功了,后面也会重点分析这 0...

2022-08-13 10:24:57 1190 1

原创 对账中心设计与实现

我们在工作中肯定听过很多“xx中心”,用户中心、商品中心、订单中心……今天要和大家聊的正如题所述--对账中心,它不像其他中心的名气那么大,甚至很多人都没有听过它,但是它的地位的确很重要,尤其是在微服务架构流行的当下。下面我们就一步步的认识并了解对账中心。1、系统的设计一定要以满足业务需求为前提,不能为了炫技而过度设计。2、要善于发现系统的痛点,这样才能不断完善。httpshttpshttpshttpshttpshttpshttpshttpshttps。...

2022-07-28 11:42:20 1414

原创 线程池 - 还可以这么理解?

关注公众号【1024个为什么】,及时接收最新推送文章! 我相信有一部分面试官有这样的想法,只不过是占少数而已。他们会在网上找一些面试题,自己大概研究一下(有的自己也稀里糊涂),就拿来考核应聘者。如果只是聊基本的使用,不拿底层原理为难为难你,不仅显得自己的技术水平一般,也彰显不出公司的技术实力。那些经典的面试题,相信大家都耳熟能详,而线程池的底层实现可谓是经典中的经典。但是在日常的业务开发中,很少会用到多线程,线程池就更少了。所以,知不知道底层原理,就可以看出你是不是对技术有一定的钻研精神,是不是一个

2022-07-28 11:39:34 301

原创 依赖注入、循环依赖 - 你真的了解吗?

我是一台豆浆机,要打出豆浆就需要水、豆子(依赖的2个对象),谁使用谁就要负责加水、放豆子,我提供打豆浆的功能,但需要的东西(对象的值)要由使用方在使用的时候提供(注入)。至于我们使用时,这个属性为什么不是null,那是因为在JVM实例化结束后,Spring又从自己的bean工厂中拿到待赋值的属性对应的对象(就算重新new一个也不会产生循环依赖),通过反射给赋上值的。这种通过构造参数赋值,如果用无参的new(),在编译时就会报错,如果使用反射绕过编译器,真正执行的时候也会报错(找不到无参的构造)。...

2022-07-28 11:35:44 516

原创 你的bean拷贝工具好用吗?

就形成了vo一般都采用String类型来接收这些有差异的数据类型的解决方案,但dto和数据库需要的类型又是其真正对应的数据类型。主要是Long、BigDecimal等类型前后端精度问题,vo里一般都定义为String类型,但类型不同的属性在拷贝时又会被略过。三方工具默认只支持同名同类型属性间的赋值,毕竟不同类型属性赋值存在类型转换异常的风险,所以三方工具的做法也是合理的。回想我们的使用场景,都是明确的同一业务场景下的对象拷贝。不同的三方工具,提供的转换器不同,有一定的学习成本;...

2022-07-28 11:27:20 193

原创 500W数据动态同步到ES

另一种是管理后台(查询兼统计功能),很多检索条件,其中就包含很多像status、type这种区分度很低、建索引也不起任何作用的检索条件,页面还带有分页功能,只要检索条件带有区分度低的条件,count语句就等同于全表扫描,耗时都是分钟级别。,查询最近1天(业务量大也可以按小时)的增量数据,取出主键ID,再去ES查询,两边结果做比对,不一致的以MySQL为准直接覆盖ES(或者也可以加一个时间对比逻辑,以最后更新的为准),ES缺少的直接同步过去。使用第三方的服务插件,监听binlog,实现数据同步。...

2022-07-28 11:26:40 753

原创 一款好用、易扩展的文件解析引擎,是怎么演变而来的

最近公司要新接入一个支付渠道,涉及到公司和三方的对账。由于三方对账内容格式太特殊,需要对文件解析引擎改造适配,实际改造耗时比预估的要少很多,回过头总结才发现,原来解析引擎经过前几次的迭代变得越来越易扩展,如果不是这次文件内容格式太特殊,连兼容改造都省了。接下来就回顾一下它是如何一步步拥有今天这种能力的。《对账中心设计与实现》这篇文章里提到,对账中心里有一个重要的组成模块就.........

2022-07-22 10:24:40 465

原创 PrepareStatement 是如何高效替换问号的?

本篇文章基于 MySQL Connector/J 5.1.40, clientPrepareStatement 模式。写前 2 篇文章看源码时,发现 PrepareStatement 替换问号的方案比想象的要复杂、高效,总结一下加深印象,以后有类似的场景也可以借用此方案。从一个带问号的 SQL 语句到一个正常的带真实参数的 SQL 语句,可以分为下图中的三步。本次就以下......

2022-07-18 10:16:44 795

原创 深究 PrepareStatement

本篇文章基于 MySQL Connector/J 5.1.40。上篇文章《写个任务,翻车了 -- 记一次内存溢出排查》说到, JDBC42PreparedStatement 对象导致了内存溢出,我们今天就带着上篇里的疑问,好好研究一下 Statement,以免日后再犯低级的错误。先来回顾一下事故现场|每个对象 23K,对象里到底存了什么,这么大?先看一下JDBC42P......

2022-07-16 10:24:03 1020 2

原创 写个任务,翻车了 -- 记一次内存溢出排查

本文内容:1、背景2、技术方案3、翻车了|| 背景前段时间搞数据加密,需要把数据库中现有的某些列加密存储。公司定的技术方案是由服务层做这项工作,不同的服务分配不同的秘钥,秘钥泄露也只会影响这一个服务,安全性更高。架构组提供加密算法包,各业务自己完成加解密的工作。这其中有一项艰巨的任务,对历史数据的加密。由于不能在数据库层面批量处理,架构组也没有提供统一处理的方案,各业务......

2022-07-13 10:24:19 310

原创 日志对性能的影响以及我的几个日志习惯

本文内容:1、背景2、影响性能的日志因素3、好的日志习惯|| 背景写这篇文章有 2 个原因,一是前段时间架构组同事的一次性能优化分享,单单日志(log4j2)这一项优化性能就提升了 19 倍,QPS 从1660 升到 32000,被震撼到了。二是最近接手的一个项目中,日志加了彩色打印,按日志的级别设置了不同的高亮颜色,看得我眼花缭乱,用 less 等一些命令查看时还会展.........

2022-07-07 10:24:30 2354

原创 3 张图带你看透 LongAdder

本文内容:1、AtomicLong 解决并发的方案?2、AtomicLong 的不足是什么?3、LongAdder 又是怎么弥补这一不足的?在我的过往经历中,用到原子类的地方不多,就算用到了,AtomicInteger 也能满足业务场景,其它几个原子类从来没用过。为什么研究 AtomicLong 和 LongAdder ?一是前段时间组内一起学习并发相关知识的过程中涉及到......

2022-06-30 10:24:19 121

原创 MySQL 执行计划里的含义总是记不住怎么办?干脆不记了

1024个为什么1024个为什么2021-12-15 20:44本文内容:1、按自己的理解 整理一份MySQL 执行计划表格看过很多次的 MySQL 执行计划,当时明白了,等用的时候又忘了,很是烦恼。记不住的原因无非是:1)使用频率低,一年也不用几次2)可推理性很弱,只能靠死记硬背所以干脆不记了,按自己的理解整理一份表格,用的时候快速查一下。想起小时候的馒头房,都是......

2022-06-27 10:24:26 189

原创 说说代码评审

本文内容:1、代码评审的目的2、评审准备工作3、评审过程中容易出问题的点4、共同成长近一段时间以来,组内严格实行代码评审制度。参与过多次评审后发现,一次有效的代码评审并不简单,把一些思考做一下总结。|| 代码评审的目的|提前发现问题问题发现越早,解决成本越小,带来的损失也越小。|保证代码库的健康状况随着时间推移,代码库的健康状况往往会下降。通过代码评审,如果能使代码......

2022-06-25 10:24:19 1112

原创 Spring 扩展实战,自动创建 RPC 框架代理对象

本文内容:1、背景2、实现方案3、注入失败了?4、排查解决5、更优方案事情的起因是想研究一下,能不能把公司自研 RPC 框架和 Spring 完美整合一下。|| 背景我司使用的是自研的 RPC 框架名字叫 DSF,和 Spring 结合的不是很完美,项目中用到其他服务的 client 实例时,只能先通过框架提供的代理工厂类创建出所依赖的 client 的实例后才能使用。......

2022-06-24 10:24:57 210

原创 0000-00-00 00:00:00 的坑,你踩了吗?

本文内容:1、起因2、MySQL 对 0000-00-00 的支持3、Java 对 0000-00-00 的支持4、为什么线上的代码能正常运行?|| 起因前几天组内有系统做了数据库迁移,MySQL版本 5.6.16,其中某张表的一个字段是这么定义的:create_timeTIMESTAMPDEFAULT'0000-00-0000:00:00'COMMENT'...

2020-09-05 10:24:00 2400

原创 官网的技术文档该如何上手?

本文内容:1、为什么我们不喜欢在官网查资料?2、为什么要优先从官网查资料?3、如何上手?作为一名程序员,学会从官方文档查资料,就像学会查字典一样,是一项必备且终身受益的技能。|| 为什么我们不喜欢在官网查资料?|英语水平差,看不懂我们工作中用到的技术,从编程语言到各种框架,绝大多数都起源于欧美,英语又是全球通用语言,再加上IT圈的开源、无国界理念,所以官方的技术文档也...

2020-08-31 10:24:57 221

原创 static属性能用@Autowired注入吗?

本文内容:1、起因2、static3、@Autowired4、解决方案先说结论:不能。|| 起因从某系统交接过来一部分功能的代码,其中包含了一个工具类,该工具类中用到了一个Component的方法。原系统的实现是:publicclassCityUtil{ public static List<City> getCitiesByProvince...

2020-08-30 10:25:08 2738

原创 前后端分离,如何提供一套优秀的接口

本文内容:1、提供接口前,要有哪些准备工作?2、提供什么形式的接口文档?3、接口文档应该包含哪些内容?4、还有哪些“看不见”的坑?之前一直负责中后端的服务,写的接口也都是RPC接口。不过最近做的几个需求,都涉及到了和用户直接交互的WEB接口。我们团队采用的是前后端分离的开发模式,为了提升开发效率、质量,减少扯皮,一份清晰明了的接口文档是必不可少的。提供接口前,要有哪些准备...

2020-08-10 10:24:08 353

原创 有了这些好习惯,MQ 服务挂了也不怕

前几天公司MQ服务异常,大量的消息被拒收。这种底层的支撑服务一旦出问题,影响范围可想而知,我负责的几个服务里就有被波及的。今天不讨论如何保证MQ服务的高可用,我对这块也不熟悉,也没人能保证服务永远不出问题。我就从使用方的角度反思一下,如何用好MQ服务,如何让自己的业务在出现问题后受到的影响最小。我们服务中的使用场景1、两个服务的数据没有强一致性的要求,下游服务处理流程长/...

2020-05-21 10:24:20 141

原创 如何自动优雅的校验方法入参并友好返回

方法的入参校验,应该是编码过程中高频的操作了。这个费时费力又没有技术含量的步骤,有没有更优雅的解决方案?看过很多篇关于入参校验的文章,感觉提供的解决方案还是不够便捷,索性就自己写一个吧。常规做法一:写很多的if....,弊端就不用多说了直接上代码if(Objects.isNull(userType)){ logger.warn( "test verify:{}...

2020-05-13 10:24:00 241

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除