自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(249)
  • 资源 (12)
  • 收藏
  • 关注

原创 【MySQL】MySQL中的锁

因为写锁与读锁之间相互互斥,当然写锁和写锁之间更是互斥的,既然要保证数据修改的安全性,那么如果有读操作在进行,是不能进行表结构变更操作的,反之亦是如此,如果正在修改表结构,也是不能进行读操作的,必须要等待前一个操作完成才可以进行下一个操作。元数据锁(meta data lock)不需要显示的使用,访问表的时候会自动添加MDL锁,添加MDL锁的原因是防止表结构出现不一致,假设查询数据的过程中,突然表结构被修改了,与最开始拿到的表结构不一致,在某些场景下可能会影响非常大。

2023-11-13 11:08:57 175

原创 【Spring】事务实现原理

在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,Spring事务底层是通过AOP来实现的,所以启用事务后,同样会向容器中注入一个代理对象创建器,AOP使用的是AnnotationAwareAspectJAutoProxyCreator,事务使用的是InfrastructureAdvisorAutoProxyCreator。Advice通知:定义在切点上需要执行什么样的操作;PointCut切点:定义在哪些方法上使用通知;

2023-11-10 10:50:04 134

原创 【Spring】AOP实现原理

对于AOP,在invoke方法中,会先获取目标方法的所有拦截器,Spring会将适用于当前方法的Advisor转为方法拦截器,然后使用责任链模式,对拦截器进行一个个的调用,当然如果当前方法没有对应的拦截器需要执行,直接通过反射执行目标方法即可。此时已经是拦截器链中最后一个,所以此时可以执行目标方法,执行完目标方法,拦截器链的逻辑已经执行完毕,所以对于第二个拦截器来说,会回到环绕通知中的处理逻辑,开始执行目标方法执行之后的后置操作。前置知识:JDK动态代理,可参考。

2023-11-09 10:26:30 194

原创 【RocketMQ】数据的清理机制

Broker在启动的时候会注册定时任务,定时清理过期的数据,默认是每10s执行一次,分别清理CommitLog文件和ConsumeQueue文件:CommitLog文件清理CommitLog文件清理的逻辑主要在CleanCommitLogService中,它是DefaultMessageStore的内部类,调用了deleteExpiredFiles方法删除过期文件:在执行清理任务之前,首先会获取一些配置参数,然后通过isTimeToDelete方法判断是否到了清理文件的时间,通过isSpaceToDe

2023-10-24 20:15:32 776

原创 【RocketMQ】RocketMQ 5.0新特性(三)- Controller模式

JDK的动态代理实现原理是在运行中动态生成代理类,这个代理类实现了Subject接口,在对代理类进行实例化的时候,需要传入InvocationHandler,当调用代理类的方法时,会执行InvocationHandler的invoke方法,在invoke方法中再执行真正的目标方法,从而完成代理功能。

2023-10-23 09:07:04 722

原创 【Java】JDK动态代理实现原理

JDK的动态代理实现原理是在运行中动态生成代理类,这个代理类实现了Subject接口,在对代理类进行实例化的时候,需要传入InvocationHandler,当调用代理类的方法时,会执行InvocationHandler的invoke方法,在invoke方法中再执行真正的目标方法,从而完成代理功能。

2023-10-16 09:33:06 105 2

原创 【RcoketMQ】RcoketMQ 5.0新特性(二)- Pop消费模式

由于一个消息队列中的消息可以被多个消费者消费,如果某个消费者在消费某条消息之后一直未发生ACK消息,那么Broker是如何管理消费进度的,比如队列1中有1、2、3、4、5条消息,此时有三个消费者1、2、3,分别分配到了队列中的1、2、3条消息,此时消费者1已经对消息1ACK完毕,消费者3也对消息3ACK完毕,消费者2一直未ACK消息2,那么Broker如何设置消费进度?CheckPoint会优先保存在内存中,如果在一段时间内收到了客户端的ACK消息,就会将对应的CheckPoint清除,并更新消费进度;

2023-10-13 09:39:49 151

原创 【RocketMQ】RocketMQ5.0新特性(一)- Proxy

为了向云原生演进,提高资源利用和弹性能力,RocketMQ在5.0进行了架构的调整与升级,先来看新特性之一,增加了Proxy层。

