自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (1)
  • 收藏
  • 关注

原创 平台系统的微信支付服务突然不可用问题记录

com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager属于wechatpay-apache-httpclient包,是微信支付开源的官方依赖包,项目地址:https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient。查看日志,发现“支付聚合服务”调用“微信支付服务”的http请求返回read timeout,问题很显然出在“微信支付服务”。

2024-04-16 22:18:43 688

原创 平台系统报OOM unable to create new native thread异常

接下来,我发现应用日志有些问题:输出这个异常日志的应用,并不是它报这个异常,而是它发起http请求其他应用,其他应用返回这个异常,真正有异常的是这些应用。通过查询日志服务,发现增加响应码500过滤后,今天虽然没有日志,但昨天有日志,同时还发现昨天的日志都是同一个K8S的worker节点上应用输出。这么多应用一起报这个异常,核心应用和非核心应用都有,而且这些应用并不在同一个调用链路上,所以判断和这些应用无关,应该与应用所在机器有关。确认是K8S集群的这个worker节点异常,导致这个节点上的应用报异常。

2024-04-15 16:39:19 297

原创 年耗资百万数据库升级记录

平台系统核心组件数据库升级,如何确保升级的成功和保障尽量短的停机时长

2022-07-27 09:35:14 206 1

原创 客户端与平台存在有状态连接的系统蓝绿发布方案设计

背景有这样一个系统,客户端(设备或本地系统)与平台之间建立着有状态的连接(如TCP长连接),连接上有实时业务,偶然断开就会导致业务中断,影响用户使用。但系统需要建设“蓝绿”发布机制,客户端需要在“蓝绿”这2个环境之间做切换,如何保障切换时不影响业务呢?方案设计方案一平台在“蓝绿”切换时,发送对应环境的服务器地址给客户端,客户端采用新地址重连平台。优点: 简单。缺点: 切换操作触发重连,会中断业务。只能选择凌晨这些业务量少的点做切换,但还是不能百分百保证不影响业务。当然如果切换很快,可以采用客户

2022-05-27 22:37:49 305

原创 主导问题排查的流程总结

背景作为技术团队的负责人,我们日常少不了主导线上系统的各种问题排查,那么主导问题排查是否有一些套路呢?个人自己排查或主导排查线上系统各种问题近百次,从中总结了一些自认为的流程“套路”,记录分享于此,个人浅见,大家多多讨论。流程召集相关人汇总问题信息梳理排查方向分配排查任务汇总排查情况同步信息给问题关切方文档主导问题排查的流程总结...

2022-04-16 19:56:03 184

原创 软件系统问题排查的一般流程

背景我们软件开发人员,经常需要排查一些问题,问题可能千奇百怪,各不相同,但排查的多了,总觉得有一些通用的原则,故尝试总结出来。步骤明确问题的重要和紧急程度确定问题,并尽量复现问题找到问题入口寻找怀疑点并验证给予答复文档软件系统问题排查的一般流程...

2022-04-12 00:07:56 833

原创 绩效考核自评过程想到的项目管理

背景绩效考核自评,是每个人在一个《绩效考核自评.xlsx》模板文件中列出自己这个季度的每项工作的内容、工作量占比(加起来100%)、绩效系数(0-1的1位小数),最后生成一个加权平均的绩效系数。经历组员发出来第1版都没有“加权平均绩效系数”这一项。由此想到,多人协作的事情一定要有清晰的规则,如写代码要有规范一样。大部分人其实并不太会为他人考虑。没有“加权平均绩效系数”,就得主管一个个计算啊。之后,我召集大家开会,告知这一规则并给出一个有计算公式的模板。组员接着发过来第2版,存在问题:大部分

2021-10-27 20:21:23 157

原创 SpringAOP切面编程实践建议

背景AOP,面向切面编程,理念深入人心,使用范围也很广。在日常开发中,我们经常用Spring AOP实现一些横向功能复用,比如下列场景方法或外部接口调用增加入参出参及耗时日志拦截方法调用增加本地或远端分发接口增加鉴权或限流逻辑大部分情况下,我们实现AOP功能时,切点通常采用@Pointcut注解描述,采用execution表达式形式如@Pointcut("execution(* cn.biz.abc.xyzClass.methodA(..))")。这种实现方式有没有什么缺点呢?

2021-10-25 19:35:35 147

