java
文章平均质量分 84
butt168
这个作者很懒,什么都没留下…
展开
-
浅谈threadlocal
文章目录简单介绍应用场景工作原理内存泄漏是怎么回事key要设计为弱引用如何解决hash冲突简单介绍ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题应用场景Spring采用Threadlocal的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接,同时,采用这种方式可以使业务层使用事务时不需要感知并管理connec原创 2021-09-16 12:07:22 · 205 阅读 · 0 评论 -
java web应用优雅停机
背景:系统发版时,当前正在运行的请求会中断,导致部分请求没有完成。为确保应用在停机时不影响调用方,首先需要告诉路由机构不再发新请求到即将停机的节点,同时要确保已接收的请求能被成功处理如何支持实现优雅停机分三个阶段完成,1、流量下线,停止新流量的进入(web,rpc,mq,job)2、等待一段时间,确保当前JVM内的流量处理完成3、停机,关闭JVM,优雅关闭容器(Spring)java微服务体系下,服务器在接受到停止信号(如kill -15 $pid),先会注销在注册中心的注册信息,关闭请求接受原创 2020-12-25 14:22:04 · 459 阅读 · 0 评论 -
基于shardingsphere分库分表
文章目录前言一、分库分表1、what2、why3、带来的问题二、组件对比1、shardingsphere2、mycat三、核心概念1、SQL逻辑表真实表数据节点绑定表广播表2、分片分片键分片算法标准分片算法复合分片算法Hint分片算法分片策略标准分片策略复合分片策略Hint分片策略不分片策略四、实践方案总结前言一、分库分表1、what从字面上理解,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上2、why(1)mysql单机存储上限。(mysql表中的数据都原创 2020-12-17 10:59:05 · 432 阅读 · 0 评论 -
分布式事务对比及方案
前言分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。背景由于业务上的实时性,需及时反馈事件的成功与否,基于mq的最终一致性方案已不符合现状。如:下单场景客户下单时,需要扣减库存,使用优惠券、扣减积分,最后生成订单,..原创 2020-11-30 19:29:23 · 281 阅读 · 0 评论 -
apollo配置及使用
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。阿波罗配置说明:1、创建项目2、添加namespace(可自建或关联已有的公共namespace)3、出现下面界面时说明创建成功springboot项目配置说明(本人目前使原创 2020-11-24 17:02:42 · 2635 阅读 · 0 评论 -
定时任务实现自动补偿队列踩坑实录
踩坑背景:目前的架构是mq消费失败会丢进补偿队列,补偿队列没有消费者,采用定时任务轮询去取补偿队列中的消息,while循环会一直取补偿队列中的消息,除非补偿队列为空时,才会终止循环。如下图所示线上故障状况:大量锁等待,锁超时,连接mq超时分析代码后发现,那…如果补偿队列有源源不断的大批量消息,那么会存在三个问题。1、while循环一直不结束。2、若消费补偿队列时失败,则会存放在errorList,若有大批量的消息失败,会导致有这个list会无限增大,最严重时甚至OOM3、确认时采取了一次.原创 2020-11-09 21:38:45 · 1451 阅读 · 0 评论 -
关于熔断降级的理解
前言熔断不是为了保护下游系统,熔断也不是为了保护核心流程永远可用,熔断是为了让“A–>B”快速返回,从而避免 ”慢接口消耗过多的php fpm进程或tomcat http线程导致其他接口得不到执行的机会“,最终避免系统雪崩不存在“无法熔断”的接口,熔断的前期就是B已经挂了,”不存在能不能作熔断“的问题。A–>B是网络调用,A的代码一定会处理TimeoutException。所以,至少可以使用“TimeoutException的返回值 来当做 熔断期间的返回值“正文1:..原创 2020-11-01 02:07:22 · 602 阅读 · 0 评论 -
基于guava的ratelimiter限流设计
限流1.流行的两种下流方式常见的限流算法有:计数器、令牌桶、漏桶1.1 计数器算法采用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。具体的实现可以是这样的:对于每次服务调用,可以通过 AtomicLong#incrementAndGet()方法来给计数器..原创 2020-11-16 15:40:47 · 136 阅读 · 0 评论 -
java多线程分段捞取数据
背景从一个数据量约十多亿的表中,捞出符合时间范围内所需的数据解决方案在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。它可能代表一个明确完成的Future,也有可能代表一个完成阶段( CompletionStage ),它支持在计算完成以后触发一些函数或执行某些动作。它实现了Future和Com..原创 2020-10-25 13:42:23 · 988 阅读 · 0 评论 -
Spring @Value注入属性获取不到值
@Value注入失败第一步检测语法是否正确@Value("${test}")private String test;2.第二步检测配置文件中是否有进行配置test=test3.第三步检测是否增加了@Component注解在spring中,使用了spring的注解,那么就需要使用spring来进行管理对象,而不能自己进行new,否则就会导致失败。4.第四步检测代码中的书写方...原创 2019-08-29 15:55:09 · 3558 阅读 · 1 评论