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

  yu5RdGEzncIO   2023年11月12日   36   0   0 Java

在RocketMQ5.0以前,有两种集群部署模式,分别为主从模式(Master-Slave模式)和Dledger模式。 主从模式主从模式中分为Master和Slave两个角色,集群中可以有多个Master节点,一个Master节点可以有多个Slave节点。Master节点负责接收生产者发送的写入请求,将消息写入CommitLog文件,Slave节点会与Master节点建立连接,从Master节点同步消息数据(有同步复制和异步复制两种方式)。消费者可以从Master节点拉取消息,也可以从Slave节点拉取消息。在RocketMQ4.5版本之前,如果Master宕机,不支持自动将Slave切换为M...

  yu5RdGEzncIO   2023年11月02日   115   0   0 Java

代理模式代理模式一般包含三个角色: Subject:主题对象,一般是一个接口,定义一些业务相关的基本方法。 RealSubject:具体的主题对象实现类,它会实现Subject接口中的方法。 Proxy:代理对象,里面包含一个RealSubject的引用,外部会通过这个代理对象,来实现RealSubject中方法的调用。 JAVA中提供了动态代理的实现,需要依赖InvocationHandler。 举个例子 Subject 首先创建一个主题对象,里面定义一个execute方法: publicinterfaceSubject{ voidexecute(); } RealSubject 接着...

  yu5RdGEzncIO   2023年11月02日   55   0   0 Java

Pop模式消费和消息粒度负载均衡 在RocketMQ5.0之前,消费有两种方式可以从Broker获取消息,分别为Pull模式和Push模式。 Pull模式:消费需要不断的从阻塞队列中获取数据,如果没有数据就等待,这个阻塞队列中的数据由消息拉取线程从Broker拉取消息之后加入的,所以Pull模式下消费需要不断主动从Broker拉取消息。 Push模式:需要注册消息监听器,当有消息到达时会通过回调函数进行消息消费,从表面上看就像是Broker主动推送给消费者一样,所以叫做推模式,底层依旧是消费者从Broker拉取数据然后触发回调函数进行消息消费,只不过不需要像Pull模式一样不断判断是否有消息...

  yu5RdGEzncIO   2023年11月02日   140   0   0 Java

BeanPostProcessor后置处理器是Spring提供的一个扩展点,可以在Bean初始化前后做一些事情,注意这里是bean的初始化,不是实例化,BeanPostProcessor是一个接口,里面提供了两个方法,分别为postProcessBeforeInitialization(初始化之前)和postProcessAfterInitialization(初始化之后),在方法入参中有两个参数,一个bean对象,一个bean名称,这里也可以看出,在初始化之前应该已经完成了bean的实例化,这里把实例化的bean对象作为参数传了进来: publicinterfaceBeanPostProce...

  yu5RdGEzncIO   2023年11月02日   61   0   0 Java

为了向云原生演进,提高资源利用和弹性能力,RocketMQ在5.0进行了架构的调整与升级,先来看新特性之一,增加了Proxy层。 增加Proxy代理层 计算存储分离计算存储分离是一种分层架构,将计算层与存储层分开。计算层指的是一些消耗计算资源的功能模块比如协议解析、消费管理等,存储指的是数据存储层,比如数据的存储格式、存储设计等与数据存储相关的功能。 应用通信协议应用通信协议一般会包含协议头和协议体两部分。协议头:主要是一些通用的信息,比如协议版本、请求标识、客户端信息等;协议体:本次通信具体的数据内容,规定了数据的传输格式,比如数据是字符串、JSON格式数据或者二进制数据等; RocketM...

  yu5RdGEzncIO   2023年11月02日   66   0   0 Java

RocketMQ在开启Dledger时,使用DLedgerCommitLog,其他情况使用的是CommitLog来管理消息的存储。在Dledger模式下,消息写入时Leader节点还需要将消息转发给Follower节点,有过半的节点响应成功,消息才算写入成功。 Leader消息写入 Dledger下有DLedgerMemoryStore(基于内存存储)和DLedgerMmapFileStore(基于Mmap文件映射)两种方式写入,接下来以DLedgerMmapFileStore为例,看下消息的写入过程。Leader节点在写入前会为消息构建DLedgerEntry对象,之后本地写入以及转发给Fo...

  yu5RdGEzncIO   2023年11月02日   46   0   0 Java

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

  yu5RdGEzncIO   2023年11月01日   40   0   0 Java

消息存储 在【RocketMQ】消息的存储一文中提到,Broker收到消息后会调用CommitLog的asyncPutMessage方法写入消息,在DLedger模式下使用的是DLedgerCommitLog,进入asyncPutMessages方法,主要处理逻辑如下: 调用serialize方法将消息数据序列化; 构建批量消息追加请求BatchAppendEntryRequest,并设置上一步序列化的消息数据; 调用handleAppend方法提交消息追加请求,进行消息写入; publicclassDLedgerCommitLogextendsCommitLog{ @Override p...

  yu5RdGEzncIO   2023年11月01日   64   0   0 Java

之前一直以为固态硬盘各方面都比机械硬盘性能高,所以首选固态硬盘,直到看了极客时间-深入浅出计算机组成原理中硬盘相关章节的内容,才发现固态硬盘原来是有缺点的,所以这里来做一个总结。 机械硬盘(HDD) 机械硬盘由以下几个部分组成: 盘面:盘面(盘片)上有一层磁性涂层,数据就是存储在这个磁性的涂层上,一个盘面在正反两面都有磁性涂层。盘面中央有一个可以旋转的主轴,主轴可以使盘片以固定的旋转速率进行旋转,我们看到磁盘标注的每分钟多少转(RPM,RevolutionPerMinute)指的就是这个旋转速率,比如7200转,表示一分钟可以旋转7200下: (注:图片来自极客时间-深入浅出计算机组成原理) ...

  yu5RdGEzncIO   2023年11月01日   59   0   0 Java

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

  yu5RdGEzncIO   2023年11月01日   67   0   0 Java

@RequestBody注解可以用于POST请求接收请求体中的参数,使用方式如下: @Controller publicclassIndexController{ @PostMapping(value="/submit",produces=MediaType.APPLICATION_JSON_VALUE) publicvoidsubmit(@RequestBodyUserInfouserInfo){ System.out.println(userInfo.toString()); } } 那么是如何从请求中解析数据设置到对应的参数中呢,接下来就从源码的角度一探究竟。 DispatcherS...

  yu5RdGEzncIO   2023年11月01日   39   0   0 Java

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

  yu5RdGEzncIO   2023年11月01日   73   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~