- 博客(557)
- 资源 (49)
- 收藏
- 关注
原创 分库分表后,跨库查询和分布式事务解决方案
分库分表主要是为了解决单库单表的性能瓶颈,但拆分后数据分散在不同库和表中,这就导致了跨库查询和分布式事务的问题。
2025-03-23 23:40:12
690
原创 数据库锁机制
悲观锁:优先保证数据强一致,以性能为代价,适合短事务、高冲突场景。乐观锁:以重试成本换取高并发能力,适合长事务、低冲突场景。选型核心:根据业务冲突概率、一致性要求及系统架构(如分布式环境)综合决策。
2025-03-23 20:27:51
801
原创 分区表的应用场景与优化实践
当表的数据量非常大,达到几千万甚至上亿行时,全表扫描会很慢,这时候分区可以帮助缩小扫描范围。比如,在一个电商系统中,订单表可能按月份分区,这样查询某个月的订单时,只需要扫描对应的分区,而不是整个表。或者在日志系统中,按天分区,方便归档和删除旧日志。另外,如果数据有明显的分区键,比如时间字段,按时间分区可以方便地管理历史数据,比如删除旧数据时直接删除整个分区,效率更高。当然,分区键的选择不当可能导致性能问题,或者分区过多带来的管理复杂性。分区表是将一个大表分成多个较小的、更易管理的部分,每个部分称为一个
2025-03-23 20:05:12
664
原创 Canal同步延迟和数据丢失优化方案
Canal是通过解析MySQL的binlog来获取数据变更事件的,然后将这些变更事件发送到下游,比如Redis。在同步的过程中需要解决实时性和一致性的问题。首先,实时性方面,可能涉及到Canal本身的处理速度,比如是否及时解析binlog,以及下游处理的速度,比如Redis写入是否够快。此外,网络延迟也是一个因素。一致性方面,可能需要确保数据变更的顺序正确,以及事务的原子性,比如一个事务内的多个操作是否被正确处理。
2025-03-23 17:29:05
955
原创 数据库性能分析
任意时间段的慢sql数量,具体的sql语句和参数,执行次数、执行时间和总耗时等。以下简述如何应用mysql自身集成的命令和第三方工具统计慢sql,定位瓶颈。
2025-03-23 16:37:16
450
原创 应用索引下推、索引覆盖、索引跳跃扫描等特性优化数据库查询效率
ICP:优化复合索引的非前导列过滤,减少回表。覆盖索引:直接通过索引返回数据,避免IO开销。索引跳跃扫描:弥补缺失前导列的查询,避免全表扫描。实践建议:通过EXPLAIN分析执行计划,结合业务场景设计索引,优先选择覆盖索引,必要时启用ICP或Skip Scan。
2025-03-23 13:23:04
515
原创 雪花算法生成分布式唯一ID
雪花算法的结构是由时间戳、工作机器ID和序列号构成。要确保全局唯一,必须保证每个节点的机器ID唯一,并且同一毫秒内序列号不重复。在分库分表的环境下使用雪花算法,机器ID的分配是关键。常见的做法是通过分布式系统协调,比如使用ZooKeeper或者数据库来分配唯一的机器ID,在启动时从外部服务获取ID,并持久化存储,防止重启后ID变化。另外,时间戳部分需要保证各节点的时钟同步,否则可能出现时间不一致导致ID冲突。
2025-03-23 10:40:38
1143
原创 MySQL分库分表后单表数据还是过大怎么办
针对使用ShardingSphere分库分表后MySQL单表数据仍然过大的问题,以下是分步骤的解决方案:首先明确单表数据量过大的具体原因:2.2 增加分片数量若当前分片数为,可扩容至或更高,需配合数据迁移工具(如ShardingSphere-Scaling)平滑迁移。动态分片:设计支持动态扩容的分片规则(如按范围分片时预留分片空间)。2.3 多维度分片组合分片策略:例如同时按和分片,避免单维度热点。**3. 冷热数据分离3.1 归档历史数据将历史数据(如3年前订单)迁移至归档
2025-02-23 15:09:53
1089
原创 线程池上下文参数传递
传统做法是在任务执行前设置ThreadLocal变量,但线程池中的任务可能由不同的线程执行,导致主线程设置的ThreadLocal变量在任务线程中不可见。任务可能在另一个线程执行,该线程的ThreadLocal变量未被设置,导致任务无法获取到主线程的上下文。如果这个线程之前执行过某个任务,并且该任务设置了ThreadLocal变量,那么这些变量可能仍然存在于该线程中,导致后续任务访问到旧的数据,或者如果任务没有正确清理ThreadLocal变量,可能导致内存泄漏或数据混乱。
2025-02-04 14:18:36
599
原创 CountDownLatch和CyclicBarrier的区别,这回看懂了!
CountDownLatch的计数器由外部控制,而CyclicBarrier由线程自己调用await来减少计数。CountDownLatch适用于主线程等待多个子任务完成,而CyclicBarrier适合分阶段的任务,比如多轮计算。CyclicBarrier有屏障损坏的问题,而CountDownLatch一旦到零就不会改变。CyclicBarrier自动重置,而CountDownLatch需要重新创建。
2025-02-03 22:42:13
291
原创 深入理解Java虚拟线程的同步编程模型
传统上,Java使用的是平台线程(Platform Threads),也就是操作系统线程,每个平台线程都对应一个操作系统线程,创建和切换成本较高,尤其是在高并发场景下,线程数量增多会导致资源消耗大,甚至可能引发性能问题。虚拟线程(Virtual Threads)是Project Loom引入的,旨在解决这些问题。虚拟线程是轻量级的,由JVM管理,而不是直接映射到操作系统线程。这使得可以创建大量的虚拟线程而不会显著增加系统开销。听起来这很适用于高并发的I/O密集型应用,比如Web服务器处理大量请求的情况。
2025-02-03 12:37:09
1159
原创 linux系统排查命令
如下查看进程ID为9739的进程打开的文件句柄,可以看到进程的所有mysql、redis、nacos等网络连接和打开的文件路径,这个在程序出现文件流操作未关闭和内存泄漏等情况排查比较有用。linux系统对每个进程打开的文件句柄数限制有上限,如果进程持续操作文件流未关闭,可能会出现“Too many open files”的IO异常。
2024-11-19 23:42:13
265
原创 k8s部署微服务项目
而在实际生产中,大部分中小企业不会自建云,容易故障踩坑,更多选择云托管。自主搭建Jenkins,Maven私服,Rancher管理k8s集群,好一点的会自主研发Devops平台加入审批流,上线前研发Leader审批版本发布、sql脚本等。阿里云效其实也是干这种事情,最近在上面走了下流程,可以给大家简单看下我成功运行过的流水线。一般互联网公司的发布流程大致也是这样,前面还会有git分支管理合并等,如果代码合并有冲突也会中断。在代码构建前会有代码扫描、安全扫描、漏洞检测、单元测试覆盖率等,代码扫描完可以查看
2024-04-27 11:03:08
2308
1
原创 Saas系统多任务分发排队
这里可以根据用户等级拆分不同主题的队列,如免费版的topic和vip版的topic,里面调度逻辑一模一样,只不过对应不同的消费者,发送使用的账号可能也不同
2024-04-21 17:16:44
329
原创 JVM内存区域与常见问题
一次方法调用会产生一个栈帧,如果出现递归死循环调用栈空间满了,会出现StackOutOfErrorException。这里先以JDK1.8 hotspot垃圾收集器为例,讲讲每块区域存储的数据以及可能会抛的异常。存放类class对象,会自己动态调整大小,满了会引发Full GC。记录线程代码执行的位置,cpu时间片轮转后在原来的位置继续执行。各内存区域划分为大小相等的Region,可预测的停顿时间。灰色,有指向黑色标记节点的引用,不是GC ROOT节点。存放对象实例,会出现内存溢出或内存泄露等情况。
2024-01-01 18:04:07
667
原创 RocketMQ原理解读
RocketMQ整个中间件可以分两块,一块是NameServer,保存注册上来的Broker地址信息,另一块是Broker,保存队列消息,直接与发送端或消费者通信。NameServer是一个AP模型的架构。关键代码?Broker是一个CP模型的架构。关键代码?主要涉及3个物理文件commit_log,单个文件1G大小,顺序写入,保持实际消息内容consume_queue,保存消息ID和队列消息存储的offset地址index_file,辅助队列消息轨迹搜索。
2023-12-20 19:06:05
570
原创 【微服务】服务间调用
当我们的应用从一个大单体拆分成多个微服务之后,服务间调用有多少种方式?服务间调用如果出现超时,如果避免雪崩,即如何做限流熔断机制,原理是什么?
2023-12-17 21:58:10
759
原创 Nacos讲解
在Nacos1.x版本,服务间消息通信采用HTTP1.1长轮询,而Nacos2.x升级为gRPC长连接后,除了推送性能提升,内存消耗也大幅降低。而作为配置中心,数据的实时性等不是首要的,但服务间配置信息不一致是不能接受的,Nacos采用JRaft协议实现AP模型。作为服务注册与配置中心,如果不可用,会直接影响到业务,Nacos采用自研的Distro协议实现AP模型;在微服务架构里边,我们主要用Nacos做两块应用,一块是服务注册与发现,一块是配置中心。
2023-12-16 21:15:33
541
原创 MyBatis原理解读
我们项目中多用MyBatis进行数据库的读写,开源的MyBatis-Plus框架对其进行了增强,使用上更加简单,我们之前的很多项目也是直接用的MyBatis-Plus。数据库操作的时候,简单的单表读写,我们可以直接在方法里链式组装SQL,复杂的SQL或涉及多表联合join的,需要在xml手写SQL语句,这些框架上怎么执行的呢?MyBatis其实用到了很多设计模式。MyBatis的二级缓存。
2023-12-15 23:36:55
465
原创 SpringBoot自动装配
该注解import的AutoConfigurationImportSelector会去扫描classpath路径下META-INF/spring.factories文件,通过类加载器进行bean的自动化配置。SpringBoot的自动配置,其实跟下代码很简单,算是框架提供的一个很重要的特性,我们封装的很多starter公共组件,也是基于SPI机制实现功能拓展。我们每个SpringBoot项目的启动类都会加上@SpringBootApplication注解。
2023-12-15 22:45:07
511
原创 谈谈系统的稳定性建设
随着前段时间阿里语雀、滴滴生产事故的发生,从招聘信息来看越来越多的中小企业开始重视系统的稳定性建设。那么,系统的稳定性建设会涉及哪些方面呢?
2023-12-15 17:09:08
481
原创 说说限流处理
实现org.springframework.cloud.gateway.filter.ratelimit.KeyResolver我们可以基于ip或请求参数等指定不同维度,然后在配置文件指定令牌生成的频率和桶的容量,定制自己的限流逻辑。对于限流,从一个完整的请求链路上来看的话,可以分几块,有nginx接入层网关的限流,微服务网关gateway的限流,在业务层我们也可以实现自己的限流逻辑,Redission和Google的Guava包本身也提供了一些限流工具。
2023-12-15 16:26:42
430
原创 Spring事务
事务的传播机制,枚举定义了7种,如果不指定,默认是REQUIRED,比如父方法调用子方法,如果父方法已经有事务了,子方法就共用父方法的事务。如果子方法修改了事务的传播机制,改成REQUIRES_NEW,就不会共用父方法的事务,而是重新创建一个新的,实现上就是新建一个数据库连接去进行数据库操作,两个连接不互相影响。事务的隔离级别,MySQL的事务隔离级别都知道是4种,默认是RR,在一定程度上解决了幻读问题,有间隙锁、临键锁,容易导致数据库死锁,整个吞吐量也较低,所以有些并发高的业务或大厂会改成RC。
2023-12-13 22:14:43
535
1
原创 微服务网关Gateway
网关过滤器是配置在具体服务下的,只作用于配置对应的服务。如果参数是key-value结构的,可以实现org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory抽象类,实际上也是继承了AbstractGatewayFilterFactory。如果需要自定义,同样实现org.springframework.cloud.gateway.filter.GlobalFilter,重写filter方法。
2023-12-13 19:48:29
852
原创 多线程分别顺序循环执行
通过线程序号控制ReentrantLock中Condition的阻塞唤醒,都知道ReentrantLock的实现中有同步队列和条件队列两种,在多线程加锁执行的时候,每个线程会封装成一个Node节点加入到阻塞队列中,这里通过ReentrantLock给每个线程分配一个Condition,执行await()方法,当前线程释放锁,加入条件队列等待,signal()则唤醒对应的线程。
2023-12-12 23:08:12
734
原创 Java线程状态
网上关于线程状态的文章很多,有的个别有些小差异。这个其实在线程类Thread里面已经定义了枚举类,直接进JDK源码看就好了。同时在Thread类里面可以看到很多操作方法都用了syntronized关键字修饰,最终是去调用native修饰的原生方法。对于接口阻塞,比如有线程死锁等情况可以用jstack工具查看线程状态。可以看到里面定义了6种,有的文章加了READY(就绪状态)。
2023-12-12 22:47:05
496
原创 Graalvm构建原生镜像
今天主要先跑下Spring3.0,体验下Graalvm构建原生镜像带来的性能提升。先看下GraalVM与JVM的性能对比:对比可以看到,最新支持 Spring Boot 3.0 基于 GraalVM 的 Spring Cloud Alibaba 应用会在启动速度、运行时内存占用和应用包大小方面得到大幅度降低。
2023-06-04 20:52:47
390
原创 VuePress搭建知识库
项目打包启动,布局是不是很熟悉的很多开源项目的guide start,后面只需要把页面文案和路由替换成自己的,然后不断添加Markdown文件,会自动生成html给浏览器渲染。node.js 推荐16.19.0版本,今天因为版本18.x比较新,很多兼容问题。后面是计划利用ChatGPT生成对应的主题文章,形成内部业务学习知识库。点击Quick Start,就是常规的侧边栏,右边是菜单对应的文章内容。用create-vuepress-site插件初始化项目。Windows系统调试如果出现。
2023-06-01 00:00:42
369
原创 从0到1接入钉钉消息通知
前段时间给项目接入监控告警,消息通知渠道选了钉钉。预算的原因内部办公刚从飞书转回钉钉,飞书消息通知之前就有一套了,测试钉钉从应用授权到消息测试花了不少时间。这里记录下从钉钉开放平台权限申请到消息接收全流程,给后面有同样需求的人少踩坑。
2023-05-28 12:15:11
2745
原创 clickhouse部署
从clickhouse官网下载二进制安装包解压安装tar -xzvf clickhouse-common-static-dbg-21.9.4.35.tgztar -xzvf ...sudo clickhouse-common-static-21.9.4.35/install/doinst.shsudo clickhouse-client-21.9.4.35/install/doinst.shsudo clickhouse-common-static-dbg-21.9.4.35/install/
2022-02-13 22:23:33
2661
原创 nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)
yum安装nginx后起不来nginx安装完默认启动脚本在/usr/sbin页面在/usr/share/nginx/html执行nginx -c /etc/nginx/nginx.confnginx -s reload
2021-11-10 11:17:04
3944
原创 从Nacos配置中心读取数据乱码
微服务项目配置从nacos读取,一直起不来nacos读取配置文件默认使用UTF-8,本地IDEA默认编码格式为GBK,编码不一致导致配置读取格式异常,像控制台打印的乱码启动参数添加 -Dfile.encoding=utf-8 指定格式...
2021-10-09 14:45:15
4699
原创 DataX之MysqlReader插件的使用
{ "job": { "setting": { "speed": { "record":100 } }, "content": [ { "reader": { "name": "mysqlreader", "parameter": {
2021-07-21 11:11:59
1450
原创 linux部署nodejs
wget https://cdn.npm.taobao.org/dist/node/v14.16.1/node-v14.16.1-linux-x64.tar.xztar -xvf node-v14.16.1-linux-x64.tar.xzmv node-v14.16.1-linux-x64.tar.xz nodejsln -s /usr/local/nodejs/bin/npm /usr/local/bin/ln -s /usr/local/nodejs/bin/node /usr/local/b
2021-05-26 10:35:11
345
原创 linux安装nginx
wget -c https://nginx.org/download/nginx-1.9.9.tar.gz解压#使用默认配置./configure#编译安装makemake install编译安装到/usr/local/nginx进入sbin目录#重启nginx,建议先停止,再启动./nginx -s stop./nginx#在rc.local增加启动代码即可vi /etc/rc.local#增加一行 /usr/local/nginx/sbin/nginx,增加后保存#设置执行
2021-04-16 12:40:53
202
原创 org.apache.rocketmq.client.exception.MQBrokerException: CODE: 1 DESC: the producer group[] not exist
如果生产者发送完调用了producer.shutdown();,mq会移除生产者组,在控制台查看Producer列表,看到的提示找不到生产者组的报错本地测试可以注释调producer.shutdown();就可以在控制台正常看到如下生产者组,生产环境不能注释...
2021-03-24 16:05:35
11461
5
原创 org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
ff
2021-03-24 15:49:08
808
原创 org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, mail-send
排查了几种情况最后确定是版本的问题,服务端部的是目前最新的4.8.0,而maven引的rocketmq-clients是4.3.0,升级工程依赖解决
2021-03-24 13:44:41
1152
管理MessageQueue的Looper使用
2015-01-30
Message消息的两种发送方式样例send和post
2015-01-30
FileSaveToSDCard
2015-01-28
用Android写的MP3Player
2015-01-23
用MVC模式写的JSP连接数据库操作完整代码包
2014-10-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人