自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 Kafka收发消息核心参数详解

对于这些属性,你并不需要煞有介事的强行去记忆,随时可以根据和以及他们的父类去理解,大部分的属性都配有非常简明扼要的解释。但是,你一定需要尝试自己建立一个消息流转模型,理解其中比较重要的过程。然后重点从高可用,高并发的角度去理解Kafka客户端的设计,最后再尝试往其中填充具体的参数。

2023-12-22 23:03:37 2000 3

原创 Codeium安装以及使用教程(踩坑系列)

Codeium是一款免费的人工智能代码加速工具,它可以为开发者提供智能的代码完成、聊天和搜索功能,支持70多种编程语言,集成于40多种编辑器,具有闪电般的速度和最先进的建议质量。Codeium可以帮助开发者提高编程效率和质量,减少重复和繁琐的工作,轻松实现自己的想法。

2023-12-20 14:05:46 5596

原创 Kafka快速实战以及基本原理详解

ChatGPT对于Apache Kafka的介绍:Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分发到多个消费者中。Kafka消息系统由多个broker(服务器)组成,这些broker可以在多个数据中心之间分布式部署,以提供高可用性和容错性。Kafka的基本架构由生产者、消费者和主题(topic)组成。

2023-12-09 00:49:08 1183

原创 RocketMQ生产环境常见问题分析与总结

完整分析过后,整个RocketMQ消息零丢失的方案其实挺简单生产者使用事务消息机制。Broker配置同步刷盘+Dledger主从架构消费者不要使用异步消费。整个MQ挂了之后准备降级方案​ 那这套方案是不是就很完美呢?其实很明显,这整套的消息零丢失方案,在各个环节都大量的降低了系统的处理性能以及吞吐量。在很多场景下,这套方案带来的性能损失的代价可能远远大于部分消息丢失的代价。所以,我们在设计RocketMQ使用方案时,要根据实际的业务情况来考虑。

2023-10-26 00:46:43 314

原创 RocketMQ高性能核心原理与源码架构剖析

​ 从之前Producer发送消息的过程以及Conmer拉取消息的过程,我们可以抽象出RocketMQ中一个消息分配的管理模型。这个模型是我们在使用RocketMQ时,很重要的进行性能优化的依据。

2023-10-15 00:13:07 621

原创 RocketMQ核心编程模型以及生产环境最佳实践

在消息需要重试时,会先移动到对应的重试Topic中。这样,这些重试的消息有了自己单独的队列,就不会影响到Topic下的其他消息了。由于RocketMQ与消费者端有失败重试机制,所以,只要消息成功发送到RocketMQ了,那么可以认为Branch2.1,Branch2.2,Branch2.3这几个分支步骤,是可以保证最终的数据一致性的。但是,这里还是会造成一种分裂,消息最终是由Consumer来处理,但是消息却是由Broker推送过来的,也就是说,Consumer无法确定自己将要处理的是哪些消息。

2023-10-13 00:01:17 208

原创 RocketMQ快速实战以及集群架构详解

MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。这个词可以分两个部分来看,一是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。二是Queue:队列。队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。对于消息中间件产品来说,能不能保证FIFO特性,尚值得考量。但是,所有消息队列都是需要具备存储消息,让消息排队的能力。

2023-10-10 01:47:32 1659

原创 Redis缓存设计与性能优化

由于缓存层承载着大量请求, 有效地保护了存储层, 但是如果缓存层由于某些原因不能提供服务(比如超大并发过来,缓存层支撑不住,或者由于缓存设计不好,类似大量请求访问bigkey,导致缓存能支撑的并发急剧下降), 于是大量请求都会打到存储层, 存储层的调用量会暴增, 造成存储层也会级联宕机的情况。如果系统启动完马上就会有很多的请求过来,那么可以给redis连接池做预热,比如快速的创建一些redis连接,执行简单命令,类似ping(),快速的将连接池里的空闲连接提升到minIdle的数量。

2023-10-06 21:53:41 664 1

原创 一线大厂Redis高并发缓存架构实战与性能优化

首先zk会有一个leader节点,还会有多个flow节点(类似于redis的master和slave),当我们在leader节点设置一把分布所锁的时候,leader节点不会立即将设置的结果返回客户端,leader会从其flow节点去复制key,当flow复制成功key返回信息给leader节点的时候,可能有人会说我们多搞几个节点,总不会那么多节点都挂掉吧,那我们想想,搞那么多节点,redis写key是不是也得消耗很多性能,我们使用redis的初衷就变了,那还不如用zk。但是这1s的数据有可能会丢失,所以。