2023-10-12 09:03:49 634

原创 【RocketMQ】(十一)Dledger模式下的日志复制

RocketMQ在开启Dledger时,使用DLedgerCommitLog,其他情况使用的是CommitLog来管理消息的存储。在Dledger模式下,消息写入时Leader节点还需要将消息转发给Follower节点,有过半的节点响应成功,消息才算写入成功。

2023-10-11 09:15:02 102

原创 【Java】Java中的零拷贝

计算机物理内存条的容量,比如我们买电脑会关注内存大小有多少G,这个容量就是计算机的物理内存。

2023-10-10 12:47:45 109

原创 【Java】 DirectByteBuffer堆外内存回收

当GC检测到对象的可达性发生变化时,会根据是否关联了引用队列来决定是否将状态更改为Pending或者Inactive,虚引用必须与引用队列结合使用,所以对于虚引用来说,如果它实际引用的对象需要被回收,垃圾回收器会将这个虚引用对象加入到一个Pending列表中,此时处于Pending状态。引用队列结合使用,在GC进行垃圾回收的时候,如果发现一个对象只有虚引用在引用它,则认为该对象需要被回收,会将引用该对象的虚引用加入到与其关联的。

2023-10-09 14:51:20 453

原创 【RocketMQ】RocketMQ存储结构设计

消费者在拉取消息进行消费的时候,就是通过这个ConsumeQueue实现的,消费者在向Broker发送消息拉取请求之前,需要知道应该从哪条消息开始消费,对于广播模式,消息的消费进度保存在消费者端本地,对于集群模式,消息的消费进度保存在Broker中,所以拉取某个消息队列的消息之前,会向Broker发送请求,获取该消息队列的消费进度,消费进度在RocketMQ的存储目录中有一个对应的文件,叫。RocketMQ一般会保存一个物理偏移量offSet,从CommitLog中获取消息内容。

2023-10-08 08:16:09 89

原创 【RocketMQ】(十)DLedger模式下的选主流程分析

RocketMQ 4.5版本之前,可以采用主从架构进行集群部署,但是如果master节点挂掉,不能自动在集群中选举出新的Master节点,需要人工介入,在4.5版本之后提供了DLedger模式,使用Raft算法,如果Master节点出现故障,可以自动选举出新的Master进行切换。Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群。:集群中的领导者,负责管理集群。:具有竞选Leader资格的角色,如果集群需要选举Leader,节点需要先转为候选者角色才可以发起竞选。

2023-10-07 09:15:13 200

原创 【Redis】基础数据结构-quicklist

/ 头指针// 尾指针/* 列表中的元素总个数,也就是所有ziplist中包含的元素数量之和 *//* 链表中节点的个数 *//* 表示ziplist的大小 */0=off */head:指向头结点的指针tail:指向尾节点的指针count:列表中的元素总个数,等于所有节点的ziplist中包含的元素数量之和len:quicklist中quicklistNode节点的个数数值含义-1表示ziplist的字节数不能超过4KB-2。

2023-10-06 10:55:03 855

原创 【Redis】基础数据结构-skiplist跳跃表

跳跃表的结构定义header:指向跳跃表中节点的头指针,跳跃表中的节点定义为zskiplistNode,跳跃表实际上也是一个链表,所以会有一个头结点tail:指向跳跃表中节点的尾指针length:跳跃表中节点的数量level:跳跃表的层级// 跳跃表// 指向跳跃表的头尾指针// 长度// 层级int level;节点的结构定义ele:一个sds类型的变量,存储实际的数据score:存储数据的分值,跳跃表就是按照这个分值进行排序的。

2023-10-05 13:36:40 223

原创 【Redis】基础数据结构-ziplist压缩列表

(1)Redis压缩列表使用了一块连续的内存,来节约内存空间。(2)压缩列表的节点可以存储字符串或者整数类型的值,它采用了变长的编码方式,根据数据类型的不同以及数据长度的不同,选择不同的编码方式,每种编码占用的字节大小不同,以此来节约内存。(3)压缩列表的每个节点中存储了前一个节点的字节长度,如果知道某个节点的地址,可以使用地址减去字节长度定位到上一个节点,不过新增节点的时候,由于前一个节点的长度大于254使用5个字节,小于254使用1个字节存储,在一些极端的情况下由于长度的变化会引起连锁更新。