原创 RedisTemplate写入Redis数据出现乱码补充

上篇RedisTemplate写入Redis数据出现无意义乱码前缀\xac\xed\x00\x05,我在排查问题及给同事分享过程中,获得了一些收获,这里补充记录下。关于中文Java里中文采用UTF8编码,占3个字节。如粤,UTF8编码为\xE7\xB2\xA4。所以按上篇文章计算数据长度时,1个汉字占3个字节。关于乱码显示乱码显示并不影响用实际数据去直接查询。如上一篇样例\xac\xed\x00\x05t\x00-abcd:abc:xxxxxx:passport:associated:key:29

2021-10-21 19:07:41 340

原创 云存储服务文件访问安全问题

背景随着阿里云、腾讯云等云服务平台的兴起,现代应用系统越来越依赖云服务进行构建,其中图片等文件存储也有云服务商提供产品,如阿里云的OSS。基于这些产品实现系统的文件等资源存储访问特别方便,但方便的同时,我们如果保护自己的文件安全呢?这里的安全,我们不讨论云服务厂商私用我们文件资源的情况,因为我们使用这些云厂商产品,就是选择相信他们,而信任也是云厂商生存的根本,不会有人自绝其根。我们主要讨论的是,在我们暴露这些资源给外部访问时,如何保护资源不会被其他人爬取而泄露关键数据如用户隐私,对我们产品造成严重影响

2021-07-18 19:37:29 298

原创 RedisTemplate写入Redis数据出现无意义乱码前缀\xac\xed\x00\x05

背景项目使用Spring的RedisTemplate进行Redis数据存取操作,实际应用中发现Redis中key和value会出现“无意义”乱码前缀\xac\xed\x00\x05t\x00-(样例\xac\xed\x00\x05t\x00-abcd:abc:xxxxxx:passport:associated:key:29708)。这个乱码前缀是怎么产生的呢?有什么含义?是不是固定的?带着这三个问题,我们一探究竟。疑问探究怎么产生的org.springframework.data.redis.c

2021-07-13 23:27:43 7512 5

原创 Druid连接池耗尽问题排查总结

背景生产环境有个关键应用所有节点,每隔几个月就会发生一次Druid连接池耗尽问题,重启后恢复正常。目前我们还没有定位到问题原因,这边文章主要记录定位过程的一些思路和方法,后续如果找到根本原因,再做更新。思路数据库方向应用连接池耗尽1、会不会是应用与数据库的连接没有正常断开?查看故障时数据库socket连接情况,没有发现。2、会不会是应用执行了很多慢sql?查看故障时数据库慢sql日志,没有发现。3、会不会是应用执行了长事务?查看故障时数据库事务情况,没有发现。应用方向应用连接池耗尽

2021-06-11 20:12:22 9483 7

原创 MySQL哪些常用DDL操作会锁表

问题我们后端开发人员在实现业务修改时,经常需要更新数据库表结构,如增加字段、修改字段长度等等。那么对于MySQL数据库,哪些表结构操作会“锁表”,会导致读写表中数据操作不能并发执行呢?背景知识DML( data manipulation language),数据操作语句,是中INSERT、UPDATE、DELETE、SELECT等表数据操作的语句。DDL( data definition language ),数据定义语句,是指CREATE、ALTER、MODIFY、DROP等操作表结构相关的语句。

2021-05-31 23:22:03 6652

原创 不了解事务隔离级别?你的业务代码可能有问题

背景知识好多开发同学都知道事务有四大特性ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),但对隔离性的具体内容却不太清楚。SQL标准的事务隔离级别有4种:读未提交(read uncommitted,简写ru)、读提交(read committed,简写rc)、可重复读(repeatable read,简写rr)、串行化(serializable)。事务隔离其实是一种并发保护机制。MySQL的事务隔离是引擎层实现的,In

2021-05-14 18:54:56 134 2

原创 ScheduledThreadPoolExecutor定时任务会消失