2023-10-05 23:02:04 2532

原创 大厂生产级Redis高并发分布式锁实战

这段代码明显有很严重的并发问题,多线程并发执行的时候,假如三个线程同时执行,如果原先300的库存,理论三个线程执行完剩余库存是297,但是因为代码没有任何锁的控制,会导致同时读取300的库存,同时扣减1,又同时设置299到redis中去,会导致超卖问题。但是这样写还是会有问题,假如业务代码+接口响应时间的执行时间超过了10s,那么key就自动过期了,会导致其他线程抢占到锁,但是之前的线程执行结束的时候,会去释放锁,但是释放的不是自己的锁,而是后来的线程的锁。就是锁释放的时候,依然存在原子性问题。

2023-10-04 16:11:56 948

原创 Redis Cluster集群运维与核心原理剖析

奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。

2023-10-01 23:42:29 733

原创 Redis持久化、主从与哨兵架构详解

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。注意,不要在Lua脚本中出现死循环和耗时的运算,否则redis会阻塞,将不接受其他的命令, 所以使用时要注意不能出现死循环、耗时的运算。

2023-09-30 23:57:48 550

原创 Redis核心数据结构实战与高性能原理剖析

scan 参数提供了三个参数,第一个是 cursor 整数值(hash桶的索引值),第二个是 key 的正则模式,第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。注意:但是scan并非完美无瑕, 如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。Clients 客户端相关信息。

2023-08-28 23:14:53 73

原创 Spring 之事务底层源码解析

一个Bean在执行Bean的创建生命周期时,会经过InfrastructureAdvisorAutoProxyCreator的初始化后的方法,会判断当前当前Bean对象是否和BeanFactoryTransactionAttributeSourceAdvisor匹配,匹配逻辑为判断该Bean的类上是否存在@Transactional注解,或者类中的某个方法上是否存在@Transactional注解,如果存在则表示该Bean需要进行动态代理产生一个代理对象作为Bean对象。

2023-08-25 23:32:23 72 1

原创 SpringAOP底层实现源码解析

DefaultAdvisorAutoProxyCreator的父类是AbstractAdvisorAutoProxyCreator。

2023-08-21 23:15:52 89

原创 Spring之循环依赖底层底层源码解析

很简单,就是A对象依赖了B对象,B对象依赖了A对象。// A依赖了Bclass A{public B b;// B依赖了Aclass B{public A a;那么循环依赖是个问题吗?如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。a.b = b;b.a = a;这样,A,B就依赖上了。但是,在Spring中循环依赖就是一个问题了,为什么?

2023-08-18 23:40:50 78 1

原创 SpringIoC之依赖注入源码解析

如果是constructor,那么就可以不写set方法了,当某个bean是通过构造方法来注入时,spring利用构造方法的参数信息从Spring容器中去找bean,找到bean之后作为参数传给构造方法,从而实例化得到一个bean对象,并完成属性赋值(属性赋值的代码得程序员来写)。其实构造方法注入相当于byType+byName,普通的byType是根据set方法中的参数类型去找bean,找到多个会报错,而constructor就是通过构造方法中的参数类型去找bean,如果找到多个会根据参数名确定。

2023-08-14 23:03:55 74

原创 SpringIOC之Bean生命周期源码解析

Bean的生成过程

2023-08-10 17:52:28 66

原创 Spring整体源码架构前置核心概念解析

ListableBeanFactory:在BeanFactory的基础上,增加了其他功能,可以获取所有BeanDefinition的beanNames,可以根据某个类型获取对应的beanNames,可以根据某个类型获取{类型:对应的Bean}的映射关系。为什么要使用ASM技术,Spring启动的时候需要去扫描,如果指定的包路径比较宽泛,那么扫描的类是非常多的,那如果在Spring启动时就把这些类全部加载进JVM了,这样不太好,所以使用了ASM技术。

2023-08-09 01:13:37 57

原创 手写模拟Spring源码启动过程

在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。提供先进的推理,复杂的指令,更多的创造力。

2023-08-06 22:02:58 42

原创 Spring底层整体脉络

紧接着,Spring会判断该对象是否实现了InitializingBean接口,如果实现了,就表示当前对象必须实现该接口中的afterPropertiesSet()方法,那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化)最后,Spring会判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,如果需要进行AOP,则会进行动态代理并生成一个代理对象做为Bean(初始化后)

2023-08-04 23:36:14 159

