- 博客(101)
- 资源 (1)
- 收藏
- 关注
原创 消息队列RocketMQ浅析
由于 RocketMQ 所有消息都是持久化的,所以如果按照优先级来排序,开销会非常大,因此 RocketMQ 没有特意支持消息优先级,但是可以通过变通的方式实现类似功能,即单独配置一个优先级高的队列,和一个普通优先级的队列, 将不同优先级发送到不同队列即可。消费消息的顺序要同发送消息的顺序一致,在 RocketMQ 中,主要指的是局部顺序,即一类消息为满足顺序性,必须 Producer 单线程顺序发送,且发送到同一个队列,这样 Consumer 就可以按照 Producer 发送的顺序去消费消息。
2024-12-03 10:49:19
618
原创 行为型设计模式之《责任链模式》实践
发现又得往 if-else 里面硬塞分支,有代码洁癖的我怎么能容忍自己写这种代码?最近也从同事那里了解到责任链模式的厉害之处,索性直接给它优化掉,这里我截取下关键代码片段。请求如果成功通过 process 处理,则进入下一个 process,如果不通过则被过滤掉,这里不再累述代码。每个节点都有机会处理请求,节点处理完之后继续往后走,直到链尾。• JavaEE 的 Servlet 规范定义的 Filter。最后,业务代码里又臭又长的 if-else 变成了一行代码。最后是负责初始化责任链的客户端。
2024-12-03 10:42:08
536
原创 五万文长字~阿里配置中心Diamond探索
通过diamondEnv, dataId, group创建CacheData,listeners是采用线程安全的CopyOnWriteArrayList,isInitializing表示数据是第一次发起监听,将从容灾、缓存目录依次获取content、encryptedDataKey,获取对应的md5值,并把CacheData set到cacheMap中,最后将listener add到CacheData.listeners中。如果同一个配置项的变更频率达到了一分钟一次的量级,肯定是不正常的。
2024-12-03 10:32:05
1019
原创 异步线程异常逃逸
由于异步线程池没有配置 UncaughtExceptionHandler,当异步线程执行过程中发生异常时将不会被捕获,造成异常逃逸现象。
2023-05-31 14:45:47
496
原创 浅谈网络基础架构
浅谈网络基础架构背景看一次网络请求主要过程1.URL解析2.DNS解析解析顺序服务器层次划分3.建立TCP连接HTTP请求为什么要用TCP协议建立连接?TCP 三次握手4.服务器处理请求5.浏览器接受响应6.渲染页面部署架构总览结构组成相关术语负载均衡(LB/SLB)为什么有LBLB分类二层负载均衡(mac)三层负载均衡(ip)四层负载均衡(tcp)七层负载均衡(http)LVS(四层LB)基础概念LVS集群NGINX(七层LB)四层与七层的区别负载均衡调度器NATFNATTUNDRLB算法统一接入层(AS
2022-04-15 20:32:11
13801
1
原创 MVN常用命令
cleanmvn cleancompile编译类文件mvn clean compiletestmvn clean testinstall包含mvn compile,mvn package,然后上传到本地仓库mvn clean installdeploymvn deploy包含mvn install,然后,上传到私服很多时候我们只需要发布父pom,对于子模块需要独立处理● 忽略递归子模块○ mvn clean package deploy -N // 在父p
2022-03-10 22:19:26
7439
原创 Maven发布轻量二方包
在公共项目开发了common模块,其中包含了发钉钉消息、时间处理等多种公共方法,现在想要发布到maven仓库给其他应用使用。其他应用使用过程中发现,引入common模块的依赖后还需要单独引用common内部的其他依赖。client如果要使用发消息模块的能力,需要引入如下依赖:pom.xml:<!-- common内部发消息的依赖 --><dependency> <groupId>com.dingtalk.open</groupId> <
2021-12-30 21:06:01
1913
原创 Maven打包生成包含所有依赖的jar包
使用插件maven-shade-plugin打包<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.3</version> <executions>
2021-12-29 19:32:50
478
原创 Truncate or Delete table
背景最近在准备双12大促压测,为了更好的支持压测加之DB容量告急,所以准备清理一波影子表数据。清理表数据的方式有两种:DELETE FROM table_name;TRUNCATE TABLE table_name;那这两种方式有什么区别,适用的场景又是什么?不同点这里将使用两张测试表来验证结果:table1: distinct_testtable2: decimal_testSQL语言分类SQL四种语言:https://www.cnblogs.com/henryhappi
2021-12-01 14:03:21
511
原创 Metaspace GC 问题排查
背景描述查看应用JVM监控发现发生了连续两次 Full GC,导致 GC 的原因是什么?Full GC 监控:metaspace利用率监控:问题排查环境信息生产环境,JDK1.8关键JVM参数:-Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=1g -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:CM
2021-11-11 21:48:30
4076
2
原创 insert on duplicate key update命令
这里写目录标题背景介绍实现方式先判断再操作insert on duplicateActioninsert on duplicate update 命令的原理,以及如何保证原子性?背景介绍有一批消息队列任务要执行,需要记录任务相关的数据,包括执行总数、成功数、失败数。这里采用mysql统计表的方式记录,每一批任务生成一条统计数据,但由于消息队列是无序的,所以生成统计记录的时候无法知道哪一个请求是第一次,也就不知道是 insert 还是 update。简单列一下统计表字段CREATE TABLE `t_
2021-11-03 16:25:18
2321
转载 内存溢出与内存泄漏
内存溢出概念内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。常见情况1.java.lang.OutOfMemoryError: PermGen space (持久带溢出)我们知道jvm通过持久带实现了java虚拟机规范中的方法区,而运行时常量池就是保存在方法区中的,因此发生这种溢出可能是运行时常量池溢出,或是由于程序中使用了大量的jar或class,使得方法区中保存的class对象没有被及时回收或者class信息占用的内存超过
2021-09-09 15:06:15
235
转载 git强制覆盖分支操作
有2种方法可以实现强制覆盖分支的操作。例如,要将 test 分支的内容完全覆盖掉主分支master。方法1// 将test分支强制(-f)推送到主分支mastergit push origin test:master -f方法2(假设当前位于test分支)// 将当前分支切换到主分支git checkout master// 将主分支重置为test分支git reset --hard test// 将重置后的master分支强制推送到远程仓库git push origin master
2021-09-02 14:48:16
4208
原创 BigDecimal进位
public BigDecimal volumeHandle(String value) { // 默认值为1 BigDecimal defaultValue = new BigDecimal(1); // 保留2位数,多的进1 BigDecimal volume = new BigDecimal(value).setScale(1, BigDecimal.ROUND_UP); // 如果值小于1则置为1 if
2021-08-31 14:17:45
1101
原创 CSV乱码 - UTF-8 Unicode (with BOM)
Unicode统一码,也叫万国码、单一码(Unicode)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。 就是将世界上所有的文字用2个字节
2021-08-12 17:59:27
5722
原创 Linux多关键字grep和count
单个关键字grep:grep “xx” log_file.log多关键字grep:grep “xx” log_file.log* | grep “yy” | grep “zz”单关键字count:grep -c “xx” log_file.loggrep “xx” log_file.log | wc -l多关键字count:grep “xx” log_file.log* | grep “yy” | grep “zz” | wc -l用grep -c来统计匹配的行数gr
2021-07-16 11:50:02
4216
原创 MySql索引失效-联合唯一索引含null值
一.背景今天在测试过程中发现有数据重复的现象,想设计一个唯一索引达到幂等的效果,但是发现设置了唯一索引以后还是可以插入相同的数据,经过排查,发现联合唯一索引中含有null值会导致索引失效。二.问题复现现在我们来复现一下这个场景。2.1 首先创建一个 user 表,指定 user_name + address 为联合唯一索引CREATE TABLE `t_user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
2021-07-13 01:07:50
7352
1
转载 MyBatis主键回填
方式一<insert id="insertBook" useGeneratedKeys="true" keyProperty="id"> insert into t_book (b_name,author) values (#{name},#{author});</insert>这种方式比较简单,就是在插入节点上添加 useGeneratedKeys 属性,同时设置接收回传主键的属性。配置完成后,我们执行一个插入操作,插入时传入一个对象,插入完成后,这个对象的 id
2021-07-02 13:57:07
537
原创 反射获取类的所有属性/方法(包括父类)
我们都知道可以通过 Class 类的方法获取类的所有属性和方法获取该类所有属性:java.lang.Class#getDeclaredFields获取该类所有方法:java.lang.Class#getDeclaredMethods但是当这个类是子类,我们又想获取所有属性时这两个方法能支持吗?答案是不行。通过这两个方法的注释可以看出,方法将返回 Field/Method 数组,包含这个对象所有的属性或方法(public, protected, default),但是不包含继承的属性或方法。那要
2021-06-16 22:24:05
3792
3
原创 Gitlab找回已经删除的分支
背景今天不小心删除了gitlab的开发分支,需要找回下,点开gitlab activity页面,看到如下信息恢复1.在项目代码文件夹中打开git,执行 git checkout -b branchname commitIdgit checkout -b code_optimze commitId2.push到远程分支,执行 git push origin branchnamegit push origin code_optimze这样就恢复完了...
2021-05-27 15:23:45
3815
原创 MyBatis resultType和resultMap的区别
问题表现今天遇到个很诡异的问题,自己写了一个查询sql,发现Order变量只有部分数据有值,其他都是null,对了好久字段是不是命名错了都没发现啥问题,最后才发现是用错resultType的锅。查询sql:mapper:<select id="selectByOrderNo" resultType="com.xxx.Order"> select <include refid="column_List"/> from t_order where
2021-05-08 17:07:52
4650
原创 ThreadLocal学习
是什么其作用是创建线程局部变量。通常情况下我们创建的变量可以被任意一个线程访问并修改,而 ThreadLocal 创建的变量只能被当前线程访问,其他线程无法访问和修改,所以就不存在线程安全问题。解决的问题每个线程都需要有属于自己的实例数据(线程隔离)实例需要在线程中的多个方法共享,不希望使用传参的形式ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。demo示例code // 初始化,并赋初始值:d
2021-03-29 15:23:53
247
原创 ThreadPool full问题排查
问题背景目前LEX业务场景包含两个模块:FM、LineHaulShuttle,都是通过ODPS离线同步然后通过Blink发送到gateway的MQ,两个QPS分别是:FM-1000/s,LineHaulShuttle-600/s,会对系统有个短暂的冲击,目前系统未经过压测,所以对于系统的抗压能力我们是不清楚的,如下就是接入LinHaul场景时发现的异常:线程池占满问题排查由于Lindorm入库、发风控是使用了线程池异步操作的,这样不仅能提高系统处理效率还能提高吞吐量,但是由于线程资源有限,所以就会发
2021-02-25 13:39:09
1047
原创 Spring异步编程
简介Spring中用@Async注解标注方法成为异步方法。它会在调用方当前线程之外独立一个线程执行,相当于我们直接new一个线程去执行:new Thread(() -> System.out.println("new: " + Thread.currentThread().getName())).start();为什么要使用异步执行?很多时候我们需要调用一个耗时的或者非主链路的方法,它的执行结果并不重要,我们不需要阻塞等待它执行结束,再去执行后续的方法。同步的做法是任务依次执行,效率较低,
2020-12-29 17:09:43
369
2
原创 mybatis报错:Invalid bound statement (not found)
mybatis报错:Invalid bound statement (not found)语法错误Java DAO层接口public void delete(@Param("id")String id);Java 对应的mapper.xml文件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.or
2020-12-14 11:34:16
499
转载 Spring普通Java类获取bean
实现总览在初始化时保存ApplicationContext对象通过Spring提供的工具类获取ApplicationContext对象继承自抽象类ApplicationObjectSupport继承自抽象类WebApplicationObjectSupport实现接口ApplicationContextAware保存ApplicationContext对象ApplicationContext ac = new FileSystemXmlApplicationContext("applica
2020-12-04 17:02:04
361
原创 @Resource和@Autowired的区别
问题现象服务启动时,发现其他工程Dao层的SDK服务注入失败,报空指针异常。解决这个服务是通过@Autowired注解注入的,将注解替换成@Resource,问题就解决了。原因分析
2020-12-03 22:40:49
206
原创 MySql group by区分大小写
MySql的查询是不区分大小写的,当想根据字段进行分组的时候可能会遇到无法精确分组的问题。如:type = a, type = A,呈现的type都为a直入主题:通过binary达到区分大小写SELECT COUNT(1) as total, `type` FROM `table_name` GROUP BY binary(`type`);参考:https://my.oschina.net/xiangtao/blog/33983...
2020-11-20 09:15:47
4092
1
转载 jar包冲突
Jar包冲突的原因我们知道maven有传递性依赖机制,举例来说,当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;而A的jar包中依赖了B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B 的jar包全部都引入进来。这样就会造成一个问题:A->B->C->G21(guava 21.0)E->F->G20(guava 20.0)假设pom.xml 文件中引入A与E两个依赖,按照上述的传递性依赖机制,与默认的依赖调解机制(第一:路
2020-09-29 15:08:33
222
转载 服务器性能指标(QPS/TPS/RT)
PVPV(page view)页面流浪量,作为评价网站流量最常用的指标之一。QPSQPS(Queries per second )每秒查询速率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,经常作为衡量服务器性能高低的标准之一。原理:每天80%的访问集中在20%的时间里,这20%叫做峰值时间。公式:(总PV数 * 80%)/(每天秒数 * 20%) = 峰值时间的每秒请求数(QPS)机器数:峰值时间的QPS / 单台机器的QPS = 需要的机器数(机器的QPS与其CP
2020-09-04 20:09:34
4538
原创 snapshot依赖无法更新
今天遇到个问题,菜鸟的同事升级了 jar 包版本,但是只发布了部分库(如只发布了common,没发布client),我本地升级了对应的 jar 包版本,发现 client 相关的工具类丢失了,之后同事补充发布了 client,我本地尝试了 reload / invalidate 都不行,最后在师兄的指导下勾选 maven 的配置 Always update snapshots 选项后解决了。可能的原因是,snapshot更新一次之后就存在本地缓存里了,即使发布了新的内容,reload/invalidate
2020-09-02 15:13:52
2052
1
原创 Spring Bean生命周期学习
目录1. 概述2. 相关注解3. Bean的生命周期流程图序列图4. 演示4.1 User.java4.2 MyBeanFactoryPostProcessor.java4.3 MyBeanPostProcessor.java4.4 MyInstantiationAwareBeanPostProcessor.java4.5 DemoApplication.java4.6 运行程序,查看运行结果文章参考地址,补充并优化了些内容1. 概述什么是Bean被称作 bean 的对象是构成应用程序的支柱
2020-08-24 16:22:31
206
原创 Spring自定义注解
目录Spring自定义注解1. 前言2. AOP3. 常用注解学习3.1 @Target3.2 @Retention3.3 @Documented3.4 @Order3.5 @Aspect4. 实现自定义注解4.1. 定义注解类4.2. 定义切面类4.3. 编写Controller4.4. 启动项目,查看结果Spring自定义注解1. 前言Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。Sp
2020-08-20 15:07:15
572
原创 二叉树所有路径
1. 二叉树的所有路径深度优先遍历(DFS),使用临时变量(这里使用StringBuilder,也可以使用String,但是String是不可变对象,+= 操作将new出多个String对象,影响效率)保存当前节点的值,当节点的左右子树不都为null时,递归调用,当节点左右子树都为null时,即递归到叶子节点,将临时变量的值保存。LeetCode链接public class LeetCode257 { public static List<String> binaryTreePath
2020-07-22 16:07:32
779
原创 写给自己看的设计模式之《观察者模式》
定义当对象之间存在一对多的关系时,被依赖的对象发生变化,需要通知到依赖它的所有对象。举个例子由于疫情的影响,各地的学校纷纷延迟了开学时间,延迟开学的消息由学校传达给老师和家长(不考虑由老师转发给家长的情况),具体的开学时间也是一样。这个例子中学校与老师和家长之间具有一对多的关系,学校的通知需要都通知到他们,结合观察者模式来code看看。首先定义被观察者:学校维护一个 Observer 的数组,老师和家长可以通过 registerObserver 方法注册;学校通过 publishNotice
2020-07-17 15:48:06
223
原创 初识RocketMQ
目录简介使用创建 Producer 用例简介RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件官网:http://rocketmq.apache.org/docs/quick-start/使用https://blog.youkuaiyun.com/autfish/article/details/89226461创建 Producer 用例package com.example.demo.service;import org.junit.Assert;import org.juni
2020-07-15 23:26:15
303
原创 MyBatis使用
demo 地址:https://github.com/DKAngel/MyBatisDemo简介MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。可以通过XML或注解的方式来配置和映射原始类型、接口和 POJO为数据库中的记录。详见 MyBatis官方文档各ORM框架对比 MyBatis/Hibernate/JPA
2020-07-14 22:07:32
369
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人