<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[hunger_wang的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/hunger_wang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; hunger_wang]]></copyright><item><title><![CDATA[平台系统的微信支付服务突然不可用问题记录]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/137842621</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/137842621</guid><author>hunger_wang</author><pubDate>Tue, 16 Apr 2024 22:18:43 +0800</pubDate><description><![CDATA[com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager属于wechatpay-apache-httpclient包，是微信支付开源的官方依赖包，项目地址：https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient。查看日志，发现“支付聚合服务”调用“微信支付服务”的http请求返回read timeout，问题很显然出在“微信支付服务”。]]></description><category></category></item><item><title><![CDATA[平台系统报OOM unable to create new native thread异常]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/137786195</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/137786195</guid><author>hunger_wang</author><pubDate>Mon, 15 Apr 2024 16:39:19 +0800</pubDate><description><![CDATA[接下来，我发现应用日志有些问题：输出这个异常日志的应用，并不是它报这个异常，而是它发起http请求其他应用，其他应用返回这个异常，真正有异常的是这些应用。通过查询日志服务，发现增加响应码500过滤后，今天虽然没有日志，但昨天有日志，同时还发现昨天的日志都是同一个K8S的worker节点上应用输出。这么多应用一起报这个异常，核心应用和非核心应用都有，而且这些应用并不在同一个调用链路上，所以判断和这些应用无关，应该与应用所在机器有关。确认是K8S集群的这个worker节点异常，导致这个节点上的应用报异常。]]></description><category></category></item><item><title><![CDATA[年耗资百万数据库升级记录]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/126007767</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/126007767</guid><author>hunger_wang</author><pubDate>Wed, 27 Jul 2022 09:35:14 +0800</pubDate><description><![CDATA[平台系统核心组件数据库升级，如何确保升级的成功和保障尽量短的停机时长]]></description><category></category></item><item><title><![CDATA[客户端与平台存在有状态连接的系统蓝绿发布方案设计]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/125012111</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/125012111</guid><author>hunger_wang</author><pubDate>Fri, 27 May 2022 22:37:49 +0800</pubDate><description><![CDATA[背景
有这样一个系统，客户端（设备或本地系统）与平台之间建立着有状态的连接（如TCP长连接），连接上有实时业务，偶然断开就会导致业务中断，影响用户使用。
但系统需要建设“蓝绿”发布机制，客户端需要在“蓝绿”这2个环境之间做切换，如何保障切换时不影响业务呢？
方案设计
方案一
平台在“蓝绿”切换时，发送对应环境的服务器地址给客户端，客户端采用新地址重连平台。
优点： 简单。
缺点： 切换操作触发重连，会中断业务。只能选择凌晨这些业务量少的点做切换，但还是不能百分百保证不影响业务。当然如果切换很快，可以采用客户]]></description><category></category></item><item><title><![CDATA[主导问题排查的流程总结]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/124219134</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/124219134</guid><author>hunger_wang</author><pubDate>Sat, 16 Apr 2022 19:56:03 +0800</pubDate><description><![CDATA[背景
作为技术团队的负责人，我们日常少不了主导线上系统的各种问题排查，那么主导问题排查是否有一些套路呢？
个人自己排查或主导排查线上系统各种问题近百次，从中总结了一些自认为的流程“套路”，记录分享于此，个人浅见，大家多多讨论。
流程

召集相关人
汇总问题信息
梳理排查方向
分配排查任务
汇总排查情况
同步信息给问题关切方


文档
主导问题排查的流程总结

...]]></description><category></category></item><item><title><![CDATA[软件系统问题排查的一般流程]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/124113008</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/124113008</guid><author>hunger_wang</author><pubDate>Tue, 12 Apr 2022 00:07:56 +0800</pubDate><description><![CDATA[背景
我们软件开发人员，经常需要排查一些问题，问题可能千奇百怪，各不相同，但排查的多了，总觉得有一些通用的原则，故尝试总结出来。
步骤

明确问题的重要和紧急程度
确定问题，并尽量复现问题
找到问题入口
寻找怀疑点并验证
给予答复


文档
软件系统问题排查的一般流程

...]]></description><category></category></item><item><title><![CDATA[绩效考核自评过程想到的项目管理]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/121001079</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/121001079</guid><author>hunger_wang</author><pubDate>Wed, 27 Oct 2021 20:21:23 +0800</pubDate><description><![CDATA[背景
绩效考核自评，是每个人在一个《绩效考核自评.xlsx》模板文件中列出自己这个季度的每项工作的内容、工作量占比（加起来100%）、绩效系数（0-1的1位小数），最后生成一个加权平均的绩效系数。
经历
组员发出来第1版都没有“加权平均绩效系数”这一项。由此想到，

多人协作的事情一定要有清晰的规则，如写代码要有规范一样。
大部分人其实并不太会为他人考虑。没有“加权平均绩效系数”，就得主管一个个计算啊。

之后，我召集大家开会，告知这一规则并给出一个有计算公式的模板。
组员接着发过来第2版，存在问题：大部分]]></description><category></category></item><item><title><![CDATA[SpringAOP切面编程实践建议]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/120958602</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/120958602</guid><author>hunger_wang</author><pubDate>Mon, 25 Oct 2021 19:35:35 +0800</pubDate><description><![CDATA[背景
AOP，面向切面编程，理念深入人心，使用范围也很广。
在日常开发中，我们经常用Spring AOP实现一些横向功能复用，比如下列场景


方法或外部接口调用增加入参出参及耗时日志


拦截方法调用增加本地或远端分发


接口增加鉴权或限流逻辑


大部分情况下，我们实现AOP功能时，切点通常采用@Pointcut注解描述，采用execution表达式形式如@Pointcut("execution(* cn.biz.abc.xyzClass.methodA(..))")。这种实现方式有没有什么缺点呢？
]]></description><category></category></item><item><title><![CDATA[RedisTemplate写入Redis数据出现乱码补充]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/120892698</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/120892698</guid><author>hunger_wang</author><pubDate>Thu, 21 Oct 2021 19:07:41 +0800</pubDate><description><![CDATA[上篇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]]></description><category></category></item><item><title><![CDATA[云存储服务文件访问安全问题]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/118881789</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/118881789</guid><author>hunger_wang</author><pubDate>Sun, 18 Jul 2021 19:37:29 +0800</pubDate><description><![CDATA[背景
随着阿里云、腾讯云等云服务平台的兴起，现代应用系统越来越依赖云服务进行构建，其中图片等文件存储也有云服务商提供产品，如阿里云的OSS。基于这些产品实现系统的文件等资源存储访问特别方便，但方便的同时，我们如果保护自己的文件安全呢？
这里的安全，我们不讨论云服务厂商私用我们文件资源的情况，因为我们使用这些云厂商产品，就是选择相信他们，而信任也是云厂商生存的根本，不会有人自绝其根。
我们主要讨论的是，在我们暴露这些资源给外部访问时，如何保护资源不会被其他人爬取而泄露关键数据如用户隐私，对我们产品造成严重影响]]></description><category></category></item><item><title><![CDATA[RedisTemplate写入Redis数据出现无意义乱码前缀\xac\xed\x00\x05]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/118713579</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/118713579</guid><author>hunger_wang</author><pubDate>Tue, 13 Jul 2021 23:27:43 +0800</pubDate><description><![CDATA[背景
项目使用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]]></description><category></category></item><item><title><![CDATA[Druid连接池耗尽问题排查总结]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/117826314</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/117826314</guid><author>hunger_wang</author><pubDate>Fri, 11 Jun 2021 20:12:22 +0800</pubDate><description><![CDATA[背景
生产环境有个关键应用所有节点，每隔几个月就会发生一次Druid连接池耗尽问题，重启后恢复正常。
目前我们还没有定位到问题原因，这边文章主要记录定位过程的一些思路和方法，后续如果找到根本原因，再做更新。
思路
数据库方向
应用连接池耗尽
1、会不会是应用与数据库的连接没有正常断开？
查看故障时数据库socket连接情况，没有发现。
2、会不会是应用执行了很多慢sql？
查看故障时数据库慢sql日志，没有发现。
3、会不会是应用执行了长事务？
查看故障时数据库事务情况，没有发现。
应用方向
应用连接池耗尽]]></description><category></category></item><item><title><![CDATA[MySQL哪些常用DDL操作会锁表]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/117432355</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/117432355</guid><author>hunger_wang</author><pubDate>Mon, 31 May 2021 23:22:03 +0800</pubDate><description><![CDATA[问题
我们后端开发人员在实现业务修改时，经常需要更新数据库表结构，如增加字段、修改字段长度等等。那么对于MySQL数据库，哪些表结构操作会“锁表”，会导致读写表中数据操作不能并发执行呢？
背景知识
DML( data manipulation language)，数据操作语句，是中INSERT、UPDATE、DELETE、SELECT等表数据操作的语句。
DDL( data definition language )，数据定义语句，是指CREATE、ALTER、MODIFY、DROP等操作表结构相关的语句。]]></description><category></category></item><item><title><![CDATA[不了解事务隔离级别？你的业务代码可能有问题]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/116801914</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/116801914</guid><author>hunger_wang</author><pubDate>Fri, 14 May 2021 18:54:56 +0800</pubDate><description><![CDATA[背景知识
好多开发同学都知道事务有四大特性ACID（Atomicity、Consistency、Isolation、Durability，即原子性、一致性、隔离性、持久性），但对隔离性的具体内容却不太清楚。
SQL标准的事务隔离级别有4种：读未提交（read uncommitted，简写ru）、读提交（read committed，简写rc）、可重复读（repeatable read，简写rr）、串行化（serializable）。
事务隔离其实是一种并发保护机制。
MySQL的事务隔离是引擎层实现的，In]]></description><category></category></item><item><title><![CDATA[ScheduledThreadPoolExecutor定时任务会消失]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/116539836</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/116539836</guid><author>hunger_wang</author><pubDate>Sat, 08 May 2021 19:25:17 +0800</pubDate><description><![CDATA[ScheduledThreadPoolExecutor定时任务会消失
背景
我们通常使用Java原生ScheduledThreadPoolExecutor实现定时任务，当我们遇到定时任务不再执行情况时，一查会发现没有任何错误日志，线程还在但定时任务就是不执行，仿佛消失了，这是什么原因呢？
举例
下面例子代码，预期是每隔5秒执行一次DivideZero，但实际上只会执行1次，而且不会抛出任何异常。
public class DelayTaskException {
	
	private static fina]]></description><category></category></item><item><title><![CDATA[AxureShare太慢，自己搭建产品原型分享系统]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/115769437</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/115769437</guid><author>hunger_wang</author><pubDate>Fri, 16 Apr 2021 18:28:15 +0800</pubDate><description><![CDATA[背景
我们的产品人员用Axure做产品原型，通过Axure Share共享给项目组成员访问。
但Axure Share的服务器在美国，国内访问很慢，特别影响工作效率。
解决方案
Axure可以将原型导出成html，这个html其实是一个静态网站，本地直接浏览器打开可以正常访问。
那么我们可以自己搭建网站服务实现产品原型共享。关键是要打通整个流程，让产品人员只做少量的操作就可以实现原型共享。
组件

git仓库软件gogs（其他git仓库软件也可以，只是我们项目原本就用gogs做源码版本管理）
python
]]></description><category></category></item><item><title><![CDATA[Java泛型知识]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/115705584</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/115705584</guid><author>hunger_wang</author><pubDate>Wed, 14 Apr 2021 18:15:04 +0800</pubDate><description><![CDATA[泛型
泛型是一种高阶抽象，是将数据的类型参数化。是Java语言的“语法糖”——编码时有泛型，运行时没有泛型，都是Object。
应用场景
泛型类。适用于容器类型，如Bag、List。Java里面有Future&lt;T&gt;, List&lt;T&gt;
泛型接口。
泛型方法。
好处
类型安全。编码时已经限定放入什么，就取出什么，没有ClassCastException。
代码重用。
如何在运行期获取实际类型信息
运行期获取泛型类对应实际类型信息，
/**
 * 获取具体Handler处理的泛型类
 * ]]></description><category></category></item><item><title><![CDATA[程序响应慢了，看看资源池]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/114702787</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/114702787</guid><author>hunger_wang</author><pubDate>Fri, 12 Mar 2021 18:44:00 +0800</pubDate><description><![CDATA[程序响应慢了，看看资源池
资源池，是指线程池、数据库连接池、redis连接池、http连接池等程序的池化资源。
资源池，好的地方是，一方面解决了频繁创建销毁资源的开销；另一方面对资源加了限制，防止耗尽系统所有资源。
不好的地方是，当某些业务因为异常，占用资源池较多资源时，其他业务获取不到资源或获取时间变长，慢点就出现了。现象会表现在资源池，当然，这不是资源池的错。
慢，通常会表现为某些请求响应慢或无响应。现在系统，大量使用线程池，线程是基本工作单元，不管是什么业务因为什么资源池引起的慢，最终都会表现为线程池]]></description><category></category></item><item><title><![CDATA[alias简化k8s命令，节约生命]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/114406443</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/114406443</guid><author>hunger_wang</author><pubDate>Fri, 05 Mar 2021 18:01:51 +0800</pubDate><description><![CDATA[alias简化k8s命令，节约生命
日常运维中，我经常用到k8s命令，每次输入kubectl -nmynamespace get pod -o wide | grep xxx，很费时间。浪费时间等于浪费生命，所以总结了一些日常用的command，整成alias。如下，供大家参考。
#kubectl命令
alias k8s='kubectl'

#常用namespace访问。注意yournm要改成你的namespace
alias k8snm='kubectl -nyournm'

#查找指定名称的pod，用]]></description><category></category></item><item><title><![CDATA[查找Java应用指定类实例数量]]></title><link>https://blog.youkuaiyun.com/hunger_wang/article/details/113263371</link><guid>https://blog.youkuaiyun.com/hunger_wang/article/details/113263371</guid><author>hunger_wang</author><pubDate>Wed, 27 Jan 2021 18:47:30 +0800</pubDate><description><![CDATA[查找Java应用内指定类实例数量
背景
最近，用户反馈我们系统某个业务慢。
我们通过使用arthas trace追踪到是ch.qos.logback.core.OutputStreamAppender.writeBytes方法耗时长，而OutputStreamAppender是ch.qos.logback.core.ConsoleAppender的父类。
我们系统日志组件采用logback，输出到控制台，高并发下ConsoleAppender写日志慢。由此，我们想确定ConsoleAppender是否是单例]]></description><category></category></item></channel></rss>