自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM调优参数之UseContainerSupport【文末有福利】

基于Docker等容器方式运行Java应用时,容器的资源管理使用了操作系统cgroup机制,但是JVM无法感知cgroup。也就是说在没有UseContainerSupport参数支持的JDK版本中,JVM是无法感知容器环境存在,对容器资源的限制比如内存或者cpu等都无法生效。在这种情况下,如果JVM申请的内存大于容器的内存,容器就会把当前进程kill掉,所以必须要让JVM感知到能使用的最大内存,这样可以及时进行GC。UseContainerSupport作用为了支持JVM感知cgroup..

2022-05-12 15:35:16 4016

原创 Spring中的BeanPostProcessor

背景:项目中使用了注解加切面实现某些数据接口的缓存,想把项目中使用了缓存的接口及信息可视化,便于管理查看。这个功能实现的话大概就是解析接口方法上的注解,加入统一管理的集合信息中。但是一般程序中只有访问到方法的时候才能主动做解析,而且多次访问会重复解析,所以考虑在项目启动时就遍历Bean解析这些注解的方法。为了实现上面这个功能,就使用了BeanPostProcessor接口。Spring中的BeanPostProcessor在实例化过程处于的位置分是前置处理和后置处理,对应的BeanPostPro

2021-12-18 18:02:01 721

原创 RocketMQ——producer发送消息源码分析

MQProducer接口RocketMQ中生产者顶层接口,定义了各种模式的发送消息的方法,不管是普通生产者还是事物消息生产者都实现了这个接口。DefaultMQProducer类这个类实现了MQProducer接口,是RocketMQ中提供的默认的生产者,除了事务消息外的普通消息都是用这个类实例进行发送。在创建生产者实例时,使用不同的构造方法,可以指定producerGroup(不指定时默认值为 "DEFAULT_PRODUCER");可以设置是否开启消息追踪及追踪topic的名称;还可以

2021-03-24 21:06:35 463

原创 synchronized锁的级别和ReentrantLock锁(AQS)

针对并发JAVA中提供了JVM级别的synchronized关键字,除此之外在JUC包下Lock接口也提供了类似的锁机制,例如ReentrantLock可重入锁。synchronizedJVM的关键字,依靠底层机制实现的。synchronized 中的锁是非公平的; synchronized 中的锁是可重入的;ReentrantLockReentrantLock 是 JDK 实现的,在java.util.concurrent.locks 包下。实现方式:ReentrantLo.

2021-01-20 16:29:00 1189

原创 事务隔离级别MVCC实现与悲观锁乐观锁

