- 博客(248)
- 收藏
- 关注
原创 秒杀系统—2.第一版初步实现的技术文档
然后在seckill-operation模块下新增秒杀商品时发送消息到RocketMQ,这个新增秒杀商品的消息会被seckill-page模块消费来渲染秒杀商品页面。在seckill-inventory模块中消费新增秒杀商品消息来冻结库存,然后把秒杀商品的库存进行分片,放在Redis各节点上去。在seckill-page模块会消费新增秒杀商品消息,然后使用freemarker渲染秒杀商品页面。seckill-operation模块主要有两个接口:添加秒杀场次 + 添加秒杀商品。
2025-05-28 09:36:51
87
原创 秒杀系统—1.架构设计和方案简介
为了保证不出现超卖,就要舍弃A,保证CP。因为在七层协议上进行负载均衡的性能远不如LVS,而仅仅在四层协议上进行负载均衡的LVS又不能进行一些高阶的转发,也就是没有办法根据HTTP请求的内容去进行一些高阶的功能和转发。接着,从内核空间切换到用户空间,将HTTP协议请求交给用户空间运行的一个负载均衡技术去处理,也就是根据请求里的一些内容来将请求转发给真实的后端服务器。请求报文的目标端口改写成选定服务器的相应端口(RS提供的服务端口),最后将修改后的报文发送给选出的服务器RS(Real Server)。
2025-05-27 14:26:54
675
原创 Disruptor—4.与Netty的简单应用
本文介绍了基于Netty实现高并发长连接服务的最佳实践方案。主要内容包括:1.服务端和客户端的代码实现,重点说明了Netty的双线程组模型和参数配置优化;2.分析Netty性能瓶颈,提出使用Disruptor异步处理业务逻辑的方案;3.详细讲解了Disruptor的核心实现,包括环形缓冲池、多生产者/消费者模型的封装;4.最终实现了支持百万级长连接的高性能架构。通过线程池优化、异步处理、资源池化等技术手段,显著提升了系统的并发处理能力。该方案适用于需要处理大量长连接的实时通信场景。
2025-05-26 08:54:12
367
原创 Disruptor—3.核心源码实现分析二
Disruptor消费者源码分析摘要:Disruptor通过BatchEventProcessor和WorkProcessor实现消费者功能。消费者通过handleEventsWith()或handleEventsWithWorkerPool()方法绑定,启动时通过线程池执行run()方法消费数据。BatchEventProcessor通过修改Sequence实现环形缓冲区的数据消费,WorkProcessor则通过CAS操作更新消费进度。Disruptor采用序号栅栏机制协调生产消费节奏,避免锁的使用。其
2025-05-25 23:29:34
836
原创 Disruptor—3.核心源码实现分析一
本文分析了Disruptor高性能框架的核心源码实现,重点探讨了其生产者机制。Disruptor通过RingBuffer环形数组存储事件消息,支持单生产者和多生产者两种模式。生产者通过Sequencer接口实现类(SingleProducerSequencer或MultiProducerSequencer)来发布消息,主要有两种方式:一是先获取Sequence序号再填充数据并发布;二是通过EventTranslator事件转换器直接发布。Disruptor的高性能源于其独特设计:内存预加载机制、单线程写入、
2025-05-25 23:29:00
439
原创 Disruptor—2.并发编程相关简介
本文系统介绍了Java并发编程的核心知识点,主要包括:1)并发类容器如ConcurrentHashMap、CopyOnWrite容器的实现原理和使用场景;2)volatile关键字的可见性和禁止指令重排序特性;3)Atomic系列类的CAS实现和UnSafe类的作用;4)JUC常用工具类如CountDownLatch、Future模式等;5)AQS架构及各种锁的实现原理;6)线程池的最佳实践,包括参数配置和优雅关闭等。通过深入分析这些并发编程的核心组件,帮助开发者构建高效、安全的并发系统。
2025-05-24 23:10:32
965
原创 Disruptor—1.原理和使用简介
Disruptor是一个高性能的异步处理框架,由LMAX开发,用于在低延迟环境下处理大量数据。其核心是RingBuffer,一个无锁的环形缓冲区,支持高效的数据生产和消费。Disruptor通过事件驱动模型简化了并发编程,性能优于传统的BlockingQueue,尤其在多生产者和多消费者场景下表现更为突出。其编程模型包括事件工厂、事件处理器和Disruptor实例的配置,支持串行、并行及复杂的多边形操作。Disruptor的等待策略(如BlockingWaitStrategy、YieldingWaitStr
2025-05-23 17:45:27
809
原创 Seata源码—9.Seata XA模式的事务处理二
本文详细介绍了Seata XA分布式事务的实现及其与AT模式的区别。首先,通过seata-samples项目的seata-xa模块展示了如何基于Seata XA模式实现分布式事务的提交和回滚,并对比了XA模式与AT模式在数据源代理类型和undo_log表需求上的差异。接着,文章深入探讨了Seata XA分布式事务案例中各模块的运行流程,包括账户服务、订单服务、库存服务和全局事务入口服务的实现细节。此外,文章还介绍了Seata如何通过SpringBoot自动装配简化复杂配置,特别是全局事务注解扫描组件的自动装
2025-05-22 09:09:20
762
原创 Seata源码—9.Seata XA模式的事务处理一
本文详细介绍了Seata XA分布式事务的实现及其与AT模式的区别。首先,通过seata-samples项目的seata-xa模块展示了如何基于Seata XA模式实现分布式事务的提交和回滚,并对比了XA模式与AT模式在数据源代理类型和undo_log表需求上的差异。接着,文章深入探讨了Seata XA分布式事务案例中各模块的运行流程,包括账户服务、订单服务、库存服务和全局事务入口服务的实现细节。此外,文章还介绍了Seata如何通过SpringBoot自动装配简化复杂配置,特别是全局事务注解扫描组件的自动装
2025-05-22 09:09:13
1131
原创 Seata源码—8.Seata Saga模式的事务处理二
本文详细介绍了SeataSaga状态机引擎的工作原理及其在分布式事务中的应用。首先,通过状态机定义和Dubbo服务调用配置,分析了SeataSaga的状态机与分布式事务的关系。接着,探讨了状态机数据库的启动和基于数据库的状态机配置初始化过程。文章还深入解析了状态机引擎的核心组件,包括状态机定义仓储组件、状态机引擎接口、流程上下文构建器、状态日志存储组件等。通过源码分析,展示了状态机实例的创建、流程上下文的发布、状态操作组件的使用以及服务调用组件的执行过程。最后,文章总结了状态机引擎如何通过业务处理器处理当前
2025-05-21 09:18:00
1318
原创 Seata源码—8.Seata Saga模式的事务处理一
SeataSaga案例通过状态机机制实现分布式事务的提交和回滚,涉及两个Dubbo服务:InventoryAction和BalanceAction。状态机定义文件描述了事务的流程,包括服务调用和补偿操作。SeataSaga通过状态机调度和编排分布式事务的执行,确保事务的一致性和可靠性。案例中,状态机配置和实例存储在数据库中,通过状态机引擎启动和管理事务。Dubbo服务的配置和调用通过XML文件进行定义,确保服务的正确调用和事务的执行。状态机引擎通过流程控制机制处理事务的启动、执行、补偿和重启,确保事务的完整
2025-05-21 09:05:24
1305
原创 Seata源码—7.Seata TCC模式的事务处理二
TCCBeanParserUtils的isTccAutoProxy()方法会通过判断扫描的Spring Bean中的方法是否添加了TCC的注解,来决定是否要对Bean的方法进行TCC动态代理。如果调用添加了TCC的注解的方法,就会执行TccActionInterceptor的invoke()方法,此外只有分支事务的方法才会有可能被TCC动态代理。Action拦截处理器在注册TCC的分支事务时,会调用DefaultResourceManager的branchRegister()方法。
2025-05-20 08:51:27
395
原创 Seata源码—7.Seata TCC模式的事务处理一
在TccTransactionService的提交分布式事务的接口中,会先后调用TccActionOne和TccActionTwo两个Dubbo服务。该Demo中一个分布式事务内会有两个TCC事务参与者,这两个TCC事务参与者分别是TccActionOne和TccActionTwo。另外一个应用作为事务发起方,会订阅Dubbo服务,然后调用编排TCC参与者,执行远程Dubbo服务。该应用会订阅Dubbo服务,发起分布式事务,调用上述两个TCC参与者,内含TCC事务提交场景和TCC事务回滚场景的演示。
2025-05-20 08:49:44
581
原创 Seata源码—6.Seata AT模式的数据源代理三
本文详细解析了Seata分布式事务框架的核心源码实现,重点包括资源管理、数据源代理、事务注册与交互、SQL执行、全局锁管理、分支事务提交与回滚等关键流程。通过分析SeataClient与SeataServer的交互机制,深入探讨了全局事务的提交与回滚过程,包括UndoLog的删除、全局锁的获取与释放等细节。文章还介绍了Seata如何通过异步化处理分支事务提交,以及全局事务回滚的流程与提交流程的相似性。整体上,本文为理解Seata的分布式事务实现提供了全面的源码级解析。
2025-05-19 14:23:28
380
原创 Seata源码—6.Seata AT模式的数据源代理二
本文详细解析了Seata分布式事务框架中分支事务注册与全局锁获取的源码实现。首先,SeataServer收到分支事务注册请求后,通过ServerOnRequestProcessor和DefaultCoordinator进行处理,最终调用DefaultCore的branchRegister()方法完成分支事务的注册。在注册过程中,系统会根据xid获取全局事务会话,并创建分支事务会话,同时通过MDC将分支事务ID存入线程本地变量。注册分支事务时,系统会尝试获取全局锁,若获取失败则抛出异常,表示分支事务注册失败。
2025-05-19 14:22:24
785
原创 Seata源码—6.Seata AT模式的数据源代理一
Seata的分布式事务管理机制通过资源管理、数据源代理、分支事务注册等核心组件实现。其核心流程包括:1. 资源管理:通过DataSourceProxy代理数据源,实现资源的分组、ID获取和分支事务类型管理。2. 分支事务注册:客户端通过RmNettyRemotingClient向服务器注册资源管理器(RM),服务器处理注册请求并返回响应。3. SQL执行与事务控制:通过ConnectionProxy和PreparedStatementProxy代理数据库连接和SQL句柄,在执行SQL前取消自动提交事务,构建
2025-05-18 23:50:32
891
原创 Seata源码—5.全局事务的创建与返回处理二
由于Seata Client发送开启全局事务的请求给Seata Server时,会通过MessageFuture的get()方法同步等待Seata Server返回响应。所以当Seata Client获取Seata Server的响应并通过complete()方法设置MessageFuture已经完成后,原来同步等待Seata Server响应的线程便会继续往下处理。当RootContext的xid为null + RpcContext的xid不为null时,需要设置RootContext的xid。
2025-05-17 23:34:40
362
原创 Seata源码—5.全局事务的创建与返回处理一
在DefaultCore的begin()方法中,首先就会创建一个全局事务会话,然后将全局事务会话的xid通过MDC放入线程本地变量副本中,接着对该全局事务会话添加一个全局事务会话的生命周期监听器,最后打开该全局事务会话、发布会话开启事件并返回全局事务会话的xid。在事务执行模版TransactionalTemplate的excute()方法中,首先会判断Propagation全局事务传播级别,然后开启一个全局事务(也就是打开一个全局事务),接着才执行具体的业务目标方法。
2025-05-17 23:33:47
639
原创 Seata源码—4.全局事务拦截与开启事务处理二
syncCall()方法在调用TmNettyRemotingClient实例的sendSyncRequest()方法发送请求时,其实调用的是TmNettyRemotingClient的抽象父类AbstractNettyRemotingClient的sendSyncRequest()方法。在ServerOnRequestProcessor的process()方法的处理过程中,会调用TransactionMessageHandler的onRequest()方法处理RpcMessage对象。
2025-05-16 21:44:03
1004
原创 Seata源码—4.全局事务拦截与开启事务处理一
SeataServer的启动入口位于ServerApplication类,通过Spring Boot启动。网络服务器的启动由NettyRemotingServer类负责,初始化时会注册各种处理器以处理不同类型的消息。全局事务拦截器GlobalTransactionalInterceptor负责拦截带有@GlobalTransactional注解的方法,并通过TransactionalTemplate执行全局事务。全局事务的传播级别包括REQUIRED、REQUIRES_NEW等,根据不同的传播级别,事务的执
2025-05-16 21:40:35
721
原创 Seata源码—3.全局事务注解扫描器的初始化二
全局事务注解扫描器(GlobalTransactionScanner)的初始化过程主要包括三个核心步骤:首先,初始化TM(Transaction Manager)全局事务管理器客户端,确保事务管理的功能可用;其次,初始化RM(Resource Manager)分支事务资源管理器客户端,以管理分支事务资源;最后,扫描Spring容器中的Bean,对添加了Seata相关注解(如@GlobalTransactional、@GlobalLock等)的Bean创建全局事务动态代理,确保这些方法在执行时能够被Seata
2025-05-15 23:55:29
997
原创 Seata源码—3.全局事务注解扫描器的初始化一
在initClient()方法中,会先调用TMClient的init()方法对TM全局事务管理器客户端进行初始化,然后调用RMClient的init()方法对RM分支事务资源管理器客户端进行初始化。比如在src/resources/META-INF.services/目录下,有一个名为如下文件名的文件,表示可动态扩展的接口是如下接口名,该文件里配置的几个类就是实现了该接口的类。这些动态扩展会在如下目录进行配置,这个目录下的文件名就是可以进行动态扩展的接口名称,文件里的内容就是该接口的实现类。
2025-05-15 23:51:58
1044
原创 Seata源码—2.seata-samples项目介绍
本文详细介绍了Seata与Dubbo整合的分布式事务示例项目seata-samples的配置和启动流程。主要内容包括:1. 各服务(用户、库存、订单、业务)的配置文件和启动类,展示了如何通过Spring和Dubbo配置服务,并使用Seata的DataSourceProxy代理数据库连接池。2. 业务服务启动时的核心工作,重点介绍了通过@GlobalTransactional注解开启分布式事务,以及Seata的GlobalTransactionScanner如何扫描并管理事务。3. 库存服务的连接池配置,展示
2025-05-14 22:41:00
963
原创 Seata源码—1.Seata分布式事务的模式简介
Seata是一款开源的分布式事务解决方案,支持AT、TCC、SAGA和XA事务模式,适用于微服务架构。AT模式通过两阶段提交协议实现事务,一阶段提交业务数据和回滚日志,二阶段异步提交或回滚。TCC模式则通过Try、Commit、Cancel三个阶段实现事务,适用于异构存储系统。SAGA模式适用于长事务,通过正向服务和补偿服务实现事务管理。Seata还支持单服务多库的分布式事务,并提供了与RocketMQ集成的可靠消息最终一致性事务方案。通过官网示例,用户可以快速了解Seata的工作机制和应用场景。
2025-05-14 22:38:18
1177
原创 Nacos源码—9.Nacos升级gRPC分析八
本文详细分析了gRPC客户端和服务端的初始化过程、心跳机制、连接处理及请求映射机制。首先,gRPC客户端通过初始化与服务器建立连接,并通过心跳机制进行健康检查。服务端启动时,通过BaseGrpcServer的startServer()方法启动,并使用建造者模式创建Server对象。在处理客户端连接请求时,服务端通过connectionId与Client对象进行绑定,具体通过ConnectionManager的register()方法实现。此外,gRPC服务端通过addServices()方法将请求映射到对应
2025-05-13 23:58:21
930
原创 Nacos源码—9.Nacos升级gRPC分析七
文章主要分析了gRPC客户端的初始化、心跳机制以及服务端处理连接请求的过程。首先,gRPC客户端通过NacosNamingService的registerInstance()方法进行服务实例注册,并根据实例类型选择使用gRPC或HTTP客户端代理。gRPC客户端代理的初始化包括创建RpcClient对象、启动RPC客户端连接以及注册处理服务端推送请求的Handler。其次,gRPC客户端的心跳机制通过两个线程任务实现:一个处理连接成功或断开时的通知,另一个处理重连或健康检查。健康检查通过向服务端发送Heal
2025-05-13 23:57:22
675
原创 Nacos源码—8.Nacos升级gRPC分析六
文章主要分析了Nacos中的事件驱动架构及其实现机制。首先,服务端通过事件驱动的方式处理客户端的变化,如客户端注册、注销等事件,并通过Distro协议或Raft协议进行集群数据同步。文章详细介绍了如何处理ClientChangedEvent和ClientDeregisterServiceEvent事件,分别对应客户端注册和注销时的操作。接着,文章探讨了ServiceChangeEvent事件的处理,即服务变动时通知订阅者更新本地缓存。最后,文章总结了Nacos事件驱动架构的使用方法,包括自定义事件、订阅者以
2025-05-12 22:29:05
675
原创 Nacos源码—8.Nacos升级gRPC分析五
本文详细介绍了服务端对服务实例进行健康检查的设计逻辑、源码实现以及服务下线时的注销处理流程。健康检查通过探活机制,定期检查客户端连接的最后活跃时间,若超过20秒则将其加入待移除集合,并通过探活请求确认客户端是否下线。若探活失败,则执行注销操作,移除连接对象并发布客户端注销事件。服务下线时,客户端通过gRPC请求通知服务端,服务端处理请求后移除实例信息并发布相关事件,同步集群节点数据并更新注册表。此外,文章还分析了Nacos事件驱动架构的源码,包括事件发布、订阅者注册及通知机制的实现。
2025-05-12 22:22:48
1293
原创 Nacos源码—7.Nacos升级gRPC分析四
在微服务架构中,服务变动时通知订阅的客户端以及微服务实例信息的同步是确保系统一致性和可用性的关键。当服务实例注册或注销时,服务端会发布ClientChangedEvent事件,该事件触发集群节点间的数据同步。具体流程如下: 事件发布:服务实例注册或注销时,服务端发布ClientChangedEvent事件,触发集群节点同步服务实例数据。 事件处理:DistroClientDataProcessor处理ClientChangedEvent事件,调用syncToAllServer方法,通过DistroProto
2025-05-09 23:46:38
1202
原创 Nacos源码—7.Nacos升级gRPC分析三
在微服务架构中,服务变动和订阅通知是确保服务发现和通信的关键机制。本文详细描述了Nacos服务端如何处理客户端注册和订阅事件,并通过事件发布机制通知相关客户端。当客户端注册或注销服务实例时,Nacos服务端会发布ClientRegisterServiceEvent或ClientDeregisterServiceEvent事件,并更新注册表。随后,服务端会发布ServiceChangedEvent事件,通知所有订阅该服务的客户端。对于服务订阅事件,Nacos服务端会发布ClientSubscribeServi
2025-05-09 23:45:19
1303
原创 Nacos源码—6.Nacos升级gRPC分析二
Nacos 2.x版本在服务注册与发现机制上进行了显著优化,客户端通过gRPC发起服务注册,服务端则处理注册请求并管理服务实例。客户端进行服务发现时,借助Ribbon实现负载均衡,通过NacosServerList获取服务实例列表。服务端处理订阅请求时,首先根据Service对象读取缓存中的服务实例,然后添加订阅者并发布相关事件。Nacos客户端通过NacosNamingService进行服务发现,若本地缓存无数据,则通过gRPC请求服务端获取实例信息。服务端通过ServiceStorage和ClientS
2025-05-08 23:40:59
909
原创 Nacos源码—6.Nacos升级gRPC分析一
Nacos 2.x版本在客户端和服务端的交互方式、注册表结构以及事件驱动机制上进行了显著优化。首先,客户端和服务端的通信从HTTP升级为gRPC,提升了性能和效率。其次,注册表结构从双重Map简化为轻量级Map,减少了并发冲突的可能性。此外,Nacos 2.x大量采用事件驱动机制,如服务注册、销毁和变更等操作均通过事件通知中心处理,增强了系统的灵活性和可扩展性。客户端在启动时会自动通过gRPC发起服务注册,服务端则通过多个Map和事件处理机制来管理服务实例的注册和订阅。这些改进使得Nacos 2.x在微服务
2025-05-08 23:35:06
1347
原创 Nacos源码—5.Nacos配置中心实现分析二
在异步任务AsyncTask的run()方法中,会一直从queue中获取通知任务,以便将配置数据同步到对应的集群节点。当集群节点处理"/v1/cs/communication/dataChange"这个HTTP请求时,会调用CommunicationController的notifyConfigInfo()方法,接着调用DumpService的dump()方法将请求包装成DumpTask同步数据任务,然后调用TaskManager的addTask()方法将DumpTask同步数据任务放入map。
2025-05-07 23:13:03
838
原创 Nacos源码—5.Nacos配置中心实现分析一
但要注意共享配置文件里的配置不要和自身应用配置文件里的配置重复,因为自身应用配置文件比共享配置文件的优先级高。在调用PropertySourceLocator实现类的locateCollection()方法时,会先调用PropertySourceLocator扩展接口的locateCollection()方法,从而才会触发调用PropertySourceLocator实现类实现的locate()方法,比如调用NacosPropertySourceLocator的locate()方法。
2025-05-07 23:11:55
1130
原创 Nacos源码—4.Nacos集群高可用分析四
Follower节点拿到Leader节点返回的Instance服务实例信息后,会继续调用RaftStore.write()、PersistentNotifier.notify()这两个方法,一个将数据持久化到本地文件、一个将数据同步到内存注册表,从而最终完成以Leader节点为准的心跳请求同步数据的流程。Follower节点拿到心跳包中的key之后,发现部分key在自身节点是不存在的,那么这时Follower节点就会根据这些key向Leader节点获取Instance的详细信息进行同步。
2025-05-06 23:41:04
1105
原创 Nacos源码—4.Nacos集群高可用分析三
当Leader节点接收到一个数据写入请求时:首先会在自身的节点进行数据处理,然后马上同步给集群的其他节点,此时Leader节点的这个数据的状态是uncommit状态。假设原本的Leader节点是B,但由于B突然下线,节点A、C会重新发起投票,最终节点C成为新的Leader节点。只是节点C和节点A、B之间的数据略有差异,但不影响节点的正常使用。在心跳传输过程中,Leader节点会把最新的数据传给其他Follower节点,以保证Follower节点中的数据和Leader节点的数据是一致的。分区指的是网络分区。
2025-05-06 23:39:52
857
原创 Nacos源码—3.Nacos集群高可用分析二
如果调用ServiceManager的containService()方法时发现服务不存在,则先通过ServiceManager的createEmptyService()方法创建空的服务,然后会调用DistroProtocol的onReceive()方法注册服务实例,接着会调用DistroConsistencyServiceImpl的processData()方法进行处理,最后又会调用实例注册时的DistroConsistencyServiceImpl的onPut()方法。
2025-05-05 23:45:45
1041
原创 Nacos源码—3.Nacos集群高可用分析一
而其他的集群节点,并不会去执行对该Service的心跳健康检查。当Nacos服务端也就是Service的init()方法执行完成心跳健康检查任务后,ServiceManager的init()方法会有一个定时任务,同步检查结果到其他节点。在ServiceController的serviceStatus()方法中,如果通过对比入参和注册表的ServiceChecksum后,发现服务状态发生了改变,那么就会调用ServiceManager.addUpdatedServiceToQueue()方法。
2025-05-05 23:44:02
965
原创 Nacos源码—2.Nacos服务注册发现分析四
Nacos服务端处理服务下线的入口是InstanceController的deregister()方法,然后会调用ServiceManager的removeInstance()方法移除注册表里的实例,也就是调用ServiceManager的substractIpAddresses()方法。在Service的updateIPs()方法中:会先调用Cluster的updateIps()方法通过写时复制机制去修改注册表,然后调用PushService的serviceChanged()方法发布服务变动事件。
2025-04-29 23:53:01
767
原创 Nacos源码—2.Nacos服务注册发现分析三
在nacos-client的NacosNamingService的selectInstances()方法中:首先会调用HostReactor的getServiceInfo()方法获取服务实例列表,然后调用HostReactor的getServiceInfo0()方法尝试从本地缓存获取,接着调用HostReactor的updateServiceNow()方法查询并更新缓存,也就是调用HostReactor的updateService()方法查询并更新缓存。:找出哪些Instance服务实例是不健康的。
2025-04-29 23:52:10
910
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人