<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[mjunz的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/mjunz</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; mjunz]]></copyright><item><title><![CDATA[Dubbo源码—1.服务发布的主要流程]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/150260557</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/150260557</guid><author>mjunz</author><pubDate>Tue, 12 Aug 2025 08:53:09 +0800</pubDate><description><![CDATA[首先通过ScopeModel组件体系获取服务数据存储组件，然后将要发布的服务注册到服务数据存储组件里，接着把相关信息封装成一个服务提供者，并将该服务提供者也注册到服务数据存储组件中，然后生成注册的URL，最后根据协议和生成的注册的URL来发布服务。此时，在RegistryProtocol.export()方法中，进行服务注册时使用的Registry其实是一个ListenerRegistryWrapper装饰器，装饰着一个ZooKeeperRegistry。]]></description><category></category></item><item><title><![CDATA[Disruptor—4.与Netty的简单应用]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148218351</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148218351</guid><author>mjunz</author><pubDate>Mon, 26 May 2025 08:54:12 +0800</pubDate><description><![CDATA[本文介绍了基于Netty实现高并发长连接服务的最佳实践方案。主要内容包括：1.服务端和客户端的代码实现，重点说明了Netty的双线程组模型和参数配置优化；2.分析Netty性能瓶颈，提出使用Disruptor异步处理业务逻辑的方案；3.详细讲解了Disruptor的核心实现，包括环形缓冲池、多生产者/消费者模型的封装；4.最终实现了支持百万级长连接的高性能架构。通过线程池优化、异步处理、资源池化等技术手段，显著提升了系统的并发处理能力。该方案适用于需要处理大量长连接的实时通信场景。]]></description><category></category></item><item><title><![CDATA[Disruptor—3.核心源码实现分析二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148216015</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148216015</guid><author>mjunz</author><pubDate>Sun, 25 May 2025 23:29:34 +0800</pubDate><description><![CDATA[Disruptor消费者源码分析摘要：Disruptor通过BatchEventProcessor和WorkProcessor实现消费者功能。消费者通过handleEventsWith()或handleEventsWithWorkerPool()方法绑定，启动时通过线程池执行run()方法消费数据。BatchEventProcessor通过修改Sequence实现环形缓冲区的数据消费，WorkProcessor则通过CAS操作更新消费进度。Disruptor采用序号栅栏机制协调生产消费节奏，避免锁的使用。其]]></description><category></category></item><item><title><![CDATA[Disruptor—3.核心源码实现分析一]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148216002</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148216002</guid><author>mjunz</author><pubDate>Sun, 25 May 2025 23:29:00 +0800</pubDate><description><![CDATA[本文分析了Disruptor高性能框架的核心源码实现，重点探讨了其生产者机制。Disruptor通过RingBuffer环形数组存储事件消息，支持单生产者和多生产者两种模式。生产者通过Sequencer接口实现类（SingleProducerSequencer或MultiProducerSequencer）来发布消息，主要有两种方式：一是先获取Sequence序号再填充数据并发布；二是通过EventTranslator事件转换器直接发布。Disruptor的高性能源于其独特设计：内存预加载机制、单线程写入、]]></description><category></category></item><item><title><![CDATA[Disruptor—2.并发编程相关简介]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148197840</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148197840</guid><author>mjunz</author><pubDate>Sat, 24 May 2025 23:10:32 +0800</pubDate><description><![CDATA[本文系统介绍了Java并发编程的核心知识点，主要包括：1）并发类容器如ConcurrentHashMap、CopyOnWrite容器的实现原理和使用场景；2）volatile关键字的可见性和禁止指令重排序特性；3）Atomic系列类的CAS实现和UnSafe类的作用；4）JUC常用工具类如CountDownLatch、Future模式等；5）AQS架构及各种锁的实现原理；6）线程池的最佳实践，包括参数配置和优雅关闭等。通过深入分析这些并发编程的核心组件，帮助开发者构建高效、安全的并发系统。]]></description><category></category></item><item><title><![CDATA[Disruptor—1.原理和使用简介]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148172846</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148172846</guid><author>mjunz</author><pubDate>Fri, 23 May 2025 17:45:27 +0800</pubDate><description><![CDATA[Disruptor是一个高性能的异步处理框架，由LMAX开发，用于在低延迟环境下处理大量数据。其核心是RingBuffer，一个无锁的环形缓冲区，支持高效的数据生产和消费。Disruptor通过事件驱动模型简化了并发编程，性能优于传统的BlockingQueue，尤其在多生产者和多消费者场景下表现更为突出。其编程模型包括事件工厂、事件处理器和Disruptor实例的配置，支持串行、并行及复杂的多边形操作。Disruptor的等待策略（如BlockingWaitStrategy、YieldingWaitStr]]></description><category></category></item><item><title><![CDATA[Seata源码—9.Seata XA模式的事务处理二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148129870</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148129870</guid><author>mjunz</author><pubDate>Thu, 22 May 2025 09:09:20 +0800</pubDate><description><![CDATA[本文详细介绍了Seata XA分布式事务的实现及其与AT模式的区别。首先，通过seata-samples项目的seata-xa模块展示了如何基于Seata XA模式实现分布式事务的提交和回滚，并对比了XA模式与AT模式在数据源代理类型和undo_log表需求上的差异。接着，文章深入探讨了Seata XA分布式事务案例中各模块的运行流程，包括账户服务、订单服务、库存服务和全局事务入口服务的实现细节。此外，文章还介绍了Seata如何通过SpringBoot自动装配简化复杂配置，特别是全局事务注解扫描组件的自动装]]></description><category></category></item><item><title><![CDATA[Seata源码—9.Seata XA模式的事务处理一]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148129739</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148129739</guid><author>mjunz</author><pubDate>Thu, 22 May 2025 09:09:13 +0800</pubDate><description><![CDATA[本文详细介绍了Seata XA分布式事务的实现及其与AT模式的区别。首先，通过seata-samples项目的seata-xa模块展示了如何基于Seata XA模式实现分布式事务的提交和回滚，并对比了XA模式与AT模式在数据源代理类型和undo_log表需求上的差异。接着，文章深入探讨了Seata XA分布式事务案例中各模块的运行流程，包括账户服务、订单服务、库存服务和全局事务入口服务的实现细节。此外，文章还介绍了Seata如何通过SpringBoot自动装配简化复杂配置，特别是全局事务注解扫描组件的自动装]]></description><category></category></item><item><title><![CDATA[Seata源码—8.Seata Saga模式的事务处理二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148103801</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148103801</guid><author>mjunz</author><pubDate>Wed, 21 May 2025 09:18:00 +0800</pubDate><description><![CDATA[本文详细介绍了SeataSaga状态机引擎的工作原理及其在分布式事务中的应用。首先，通过状态机定义和Dubbo服务调用配置，分析了SeataSaga的状态机与分布式事务的关系。接着，探讨了状态机数据库的启动和基于数据库的状态机配置初始化过程。文章还深入解析了状态机引擎的核心组件，包括状态机定义仓储组件、状态机引擎接口、流程上下文构建器、状态日志存储组件等。通过源码分析，展示了状态机实例的创建、流程上下文的发布、状态操作组件的使用以及服务调用组件的执行过程。最后，文章总结了状态机引擎如何通过业务处理器处理当前]]></description><category></category></item><item><title><![CDATA[Seata源码—8.Seata Saga模式的事务处理一]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148103615</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148103615</guid><author>mjunz</author><pubDate>Wed, 21 May 2025 09:05:24 +0800</pubDate><description><![CDATA[SeataSaga案例通过状态机机制实现分布式事务的提交和回滚，涉及两个Dubbo服务：InventoryAction和BalanceAction。状态机定义文件描述了事务的流程，包括服务调用和补偿操作。SeataSaga通过状态机调度和编排分布式事务的执行，确保事务的一致性和可靠性。案例中，状态机配置和实例存储在数据库中，通过状态机引擎启动和管理事务。Dubbo服务的配置和调用通过XML文件进行定义，确保服务的正确调用和事务的执行。状态机引擎通过流程控制机制处理事务的启动、执行、补偿和重启，确保事务的完整]]></description><category></category></item><item><title><![CDATA[Seata源码—7.Seata TCC模式的事务处理二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148079393</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148079393</guid><author>mjunz</author><pubDate>Tue, 20 May 2025 08:51:27 +0800</pubDate><description><![CDATA[TCCBeanParserUtils的isTccAutoProxy()方法会通过判断扫描的Spring Bean中的方法是否添加了TCC的注解，来决定是否要对Bean的方法进行TCC动态代理。如果调用添加了TCC的注解的方法，就会执行TccActionInterceptor的invoke()方法，此外只有分支事务的方法才会有可能被TCC动态代理。Action拦截处理器在注册TCC的分支事务时，会调用DefaultResourceManager的branchRegister()方法。]]></description><category></category></item><item><title><![CDATA[Seata源码—7.Seata TCC模式的事务处理一]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148079331</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148079331</guid><author>mjunz</author><pubDate>Tue, 20 May 2025 08:49:44 +0800</pubDate><description><![CDATA[在TccTransactionService的提交分布式事务的接口中，会先后调用TccActionOne和TccActionTwo两个Dubbo服务。该Demo中一个分布式事务内会有两个TCC事务参与者，这两个TCC事务参与者分别是TccActionOne和TccActionTwo。另外一个应用作为事务发起方，会订阅Dubbo服务，然后调用编排TCC参与者，执行远程Dubbo服务。该应用会订阅Dubbo服务，发起分布式事务，调用上述两个TCC参与者，内含TCC事务提交场景和TCC事务回滚场景的演示。]]></description><category></category></item><item><title><![CDATA[Seata源码—6.Seata AT模式的数据源代理三]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148062703</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148062703</guid><author>mjunz</author><pubDate>Mon, 19 May 2025 14:23:28 +0800</pubDate><description><![CDATA[本文详细解析了Seata分布式事务框架的核心源码实现，重点包括资源管理、数据源代理、事务注册与交互、SQL执行、全局锁管理、分支事务提交与回滚等关键流程。通过分析SeataClient与SeataServer的交互机制，深入探讨了全局事务的提交与回滚过程，包括UndoLog的删除、全局锁的获取与释放等细节。文章还介绍了Seata如何通过异步化处理分支事务提交，以及全局事务回滚的流程与提交流程的相似性。整体上，本文为理解Seata的分布式事务实现提供了全面的源码级解析。]]></description><category></category></item><item><title><![CDATA[Seata源码—6.Seata AT模式的数据源代理二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148062645</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148062645</guid><author>mjunz</author><pubDate>Mon, 19 May 2025 14:22:24 +0800</pubDate><description><![CDATA[本文详细解析了Seata分布式事务框架中分支事务注册与全局锁获取的源码实现。首先，SeataServer收到分支事务注册请求后，通过ServerOnRequestProcessor和DefaultCoordinator进行处理，最终调用DefaultCore的branchRegister()方法完成分支事务的注册。在注册过程中，系统会根据xid获取全局事务会话，并创建分支事务会话，同时通过MDC将分支事务ID存入线程本地变量。注册分支事务时，系统会尝试获取全局锁，若获取失败则抛出异常，表示分支事务注册失败。]]></description><category></category></item><item><title><![CDATA[Seata源码—6.Seata AT模式的数据源代理一]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148052511</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148052511</guid><author>mjunz</author><pubDate>Sun, 18 May 2025 23:50:32 +0800</pubDate><description><![CDATA[Seata的分布式事务管理机制通过资源管理、数据源代理、分支事务注册等核心组件实现。其核心流程包括：1. 资源管理：通过DataSourceProxy代理数据源，实现资源的分组、ID获取和分支事务类型管理。2. 分支事务注册：客户端通过RmNettyRemotingClient向服务器注册资源管理器（RM），服务器处理注册请求并返回响应。3. SQL执行与事务控制：通过ConnectionProxy和PreparedStatementProxy代理数据库连接和SQL句柄，在执行SQL前取消自动提交事务，构建]]></description><category></category></item><item><title><![CDATA[Seata源码—5.全局事务的创建与返回处理二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148036022</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148036022</guid><author>mjunz</author><pubDate>Sat, 17 May 2025 23:34:40 +0800</pubDate><description><![CDATA[由于Seata Client发送开启全局事务的请求给Seata Server时，会通过MessageFuture的get()方法同步等待Seata Server返回响应。所以当Seata Client获取Seata Server的响应并通过complete()方法设置MessageFuture已经完成后，原来同步等待Seata Server响应的线程便会继续往下处理。当RootContext的xid为null + RpcContext的xid不为null时，需要设置RootContext的xid。]]></description><category></category></item><item><title><![CDATA[Seata源码—5.全局事务的创建与返回处理一]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148036003</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148036003</guid><author>mjunz</author><pubDate>Sat, 17 May 2025 23:33:47 +0800</pubDate><description><![CDATA[在DefaultCore的begin()方法中，首先就会创建一个全局事务会话，然后将全局事务会话的xid通过MDC放入线程本地变量副本中，接着对该全局事务会话添加一个全局事务会话的生命周期监听器，最后打开该全局事务会话、发布会话开启事件并返回全局事务会话的xid。在事务执行模版TransactionalTemplate的excute()方法中，首先会判断Propagation全局事务传播级别，然后开启一个全局事务(也就是打开一个全局事务)，接着才执行具体的业务目标方法。]]></description><category></category></item><item><title><![CDATA[Seata源码—4.全局事务拦截与开启事务处理二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148017925</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148017925</guid><author>mjunz</author><pubDate>Fri, 16 May 2025 21:44:03 +0800</pubDate><description><![CDATA[syncCall()方法在调用TmNettyRemotingClient实例的sendSyncRequest()方法发送请求时，其实调用的是TmNettyRemotingClient的抽象父类AbstractNettyRemotingClient的sendSyncRequest()方法。在ServerOnRequestProcessor的process()方法的处理过程中，会调用TransactionMessageHandler的onRequest()方法处理RpcMessage对象。]]></description><category></category></item><item><title><![CDATA[Seata源码—4.全局事务拦截与开启事务处理一]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/148017830</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/148017830</guid><author>mjunz</author><pubDate>Fri, 16 May 2025 21:40:35 +0800</pubDate><description><![CDATA[SeataServer的启动入口位于ServerApplication类，通过Spring Boot启动。网络服务器的启动由NettyRemotingServer类负责，初始化时会注册各种处理器以处理不同类型的消息。全局事务拦截器GlobalTransactionalInterceptor负责拦截带有@GlobalTransactional注解的方法，并通过TransactionalTemplate执行全局事务。全局事务的传播级别包括REQUIRED、REQUIRES_NEW等，根据不同的传播级别，事务的执]]></description><category></category></item><item><title><![CDATA[Seata源码—3.全局事务注解扫描器的初始化二]]></title><link>https://blog.youkuaiyun.com/mjunz/article/details/147994719</link><guid>https://blog.youkuaiyun.com/mjunz/article/details/147994719</guid><author>mjunz</author><pubDate>Thu, 15 May 2025 23:55:29 +0800</pubDate><description><![CDATA[全局事务注解扫描器（GlobalTransactionScanner）的初始化过程主要包括三个核心步骤：首先，初始化TM（Transaction Manager）全局事务管理器客户端，确保事务管理的功能可用；其次，初始化RM（Resource Manager）分支事务资源管理器客户端，以管理分支事务资源；最后，扫描Spring容器中的Bean，对添加了Seata相关注解（如@GlobalTransactional、@GlobalLock等）的Bean创建全局事务动态代理，确保这些方法在执行时能够被Seata]]></description><category></category></item></channel></rss>