2023-10-04 10:03:26 175

原创 【Redis】基础数据结构-字典

Redis字典底层使用哈希表实现。键值对放入哈希表的时候,会根据key的值,计算hash值,出现哈希冲突的时候,Redis采用链式哈希解决冲突,使用链表将这些冲突的元素链起来。由于Redis采用链式哈希解决冲突,那么在冲突频繁的场景下,链表会变得越来越长,这种情况下查找效率是比较低下的,需要遍历链表对比KEY的值来获取数据,为了处理效率低下的问题,需要对哈希表进行扩容,扩容的过程称为rehash。

2023-10-03 22:10:49 263

原创 【JAVA】普通IO数据拷贝次数的问题探讨

整个读取过程发生了两次数据拷贝,一次是DMA将磁盘上的文件数据拷贝到内核缓冲区,一次是将内核缓冲区的数据拷贝到用户缓冲区。在JAVA中,JVM划分了堆内存,平时创建的对象基本都在堆中,不过也可以通过NIO包下的ByteBuffer申请堆外内存无论是普通IO或者是NIO,在进行文件读写的时候一般都会创建一个buffer作为数据的缓冲区,读写相关方法底层是通过调用native函数(JNI调用)来实现的,在进行读写时将buffer传递给JNI。

2023-10-02 15:51:36 183

原创 【Redis】基础数据结构-简单动态字符串SDS

C语言中使用char*字符数组表示字符串,'\\0'来标记一个字符串的结束,不过在使用的过程中我们不需要显式的在字符串中加入'\0'。存在问题**1.二进制安全**C语言以'\0'标记字符串的结尾,如果一个字符串本身带有'\0',比如一些二进制数据,那么字符串就会被截断,导致无法存储二进制数据。

2023-10-02 10:21:53 163

原创 【RocketMQ】【源码】Dledger日志复制源码分析

调用dataFileList的append方法将dataBuffer内容写入日志文件,返回数据在文件中的偏移量;将索引信息写入indexBuffer;调用indexFileList的append方法将indexBuffer内容写入索引文件;ledgerEndIndex加1;设置ledgerEndTerm的值为当前Term;调用。

2023-09-30 13:35:04 134

原创 【RocketMQ】【源码】DLedger选主源码分析

RocketMQ 4.5版本之前,可以采用主从架构进行集群部署,但是如果master节点挂掉,不能自动在集群中选举出新的Master节点,需要人工介入,在4.5版本之后提供了DLedger模式,使用Raft算法,如果Master节点出现故障,可以自动选举出新的Master进行切换。Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群。Raft协议中有以下角色:Leader(领导者):集群中的领导者,负责管理集群。

2023-09-28 10:22:18 145

原创 【RocketMQ】(九)主从同步实现原理

默认情况下,消费者从Master节点拉取消息,Broker在处理消息拉取时会根据消息的拉取进度,进行判断,如果未拉取消息的大小超过了总物理内存的40%,此时会建议消费者从Slave节点拉取消息,Broker会将下次建议拉取消息的BrokerID,设置到响应中返回给消费者。从Slave节点拉取消息,需要开启配置项。

2023-09-27 10:06:43 177 1

原创 【RocketMQ】(八)Rebalance负载均衡

消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者消费不涉及负载均衡,而集群模式一个消息队列同一时间只能分配给组内的一个消费者进行消费。RocketMQ 5.0以前是按照队列粒度进行负载均衡的,5.0以后提供了按消息粒度进行负载均衡。

2023-09-26 08:35:03 796

原创 【RocketMQ】(七)事务实现原理

使用事务消息不会存在订单创建失败但是消息发送成功的情况,不过你可能还有一个疑问,假如订单创建成功了,消息已经投送到队列中,但是积分服务在消费的时候失败了,这样数据还是处于不一致的状态,个人感觉,积分服务可以在失败的时候进行重试或者进行一些其他的补偿机制来保证积分记录成功的生成,在极端情况下积分记录依旧没有生成,此时可能就要人工接入处理了。在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚。

2023-09-25 13:25:23 66

原创 【RocketMQ】(六)顺序消息实现原理