目录四种事务的隔离级数据库默认隔离级别为什么要使用悲观锁和乐观锁悲观锁乐观锁事务的隔离级(Isolation Level),就是在数据库事务中,为保证并发数据读写的正确性。四种事务的隔离级串行读 >可重复读 >已提交读 >未提交读1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少2、已提交读(Read Committed...

2020-12-29 11:37:15 262

原创 centos强制重启后mysql启动失败

由于强制重启后mysql的pid丢失导致启动失败。1.进入/etc/my.cnf.d文件查看pid的目录位置log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid上面的内容表示启动日志目录和pid目录,本次出现的问题就是pid丢失问题。2.进入/var/run目录下,创建mysqld目录mkdir /var/run/mysqld3.授权目录权限chown mysql.mysql /var/run/

2020-06-24 22:38:04 959

原创 Mybatis集成MySQL使用游标查询处理大批量数据

随着用户量的上升表数据已经上千万,每天扫描处理的数量也超百万,limit分页出现了慢sql,任务执行时间也达不到预期了。上述方案出现瓶颈后考虑放弃limit方案,使用游标的方式进行全量数据的获取,这样一来SQL执行快任务执行也快。在设置了useCursorFetch=true后,需要在SQL中指定fetchSize,即一次获取的数据量。基于数据的时间范围查询,给符合条件的用户推送积分即将到期的提醒。下面是基于上面的SQL做大量数据查询后写入文件的代码示例。

2024-01-18 15:49:50 1135

原创 浅谈Guava Cache的参数使用

这个方法是用来重新加载缓存的,通常这个方法是配合refreshAfterWrite参数设置一起使用的,如果没有设置refreshAfterWrite参数则不会触发这个方法逻辑,只有再判断缓存写入时间超出refreshAfterWrite的值时才会调用reload方法执行刷新缓存的逻辑。当执行get操作没有命中缓存或者判断缓存已经超出expireAfterWrite设置的时间即缓存过期时,会调用load方法进行回源逻辑,获取到新的数据并建立缓存。这个方法执行时是加锁的,并发访问一个没有缓存的key会阻塞。

2023-12-20 20:30:35 897

原创 JDBC参数之allowMultiQueries

其实allowMultiQueries参数是一个比较基础的参数,见名知意 支持多SQL执行的参数。

2023-11-23 14:49:35 1363

原创 Kubernetes中的就绪(readinessProbe)和存活(livenessProbe)探针

这篇文章开头,先列举几个我曾遇到过的因为探针参数使用不当而引发的k8s滚动升级的问题。

2023-08-04 21:00:03 438

原创 浅谈Kubernetes中Service实现(服务注册和发现)

之前的文章介绍了,这篇文章详细聊一下Kubernetes中的Service网络本身又是如何实现的。下面这张图是k8s集群服务发现涉及到的流程和组件,最重要的就是Kube-dns 和 Kube-proxy两个组件,下面会详细展开说明。

2023-08-02 20:58:34 560

原创 Kafka的Replication策略和ISR同步机制

而异步复制方式下,follower异步的从leader复制数据,数据只要被leader写入log就被认为已经commit,这种情况下如果follower都还没有复制完,落后于leader时,突然leader宕机,则会丢失数据。这个参数作用与Topic维度,指的是分区同步副本的数量控制,在replication异步复制模式下,生产者发送消息写入过程中,只有ISR中所有Replica都向Leader发送ACK时,leader才会执行commit。但是,Kafka的复制机制不是完全的同步复制,而是。

2023-07-05 21:05:06 787

原创 Kafka中的consumer拦截器

之前的文章写了最后有提到,在执行真实的消费方法之前会调用消费者的拦截器处理消息,最后再交给RecordMessagingMessageListenerAdapter进行代理和反射调用消费方法。对于消费者,SpringBoot在整合方式中的spring-kafka并没有用原生的ConsumerConnector,,而是借助原生client的拉取消息功能做了自己的消费模型的实现,提供了@KafkaListener注解这种方式实现消费。

2023-06-19 09:20:46 473

原创 浅析Spring-kafka源码——消费者模型的实现

在使用Spring-kafka时,一般都是通过使用@KafkaListener注解的方法来实现消息监听和消费。今天写一下基于这个注解实现的消费端模型和实现的原理。

2023-06-17 13:31:51 2415

原创 Kafka消费端concurrency参数

首先说一下结论,这个参数用来增加消费者实例,或者可以理解为@KafkaListener注解实例的数量。当消费者服务数量小于topic的分区数的时候使用此参数可以提升消费能力,spring-kafka在初始化的时候会启动concurrency个Consumer线程来执行里面的方法。用来直接调用kafka-client的poll()方法获取消息。如果是自动提交offset,poll()方法获取消息后会直接给到listener线程执行。真正调用处理我们代码中标有注解方法的线程。

2023-06-16 20:59:18 1447

原创 Kafka中的producer拦截器

在Kafka中,拦截器一共有两种。分别是生产者端的和消费者端的。本文介绍生产者端的拦截器。

2023-06-16 13:45:14 1429

原创 浅谈Dubbo服务的参数校验

Dubbo框架本身是支持参数校验的,同时也是基于JSR303去实现的。dubbo框架的资源文件org.apache.dubbo.rpc.Filter中定义了默认会生效框架自带的一系列Filter。其中就包含下面说的ValidationFilter。

2023-06-08 13:45:01 773

原创 CMS垃圾回收器的堆内存分配问题

项目中某个服务容器配置内存是4G,通过-XX:InitialRAMPercentage=75 控制JVM内存控制为容器的75%,大概2.5G左右不到。CMS中堆内存分配方式根据相关计算公式,如果机器CPU为4核,则年轻代 = 64M * 4 * 13 / 10 = 332.8M。,在默认情况下是这个比例没错,但是如果项目中使用CMS代替默认的GC回收器呢,这个比例还正确么?随着业务量的增长,单服务节点的高峰QPS不算攀高,发现高峰期极易发生FullGC。这个比例有个前提条件,就是之前的文章写的。

2023-06-03 21:00:03 695

原创 浅谈Maven依赖冲突与依赖管理

以上方法虽然治标,但是不治本。如果想依赖冲突不发生,我们需要提前建立一定的规范,团队一起遵守,才能有效避免该类问题。应用项目中使用统一管理基础依赖,定义统一的版本,如常用中间包,工具包,日志包。二方包中不要引入无关的依赖,做到尽量少的依赖。团队开发中,比较常见情况是二方包继承公共的父 pom,从而导致继承许多无相关的依赖,这种情况可以单独管理。二方包做好向下兼容,不要随意改动现有类名,方法名,字段名。项目应用上线之前,将snapshot替换成正式版本。虽然snapshot。

2023-06-03 20:32:07 582

原创 记一次线上MQ堆积问题处理

下午1点后出现新一轮高峰,出现了大量消息堆积,堆积量超过两万。由于当前Topic分区较少,服务节点数量已经大于分区数,加服务节点没有意义。原因是Topic扩容后有12个分区,但是当前服务节点只有10个,存在两个服务节点各自消费两个分区的情况,导致原有的堆积消息无法尽快处理完。几分钟后,12个分区消息堆积都解决了,但此时仍处于高峰,所以lag数扔维持几十左右,观察后发现消费速度稳定,没什么问题。上午11.30左右一波下单高峰,根据分布式消息告警发现有少量消息堆积,但是堆积量不大,持续几分钟后恢复正常。

2023-06-02 21:01:36 288

原创 Maven多模块父项目Pom发布到Maven私服

一个父项目下Father面有3个子项目A、B、C。A和B是JAR包服务,C是接口sdk。当C提供给外部使用时对方也需要Father这个父POM(因为C指定了Father作为parent),这时候需要把Father父POM上传的私服供对方下载。下面两种方式可以灵活控制deploy的模块,避免不需要上传的模块也上传到私服上去。

2023-05-27 14:03:10 1786

原创 浅谈JDK8的默认垃圾回收器

JDK1.8中默认使用Parallel Scavenge作为年轻代的垃圾回收器。使用Parallel Old作为老年代的垃圾回收器(又称为PS MarkSweep)。Parallel Scavenge收集器又称为吞吐量优先收集器,和ParNew收集器类似,是一个新生代收集器。使用复制算法的并行多线程收集器。Parallel Scavenge是Java1.8默认的收集器,特点是并行的多线程回收,以吞吐量优先。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

2023-05-20 21:00:51 2381

原创 浅谈Kubernetes对外暴露服务的实现方式(NodePort vs LoadBalancer vs Ingress)

之前的文章写了k8s中服务访问的service组件和。但是肯定多少都会有外部访问的场景,比如对外暴露的API服务。这就涉及到从k8s集群外部访问集群内部的场景。对于外部访问k8s集群通常有下面几种方式,本文主要写第二种和第三种,对于ingress和路由指向简单介绍一下。

2023-04-27 19:11:53 981

原创 Dubbo中的Router组件及扩展实践

开头讲到Router一般都是由对应的RouterFactory而来,具体一点说,在消费者启动过程中是基于SPI机制加载各个RouterFactory来初始化加载router列表的。所以如果要自定义Router路由也是基于SPI机制来集成。实现org.apache.dubbo.rpc.cluster.router.AbstractRouter接口并实现route方法即可@Slf4j@Overridelog.error("执行自定义的router对服务列表进行过滤");

2023-04-13 16:43:48 477

原创 Dubbo服务目录组件Directory

AbstractDirectory中封装了Invoker列举流程,具体的列举逻辑则由子类实现,如AbstractDirectory类定义了doList方法,在StaticDirectory和RegistryDirectory两个子类中重写了doList方法。这是典型的模板模式;

2023-04-13 15:35:49 1014

原创 Dubbo消费者调用流程分析

消费者在发起一次调用的时候时序图如下。

2023-04-12 21:01:53 604

原创 浅谈Dubbo中Filter机制

之前的文章介绍了,即实现org.apache.dubbo.rpc.Filter接口及内部子接口Listener,或继承ListenableFilter抽象类就可以进行自定义Dubbo Filter。

2023-04-12 17:16:14 676

原创 浅谈Dubbo服务启动实现原理

在SpringBoot项目中集成Dubbo的模式下,在boot项目启动时Dubbo也会完成服务接口的对外发布和消费者引用。

2023-04-12 15:30:00 302

原创 浅谈Dubbo集群容错机制的实现

Dubbo整个集群容错层的实现在模块,它包含很多组件,例如:Cluster、ClusterInvoker、Directory、LoadBalance等等。Cluster是集群容错接口,它的功能仅仅是将一组Invoker聚合成一个具备集群容错能力的ClusterInvoker。在2.7.8版本中,Dubbo内置了十种集群容错策略,默认策略是Failover,对应的类是FailoverCluster,它会创建FailoverClusterInvoker。

2023-04-10 21:00:28 521

原创 MySQL临时表空间

在一张大表复杂连接查询时遇到一个错误,从报错信息看,应该是创建的临时表空间不够用了这个错误和下面两个参数有关,一个是 tmp_table_size,另一个是innodb_temp_data_file_path这个参数指的是 内存中临时表的最大大小。当内存中的临时表超过限制时,MySQL会自动将其转换为磁盘上的临时表。如果SQL中执行了许多高级分组查询,并且会占用大量内存,则需要考虑tmp_table_size参数值是否满足需求,当超出时会报上面的错误。

2023-03-28 20:54:16 625

原创 浅谈Dubbo的异步调用

之前简单写了一下,了解了Dubbo底层是基于NIO的Netty框架实现的,通过IO线程池和Work线程池实现了请求和业务处理之间的异步。这篇文章要写的是Dubbo对于消费端调用和服务端接口业务逻辑处理的异步,在2.7版本中Dubbo实现了基于CompletableFuture的异步支持。

2023-03-25 21:01:12 1008

原创 CompletableFuture避坑指南

如果任务没有指定线程池,默认是由系统ForkJoinPool中的共用线程池CommonPool执行的,那依赖这个任务的结果的任务也会由CommonPool来执行。,而服务中只会有一个IO线程池,所以需要注意同步回调中不能有阻塞等耗时过长的逻辑,否则在这些逻辑执行完成前,IO线程将一直被占用,影响整个服务的响应。因此在使用过程中要避免这种场景的使用。结果1中主线程先输出了表示thenApply的逻辑是等待future返回结果后又执行的,此时thenApply逻辑的执行线程是Dubbo线程。

2023-03-25 18:39:29 932

原创 CompletableFuture异步编程实践

CompletableFuture是由Java 8引入的,在Java8之前我们一般通过Future实现异步。CompletableFuture对Future进行了扩展,可以通过设置回调的方式处理计算结果,同时也支持组合操作,支持进一步的编排,同时一定程度解决了回调地狱的问题。

2023-03-23 21:02:00 321

原创 美团外卖正向流程对接踩坑指南

正向流程中的踩坑点美团商户端有开启自动接单的设置,如果开启自动接单后会出现下面两种情况针对这种情况,需要在处理确认订单消息推送时补创建订单落库。针对这种情况,需要在调用失败后查一下美团订单详情,如果状态是已确认则当做调用成功处理。

2023-02-27 13:33:20 520

原创 ElasticSearch查询优化routing

如果一个索引分片多达一百,再加上每个分片数据量大的情况下ES查询速度会慢,这种情况可以根据业务情况考虑使用_routing优化。

2023-02-25 20:30:12 1992 1

原创 ElasticSearch查询Aggregations

近期做了一些订单数量统计的优化,原来的实现方式是组装多个统计指标的条件然后执行count查询,指标多查询次数也多,接口耗时长性能差。

2023-02-24 22:16:28 705

原创 SpringMVC中的ResponseBodyAdvice

1.现有的http接口返回值结构各异,需要统一返回值的结构但是不想大量的更改现有的接口代码。2.对于现有的http接口返回值要做统一的加密处理,不想把加密逻辑入侵到每个接口代码中。上面两种情况可以用ResponseBodyAdvice来对返回值做处理。

2023-02-04 21:36:30 627

原创 MySQL的排序规则COLLATE

简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响 DISTINCT、GROUP BY、HAVING语句的查询结果。另外,MySQL建索引的时候,如果索引列是字符类型,也会影响索引创建,只不过这种影响我们感知不到。关键字,查询语句也是大小写敏感的。在此基础上创建的 name 相关的索引也是大小写敏感的,也就能够使用索引来提高性能。BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在。

2023-02-04 17:25:36 896

原创 Sharing-jdbc分库分表功能

官方文档ApacheShardingSphere通过提供多样化的表类型,适配不同场景下的数据分片需求。

2023-01-18 17:21:02 2053

原创 DDD中引入的CQRS概念

在DDD设计中,增删改操作便于应用领域模型执行,而查询操作往往无法直接通过领域模型执行。。在基于CQRS的系统中,我们称增删改为命令型操作,把命令操作和查询 所使用的数据模型作区分。听起来可能像是两个微服务,但是在CQRS中,无论运行时架构是怎样的,命令模型和查询模型都属于同一逻辑领域。如果查询模型对命令模型一无所知,就无法发挥作用。这里的耦合是预期的,不同于微服务之间的解耦行为。

2023-01-11 20:55:39 350

win系统erlang安装包

对应rabbitmq-3.8.9版本

2020-12-21

空空如也

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

TA关注的人

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