原创 深入理解并发可见性、有序性、原子性与JMM内存模型

JSR-133使用happens-before的概念来指定两个操作之间的执行顺序。由于这两个操作可以在一个线程之内,也可以在不同的线程之内。因此,JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证。JSR-133规范对happens-before关系的定义如下:1)如果一个操作happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

2023-08-03 20:48:43 183

原创 线程池ForkJoinPool工作原理分析

文章目录一、如何快速高效的对2千万大小数组进行排序二、单线程和多线程并行场景下归并排序性能对比三、Java并行框架Fork/Join使用详解四、Fork/Join处理递归任务和阻塞任务注意事项五、ForkJoinPool工作原理分析一、如何快速高效的对2千万大小数组进行排序二、单线程和多线程并行场景下归并排序性能对比三、Java并行框架Fork/Join使用详解四、Fork/Join处理递归任务和阻塞任务注意事项五、ForkJoinPool工作原理分析

2023-08-02 11:08:53 179

原创 线程池ThreadPoolExecutor底层源码分析

文章目录一、线程池中基本属性和方法源码解析二、线程池的五种状态变换源码分析三、线程池添加线程源码解析四、线程池线程运行执行任务源码解析五、线程池shutdown源码解析线程池中线程退出机制源码解析一、线程池中基本属性和方法源码解析二、线程池的五种状态变换源码分析三、线程池添加线程源码解析四、线程池线程运行执行任务源码解析五、线程池shutdown源码解析线程池中线程退出机制源码解析

2023-08-01 00:49:06 80

原创 线程池ThreadPoolExecutor底层原理分析

Tomcat中用的线程池为org.apache.tomcat.util.threads.ThreadPoolExecutor,注意类名和JUC下的一样,但是包名不一样。注入传入的队列为TaskQueue,它的入队逻辑为:‘特殊在:入队时,如果线程池的线程个数等于最大线程池数才入队入队时,如果线程池的线程个数小于最大线程池数,会返回false,表示入队失败这样就控制了,Tomcat的这个线程池,在提交任务时:1.仍然会先判断线程个数是否小于核心线程数,如果小于则创建线程。

2023-07-30 21:43:47 125

原创 阻塞队列BlockingQueue实战及其原理分析

文章目录一、阻塞队列的特性及其应用场景分析二、如何设计一个阻塞队列三、ArrayBlockingQueue实现原理分析四、LinkedBlockingQueue实现原理分析五、延迟队列DelayQueue再下单场景中的应用六、如何选择适合的阻塞队列一、阻塞队列的特性及其应用场景分析二、如何设计一个阻塞队列三、ArrayBlockingQueue实现原理分析四、LinkedBlockingQueue实现原理分析五、延迟队列DelayQueue再下单场景中的应用六、如何选择适合的阻塞队列

2023-07-29 23:37:08 192

原创 深入理解AQS之ReentrantLock源码分析

文章目录一、如何设计一把独占锁二、管理模型MESA详解三、基于MESA规范Java是如何设计AQS的四、基于AQS手写一把独占锁五、JUC下独占锁ReentrantLock源码分析一、如何设计一把独占锁二、管理模型MESA详解三、基于MESA规范Java是如何设计AQS的四、基于AQS手写一把独占锁五、JUC下独占锁ReentrantLock源码分析

2023-07-26 23:45:59 91

原创 JUC并发工具类在大厂的应用场景详解

jdk提供了比synchronized更加高级的各种同步工具,包括。等,可以实现更加丰富的多线程操作。

2023-07-25 23:37:24 55

原创 并发安全问题

文章目录一、线程安全性线程封闭栈封闭TheadLocal无状态的类让类不可变加锁和 CAS二、死锁概念学术化的定义现象、危害和解决现象危害解决三、其他安全问题活锁线程饥饿四、线程安全的单例模式双重检查锁定单例模式推荐实现懒汉式饿汉式一、线程安全性线程封闭栈封闭TheadLocal无状态的类让类不可变加锁和 CAS二、死锁概念学术化的定义现象、危害和解决现象危害解决三、其他安全问题活锁线程饥饿四、线程安全的单例模式双重检查锁定单例模式推荐实现懒汉式饿汉式

2023-07-24 18:02:22 51

原创 CAS&Atomic 原子操作详解