全局有序在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用。局部有序假设一个Topic分配了两个消息队列,生产者在发送消息的时候,可以对消息设置一个路由ID,比如想保证一个订单的相关消息有序,那么就使用订单ID当做路由ID,在发送消息的时候,通过订单ID对消息队列的个数取余,根据取余结果选择消息队列,这样同一个订单的数据就可以保证发送到一个消息队列中,消费者端使用

2023-09-23 10:55:14 154

原创 【RocketMQ】(五)消息的消费

消费者从Broker拉取到消息之后,会将消息提交到线程池中进行消费,RocketMQ消息消费是批量进行的,如果一批消息的个数小于预先设置的批量消费大小,直接构建消费请求`ConsumeRequest`将消费请求提交到线程池处理,否则需要分批构建进行提交。

2023-09-23 10:39:38 380

原创 【RocketMQ】(四)消息的拉取

在上一讲中,介绍了消息的存储,生产者向Broker发送消息之后,数据会写入到CommitLog中,这一讲,就来看一下消费者是如何从Broker拉取消息的。RocketMQ消息的消费以组为单位,有两种消费模式:广播模式:同一个消息队列可以分配给组内的每个消费者,每条消息可以被组内的消费者进行消费。集群模式:同一个消费组下,一个消息队列同一时间只能分配给组内的一个消费者,也就是一条消息只能被组内的一个消费者进行消费。通常使用集群模式的情况比较多,接下来以集群模式(Push模式)为例看一下消息的拉取过程。

2023-09-13 10:59:23 404

原创 【RocketMQ】(三)消息的存储

通过上面分析消息的持久化过程,来看下RocketMQ提升性能的一些地方。(1)RocketMQ在写入数据到CommitLog时,采用的是顺序写的方式,顺序写比随机写文件效率要高很多。(2)在异步刷盘时,可以使用暂存池,暂存池会提前申请好内存,申请内存是一个比较重的操作,所以避免在消息写入时申请内存,以此提高效率。使用了文件映射的方式,向CommitLog写入数据,可以减少数据的拷贝过程。参考RocketMQ官方文档郭慕荣-RocketMQ消息存储原理总结(一)

2023-09-13 10:58:29 107

原创 【RocketMQ】(二)消息的发送

在未启用故障延迟机制时,从该消息所属的Topic下的所有消息队列集合中,轮询选择消息队列进行发送,如果上一次选择了某个Broker发送消息,本次将不会再选择这个Broker,当然如果最后仍未找到满足要求的消息队列,将会跳过这个判断,直接从队列中轮询获取消息队列返回。

2023-08-16 21:52:18 148

原创 【RocketMQ】(一)NameServer

NameServer是一个注册中心,提供服务注册和服务发现的功能。NameServer可以集群部署,集群中每个节点都是对等的关系(没有像ZooKeeper那样在集群中选举出一个Master节点),节点之间互不通信。Broker启动的时候会向所有的NameServer节点进行注册,注意这里是向集群中所有的NameServer节点注册,而不是只向其中的某些节点注册,因为NameServer每个节点都是对等的,所以Broker需要向每一个节点进行注册,这样每一个节点都会有一份Broker的注册信息。

2023-08-16 21:39:44 506

原创 【RocketMQ】【源码】消息拉模式分析

RocketMQ有两种获取消息的方式,分别为推模式和拉模式。推模式在一文中已经讲过,虽然从名字上看起来是消息到达Broker后推送给消费者,实际上还是需要消费向Broker发送拉取请求获取消息内容,推模式对应的消息消费实现类为消息推模式的详细过程可参考,接下来我们看一下拉模式。对比上面推模式进行消费的例子,从使用方式上来讲,。拉模式在使用方式上,,所以叫做拉模式。

2023-04-25 21:56:08 1568 1

原创 【RocketMQ】【源码】负载均衡源码分析

RocketMQ在集群模式下,同一个消费组内,一个消息队列同一时间只能分配给组内的某一个消费者,也就是一条消息只能被组内的一个消费者进行消费,为了合理的对消息队列进行分配,于是就有了负载均衡。

2023-04-13 09:19:47 1204

原创 【RocketMQ】【源码】主从模式下的消费进度管理