ScheduledThreadPoolExecutor定时任务会消失背景我们通常使用Java原生ScheduledThreadPoolExecutor实现定时任务,当我们遇到定时任务不再执行情况时,一查会发现没有任何错误日志,线程还在但定时任务就是不执行,仿佛消失了,这是什么原因呢?举例下面例子代码,预期是每隔5秒执行一次DivideZero,但实际上只会执行1次,而且不会抛出任何异常。public class DelayTaskException { private static fina

2021-05-08 19:25:17 1393

原创 AxureShare太慢,自己搭建产品原型分享系统

背景我们的产品人员用Axure做产品原型,通过Axure Share共享给项目组成员访问。但Axure Share的服务器在美国,国内访问很慢,特别影响工作效率。解决方案Axure可以将原型导出成html,这个html其实是一个静态网站,本地直接浏览器打开可以正常访问。那么我们可以自己搭建网站服务实现产品原型共享。关键是要打通整个流程,让产品人员只做少量的操作就可以实现原型共享。组件git仓库软件gogs(其他git仓库软件也可以,只是我们项目原本就用gogs做源码版本管理)python

2021-04-16 18:28:15 2644

原创 Java泛型知识

泛型泛型是一种高阶抽象,是将数据的类型参数化。是Java语言的“语法糖”——编码时有泛型,运行时没有泛型,都是Object。应用场景泛型类。适用于容器类型,如Bag、List。Java里面有Future<T>, List<T>泛型接口。泛型方法。好处类型安全。编码时已经限定放入什么,就取出什么,没有ClassCastException。代码重用。如何在运行期获取实际类型信息运行期获取泛型类对应实际类型信息,/** * 获取具体Handler处理的泛型类 *

2021-04-14 18:15:04 83

原创 程序响应慢了,看看资源池

程序响应慢了,看看资源池资源池,是指线程池、数据库连接池、redis连接池、http连接池等程序的池化资源。资源池,好的地方是,一方面解决了频繁创建销毁资源的开销;另一方面对资源加了限制,防止耗尽系统所有资源。不好的地方是,当某些业务因为异常,占用资源池较多资源时,其他业务获取不到资源或获取时间变长,慢点就出现了。现象会表现在资源池,当然,这不是资源池的错。慢,通常会表现为某些请求响应慢或无响应。现在系统,大量使用线程池,线程是基本工作单元,不管是什么业务因为什么资源池引起的慢,最终都会表现为线程池

2021-03-12 18:44:00 186

原创 alias简化k8s命令,节约生命

alias简化k8s命令,节约生命日常运维中,我经常用到k8s命令,每次输入kubectl -nmynamespace get pod -o wide | grep xxx,很费时间。浪费时间等于浪费生命,所以总结了一些日常用的command,整成alias。如下,供大家参考。#kubectl命令alias k8s='kubectl'#常用namespace访问。注意yournm要改成你的namespacealias k8snm='kubectl -nyournm'#查找指定名称的pod,用

2021-03-05 18:01:51 900

原创 查找Java应用指定类实例数量

查找Java应用内指定类实例数量背景最近,用户反馈我们系统某个业务慢。我们通过使用arthas trace追踪到是ch.qos.logback.core.OutputStreamAppender.writeBytes方法耗时长,而OutputStreamAppender是ch.qos.logback.core.ConsoleAppender的父类。我们系统日志组件采用logback,输出到控制台,高并发下ConsoleAppender写日志慢。由此,我们想确定ConsoleAppender是否是单例

2021-01-27 18:47:30 1704

原创 JDK默认GC算法是个谜

JDK默认GC算法是个谜背景我们系统采用openjdk:8u212-b04-jdk-stretch作为基础镜像,java -version命令输出: openjdk version "1.8.0_212" OpenJDK Runtime Environment (build 1.8.0_212-b04) OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)从输出信息可以看出是1.8.0版本的OpenJDK。现在因为应用

2021-01-25 20:21:13 1253

原创 Eclipse运行SpringBoot项目报找不到或无法加载主类问题

现象Eclipse运行SpringBoot项目报错:找不到或无法加载主类 cn.a.b.c.d.Application原因项目依赖较多的jar包,classpath很长,超过了长度限制(Windows命令行长度32757个字符),导致启动不成功。解决Eclipse菜单Run -> Run Configururations -> Java Application 找到你的Application,选择Classpath,勾选“Use temporary JAR to specify cl

2020-12-02 13:44:06 2902

原创 RestTemplate实例化问题

RestTemplate实例化方式方式1,直接newRestTemplate restTemplate = new RestTemplate() 这种方式使用SimpleClientHttpRequestFactory创建JDK的HttpURLConnection进行http请求。http连接超时时间connectTimeout和读取超时时间readTimeout都是0。方式2,使用RestTemplateBuilderRestTemplate restTemplate = new RestT

2020-08-28 13:05:25 1947

原创 SpringCloud多线程链路追踪

SpringCloud项目,如果采用sleuth实现链路追踪,使用线程池时用建议Configuration配置方式实例化线程池Bean,这样可以用到sleuth链路追踪,输出日志有traceId和spanId,方便我们查看整个执行日志。定义有2种Executor可以定义Spring的ThreadPoolTaskExecutorJDK的ThreadPoolExecutorimport org.springframework.context.annotation.Bean;import org

2020-08-21 18:41:04 2818 4

原创 Java线程池知识总结

Java线程池知识总结为什么会有线程池创建线程开销大,主要是时间和内存开销。Java线程是映射到操作系统用户线程,创建时需要分配栈空间、计数器等。占用空间大小由-Xss控制,默认是1M。每次手动创建线程难管理。机器的CPU和内存资源能支持的线程数是有限的,创建过多的线程会争抢CPU和占用过多内存,造成程序响应慢甚至“假死”。线程池原理数据库连接池等池化资源,一般使用流程:获取资源 -> 执行操作 -> 归还资源。线程池则不同,实现方式是:生产者-消费者模式。

2020-08-13 18:48:05 116

原创 一个换行符引起的异常

问题描述及定位过程周末收到现场问题:一台设备能连上平台但无法正常登陆。我们每个设备都有一个自定义唯一编号,这个编号用于设备登陆平台时校验设备身份。现在设备能与平台建立socket连接,但无法登陆,应该就是这个编号验证不通过。平台日志显示:设备登陆时报编号不存在异常。但我复制这个编号,手动去平台数据库查又可以找到,奇了怪了。我一通查看代码,没找到问题。我盯着日志看,突然发现一个异常:设...

2020-04-02 17:55:32 343

原创 阿里云ARMS引起程序死锁记录

背景ARMS是阿里云开发的一款收费实时监控服务。因为价格较贵,我们只在测试环境尝试使用ARMS,主要验证引入ARMS对系统是否有影响、是否有助于监控系统及定位问题。在生产环境,我们没有使用ARMS。最近2天,我们收到测试环境阿里云告警,某个Java应用程序出现死锁。接下来,我尝试定位死锁的原因。定位过程首先,通过jstack -l PID命令输出程序堆栈信息及死锁信息。死锁信息如下,...

2020-04-01 18:25:36 553

原创 Java线程池使用引起的一点思考

今天遇到这样一段代码,具体业务代码略掉,只留框架 ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); Thread task = new Thread(new Runnable(){ public...

2020-04-01 18:10:28 127

原创 FreeSwitch公网语音对讲可以接通但没有声音问题探究

背景公司业务用到对讲系统,采用FreeSWITCH自己搭对讲服务器。原本有一台对讲服务器部署在华为云,因为价格贵及经常受攻击的原因,要迁移到阿里云服务器。于是,运维人员在阿里云服务器部署一个FreeSWITCH,版本比原FreeSWITCH新,配置基本复制原FreeSWITCH。问题阿里云FreeSWITCH部署好后,我们发现局域网内2台对讲机可以相互呼通并通话,公网2台对讲机(比如一个在公...

2020-03-23 16:43:38 8123

原创 Docker私服硬盘满问题

背景我们公司系统采用微服务架构,每次提交代码自动利用Jenkins构建成Docker镜像推送到Harbor私服,然后部署到K8S环境。我们的持续集成环境Jenkins、Nexus和Harbor都部署在一台服务器上。问题过年放假回来,我发现Jenkins构建非常慢。分析过程首先,我怀疑是不是硬盘满了。通过df -h命令查看文件系统 容量 已用 可用 ...

2020-03-09 18:26:30 1344 5

原创 Java正则表达式使用注意事项

我们写代码时经常遇到要对字符串进行校验、提取、替换等操作,利用正则表达式可以很方便地完成这些处理。Java原生支持正则表达式,但使用时有些地方需要注意。JDK的正则表达式涉及2个类:Pattern和Matcher。Pattern,表示一个正则表达式对象。Matcher,通过Pattern对象的matcher方法生成,参数是我们的原始字符串。表示Pattern对象对这个字符串进行正则相关操作的...

2020-03-09 17:27:34 653 1

原创 Spring Cloud Stream消费Kafka消息出错时消费3次问题探究

背景系统采用Spring Cloud Stream框架集成Kafka来实现异步消息。问题客户端消费某个topic消息出错时,会连续输出这个消息内容3次,同时没有提交offset。当有大量消息出错时,topic出现消息积压。分析首先,我们知道实现异步消息的系统架构一般包含3个部分:生产者Producer、消息中间件Broker、消费者Consumer。其中,消息中间件Broker,是...

2020-01-17 12:04:33 2287

原创 Jenkins利用k8s集群实现动态Slave并发构建

Jenkins利用k8s集群实现动态Slave并发构建环境Jenkins Master采用war包直接jar -jar jenkins.war本地服务器运行Jenkins安装Kubernetes Plugin插件K8S集群正常设置Jenkins -> Configure System -> “云” -> kubernetes相关配置。问题不能并发创建Slave Po...

2019-10-12 18:02:18 2005

原创 Java源码Finalizer类理解

Finalizer类可以理解JVM为JAVA语言提供的全局性对象释放资源类(类似C语言的析构方法)。Finalizer类有一个全局储存Finalizer对象的ReferenceQueue和一个优先级较低的执行线程FinalizerThread。Finalizer类以链表的形式将需要释放资源的对象维护成Finalizer对象链。实现了finalize方法的类被JVM标记为f类,...

2019-09-16 21:35:12 679

原创 微服务利用redission实现Redis分布式锁的一次问题定位

微服务利用redission实现Redis分布式锁的一次问题定位背景系统是微服务架构,一个服务部署多个节点。某个业务由消息触发,可能出现多个消息触发多个节点同时处理同一个业务情况,最终导致这个业务表现不正常。多个节点同时处理同一个业务,本质上是并发问题,一般处理方法是对临界资源加锁(这里同一个业务即是临界资源)。因为是分布式系统,所以采用Redis实现分布式锁。利用redission库...

2019-09-16 21:16:15 1123 4

原创 CyclicBarrier用法注意

CyclicBarrier用法注意背景最近,接运维报,生产环境某个Java应用内存一直缓慢增长。分析我们JVM堆内存配置最大和最小是一样,不可能增长;只可能是非堆内存增长。非堆内存包括类数据、线程、JIT编译的代码、GC数据、常量池、Internal、Compiler等等。具体参考NMT Memory Categories通过Spring Boot Admin查看应用详情,发现应用的...

2019-07-13 16:41:48 355

原创 Jenkins使用Git Parameter时Tag列表排序问题

Jenkins使用Git Parameter时参数列表排序问题背景我们使用Jenkins进行项目构建,在提测某个tag时,利用Git Parameter插件手动选择tag进行构建。问题用于选择的tag列表没有顺序,很不方便选择最新的tag。如下图,解决方案Git Parameter插件可以配置参数排序方式。如下图,我们选择DESCENDING_SMART(智能倒序),排序后效果如...

2019-07-13 11:08:08 3452

原创 MySQL采用order by limit分段取数据汇总错误问题探究

MySQL采用limit分段取数据汇总错误问题探究背景前几天接同事报问题:源数据一致的情况下,生产环境报表生成时而对,时而缺少确定的值。查看源码,报表生成采用SQL语句,create_time >= xxx and create_time <= yyy order by create_time limit offset, 1; 每次取指定时间段的一条记录,然后累加指定字段生...

2019-06-14 19:35:50 514

原创 Docker环境undertow线程数不足问题探究

Docker环境undertow线程数不足问题探究背景上篇Docker环境Spring Boot应用大量http请求超时,我们找到大量http请求超时原因:undertow的工作线程不足。留下一些疑问:undertow默认配置是怎样的?为什么其他微服务也使用默认参数,却有256个工作线程?结论k8s调度启动容器默认分配的cpu资源很小和OpenJDK 1.8.0_181会感知容器资源限制...

2019-06-14 18:55:36 5230 1

原创 Docker环境Spring Boot应用undertow大量http请求超时

Docker环境Spring Boot应用大量http请求超时背景项目采用Spring Cloud微服务架构,每个微服务都是一个Spring Boot应用。undertow做嵌入式Web容器,http接口相互通讯。使用阿里云容器服务部署在Docker环境。Spring Boot版本——1.5.9.RELEASEundertow版本——1.4.21.Final问题一个关键微服务接...

2019-05-13 20:00:29 8707

空空如也

空空如也

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

TA关注的人

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