文章目录一、什么是原子操作?如何实现原子操作?二、CAS 实现原子操作的三大问题ABA 问题循环时间长开销大只能保证一个共享变量的原子操作三、Jdk 中相关原子操作类的使用四、LongAdder一、什么是原子操作?如何实现原子操作?二、CAS 实现原子操作的三大问题ABA 问题循环时间长开销大只能保证一个共享变量的原子操作三、Jdk 中相关原子操作类的使用四、LongAdder

2023-07-23 23:16:25 64

原创 导致 JVM 内存泄露的 ThreadLocal 详解

文章目录一、为什么要有 ThreadLocal二、ThreadLocal 的使用三、实现解析四、引发的内存泄漏分析五、错误使用 ThreadLocal 导致线程不安全一、为什么要有 ThreadLocal二、ThreadLocal 的使用三、实现解析四、引发的内存泄漏分析五、错误使用 ThreadLocal 导致线程不安全

2023-07-21 23:27:39 61

原创 从0开始深入理解并发、线程与等待通知机制(下)

在调用 wait ()、 、notify() 系列方法 之前,线程必须要获得该对象的对象级用 别锁,即只能在同步方法或同步块中调用 wait ()方法、 、notify() 系列方法,进入 wait()方法后,当前线程释放锁,在从 wait()返回前,线程与其他线程竞争重新获得锁,执行 notify()系列方法的线程退出调用了 notifyAll 的 synchronized代码块的时候后,他们就会去竞争。线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行,直到终止。

2023-07-20 00:38:09 62

原创 从0开始深入理解并发、线程与等待通知机制(中)

根据 Loom 团队在 2018 年公布的他们对 Jetty 基于纤程改造后的测试结果,同样在 5000QPS 的压力下, 以容量为 400 的线程池的传统模式和每个请求配以一个纤程的新并发处理模式进行对比, 前者的请求响应延迟在 10000 至 20000毫秒之间, 而后者的延迟普遍在 200 毫秒以下,目前 Java 中比较出名的协程库是 Quasar[ ˈkweɪzɑː® ](Loom 项目的 Leader 就是 Quasar 的作者 Ron Pressler),可以看到性能的提升还是非常明显的。

2023-07-17 23:42:52 98

原创 从0开始深入理解并发线程与等待通知机制(上)

因为 run 方法里有阻塞调用时会无法很快检测到取消标志,线程必须从阻塞调用返回后,才会检查这个取消标志。这种情况下,使用中断会更好,因为。

2023-07-16 18:28:06 47

原创 JVM调优实战及常量池详解

s0还是常量池 中"zhuge”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”zhuge”的引用,s2因为有后半部分 new String(”ge”)所以也无法在编译期确定,所以也是一个新创建对象”zhuge”的引用;String中的intern方法是一个 native 的方法,当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串。出现,所谓右值是指等号右边的值,如:int a=1 这里的a为左值,1为右值。

2023-07-14 16:08:58 53

原创 JVM调优工具详解及调优实战

增加如下配置行JAVA_OPTS。

2023-07-12 22:30:19 277

原创 垃圾收集器G1&ZGC详解

: gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。不过, 这里设置的“期望值”必须是符合实际的, 不能异想天开, 毕竟G1是要冻结用户线程来复制对象的, 这个停顿时。

2023-07-10 23:54:18 742

原创 垃圾收集器ParNew&CMS与 底层三色标记算法详解

对于对象年龄应该为多少才移动到老年代比较合适,本例中一次minor gc要间隔二三十秒,大多数对象一般在几秒内就会变为垃圾,完全可以将默认的15岁改小一点,比如改为5,那么意味着对象要经过5次minor gc才会进入老年代,整个时间也有一两分钟了,如果对象这么长时间都没被回收,完全可以认为这些对象是会存活的比较长的对象,可以移动到老年代,而不是继续一直占用survivor区空间。黑色的对象代表已经扫描过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。

2023-07-09 22:53:13 82

原创 JVM对象创建与内存分配机制深度剖析

1.jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩2.jvm配置参数:UseCompressedOops,compressed­­压缩、oop(ordinary object pointer)­­对象指针3.启用指针压缩:-­XX:+UseCompressedOops(

2023-07-06 23:33:00 187

原创 JVM内存模型深度剖析与优化

main方法先执行,先开辟一个main方法的栈空间,然后调用compute方法,compute的栈空间在main栈空间的上面,等局部方法执行完,局部变量全部释放掉,等于把compute这块栈帧内存空间释放掉,说白了就是出栈,结束之后才会回调main方法,然后走完main方法,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大。

2023-07-05 22:28:55 134

空空如也

空空如也

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

TA关注的人

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