消费者在启动的时候,会创建消息拉取API对象`PullAPIWrapper`,调用pullKernelImpl方法向Broker发送拉取消息的请求,那么在主从模式下消费者是如何选择向哪个Broker发送拉取请求的?

2023-04-13 09:17:58 1117

原创 【RocketMQ】【源码】主从同步实现原理

主从同步的实现逻辑主要在HAService中,在DefaultMessageStore的构造函数中,HAService进行了实例化,并在start方法中,启动了HAService

2023-04-12 09:26:09 1600

原创 【RocketMQ】【源码】顺序消息实现原理

假设一个Topic分配了两个消息队列,生产者在发送消息的时候,可以对消息设置一个路由ID,比如想保证一个订单的相关消息有序,那么就使用订单ID当做路由ID,在发送消息的时候,通过订单ID对消息队列的个数取余,根据取余结果选择消息队列,这样同一个订单的数据就可以保证发送到一个消息队列中,消费者端使用`MessageListenerOrderly`处理有序消息,这就是RocketMQ的局部有序,保证消息在某个消息队列中有序。

2023-04-12 09:23:02 1513

原创 【RocketMQ】【源码】事务的实现原理

在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚。以创建订单为例,假设下单后需要做两个操作:

2023-04-11 22:41:56 1542

原创 【RocketMQ】【源码】消息的拉取

消息的获取也有两种模式:拉模式:消费者主动发起拉取消息的请求,获取消息进行消费。推模式:消息到达Broker后推送给消费者。RocketMQ对拉模式进行了包装去实现推模式,**本质还是需要消费者去拉取,一个拉取任务完成后继续下一次拉取**。首先来看一个RocketMQ源码中基于推模式`DefaultMQPushConsumer`进行消费的例子,首先为消费者设置了消费者组名称,然后注册了消息监听器,并设置订阅的主题,最后调用start方法启动消费者

2023-04-09 22:29:20 1860

原创 【RocketMQ】【源码】消息的消费

当RocketMQ进行消息消费的时候,是通过`ConsumeMessageConcurrentlyService`的`submitConsumeRequest`方法,将消息提交到线程池中进行消费,具体的处理逻辑如下:1. 如果本次消息的个数小于等于批量消费的大小`consumeBatchSize`,构建消费请求`ConsumeRequest`,直接提交到线程池中进行消费即可2. 如果本次消息的个数大于批量消费的大小`consumeBatchSize`,说明需要分批进行提交

2023-04-09 22:27:51 1659

原创 【RocketMQ】【源码】消息的刷盘机制

消息的刷盘机制

2023-03-02 22:07:10 1292

原创 【RocketMQ】【源码】消息的存储

消息存储机制

2023-03-02 22:05:29 1268

nacos-server-2.0.3.zip

nacos-server-2.0.3.zip

2022-03-01

fileipload

springmvc上传单个文件的demo

2017-06-07

spring-aop

spring aop的demo http://blog.csdn.net/lom9357bye/article/details/72812089

2017-06-03

spring学习

spring基于注解和XML装配bean的例子 http://blog.csdn.net/lom9357bye/article/details/72802342

2017-05-30

springboot

springboot操作mysql

2017-04-09

scrollDemo

Elasticsearch的scroll分页查询用法 http://blog.csdn.net/lom9357bye/article/details/64500638

2017-03-21

springbootdemo

springboot的一个简单demo

2016-12-19

json与bean的转换

json-lib中的jsonobject的简单使用,并介绍了json与bean的转换 http://blog.csdn.net/lom9357bye/article/details/53291636

2016-11-22

elasticsearch简单例子

基于elasticsearch使用Java创建索引、更新索引、删除索引、查询索引的一个小例子 http://blog.csdn.net/lom9357bye/article/details/52841711

2016-10-17

SpinnerDemo

spinner用法的一个小例子 文章地址:http://blog.csdn.net/lom9357bye/article/details/50282791

2015-12-13

SAXParseXMLDemo

使用SAX解析XML,并将解析后的数据封装到自定义的XMLObject中

2015-12-12

MyPushDemo

Android百度云推送,通过百度云推送的SDK和下载的demo实现一个简单的消息推送

2015-12-12

空空如也

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

TA关注的人

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