伍佰亿网站怎么样,烟台百度网站,提供注册公司地址,下载字体安装到wordpress官方文档#xff1a;Disruptor
1. 简介 Disruptor是一个高性能的互进程#xff08;Inter-process#xff09;和多线程#xff08;Multi-threaded#xff09;消息处理库#xff0c;由LMAX交易所开发#xff0c;用于在Java虚拟机#xff08;JVM#xff09;上实现高性能…官方文档Disruptor
1. 简介 Disruptor是一个高性能的互进程Inter-process和多线程Multi-threaded消息处理库由LMAX交易所开发用于在Java虚拟机JVM上实现高性能的交换和处理数据。Disruptor的核心目标是提供一种低延迟、高吞吐量的解决方案。 一些关键特性 Disruptor设计用来减少延迟因为它避免了使用锁和线程间上下文切换而是采用了一种基于缓存行cache line的设计理念。 通过使用无锁编程和环形缓冲区Ring Buffer来实现高效的数据交换Disruptor能够达到纳秒级别的延迟。 Disruptor的API简洁易于理解和使用使得开发者可以快速地集成到现有的系统中。 它支持多种消息处理模式包括单线程、多线程和多进程处理。 Disruptor基于事件驱动模型可以处理事件的发布和订阅。 它保证了事件的顺序和一致性这对于需要顺序处理的业务场景非常重要。 Disruptor可以轻松地扩展以适应不同的处理需求无论是增加消费者数量还是处理不同类型的事件。 它提供了精细的内存管理策略包括预分配内存和内存屏障Memory Barriers的使用以确保数据的可见性和一致性。 Disruptor的工作流程大致如下 生产者Producer向环形缓冲区发布事件。 消费者Consumer从环形缓冲区读取事件并处理。 环形缓冲区Ring Buffer一个固定大小的缓冲区事件被顺序地写入并且可以被多个消费者并发读取。 序列屏障Sequence Barrier用于同步生产者和消费者之间的进度确保消费者不会读取到未完全写入的事件。 2. 比较 与Spring消息监听器、Redis发布/订阅、Guava的EventBus一样提供生产消息与消费消息的能力极大的解耦应用程序各模块。
特性/技术DisruptorRedis发布订阅Guava EventBusSpring消息监听器设计目的高性能、低延迟的消息处理分布式消息传递简化事件发布和订阅流程与Spring框架集成的声明式事件处理性能极高纳秒级延迟较高受网络延迟影响适中适用于中等负载适中依赖于Spring事件传播机制可靠性高适合关键任务较低消息可能会丢失适中需要正确管理订阅和发布高Spring框架提供事务支持易用性低需要深入了解并发编程高简单的发布订阅模型高直观的API和灵活的线程模型高Spring框架提供注解支持分布式支持否仅限于单个JVM内部是支持跨多个节点和应用的消息传递否仅限于单个JVM内部否仅限于单个JVM内部除非结合消息中间件线程模型无锁设计多线程多线程基于发布订阅机制支持同步和异步事件分发支持同步和异步事件分发适用场景高性能计算如金融交易系统分布式系统的消息传递如微服务架构简单的事件驱动应用需要灵活的事件处理需要Spring框架支持的企业级应用配置复杂度高需要配置事件、工厂和处理器低Redis简单配置即可使用低通过注解或API简单配置低Spring框架自动配置社区和文档活跃由LMAX提供支持非常活跃Redis社区广泛支持活跃Guava库由Google维护非常活跃Spring社区广泛支持扩展性高可以自定义事件和处理器高可以与其他Redis特性结合使用高可以自定义事件处理逻辑高可以自定义事件和监听器持久性否内存中处理不提供持久化是可以结合Redis持久化选项否内存中处理不提供持久化可以结合数据库事务管理持久化 3. 实例
3.1 添加依赖
!-- disruptor--
dependencygroupIdcom.lmax/groupIdartifactIddisruptor/artifactIdversion3.4.2/version
/dependency 3.2 消息实体
package org.example.event;public class TradeEvent {private long tradeId;private String symbol;private double price;private int volume;// Constructor, getters and setterspublic TradeEvent() {}public long getTradeId() {return tradeId;}public void setTradeId(long tradeId) {this.tradeId tradeId;}public String getSymbol() {return symbol;}public void setSymbol(String symbol) {this.symbol symbol;}public double getPrice() {return price;}public void setPrice(double price) {this.price price;}public int getVolume() {return volume;}public void setVolume(int volume) {this.volume volume;}
} 3.3 消息实体工厂
import com.lmax.disruptor.EventFactory;public class TradeEventFactory implements EventFactoryTradeEvent {Overridepublic TradeEvent newInstance() {return new TradeEvent();}
} 3.4 消息处理器
public class TradeEventHandler implements EventHandlerTradeEvent {Overridepublic void onEvent(TradeEvent event, long sequence, boolean endOfBatch) {System.out.println(String.format(Trade Event. ID: %d, Symbol: %s, Price: %.2f, Volume: %d,event.getTradeId(), event.getSymbol(), event.getPrice(), event.getVolume()));}
} 3.5 配置disruptor启动器
package org.example.config;import com.lmax.disruptor.dsl.Disruptor;
import org.example.event.TradeEvent;
import org.example.event.TradeEventFactory;
import org.example.event.TradeEventHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.Executor;
import java.util.concurrent.Executors;Configuration
public class DisruptorConfig {Beanpublic DisruptorTradeEvent disruptor() {int bufferSize 1024;Executor executor Executors.newCachedThreadPool();DisruptorTradeEvent disruptor new Disruptor(new TradeEventFactory(), bufferSize, executor);disruptor.handleEventsWith(new TradeEventHandler());System.out.println(Disruptor created.);disruptor.start();return disruptor;}} 3.6 测试
curl --request POST \--url http://localhost:8080/trade?apipost_id35ef4f1dbd9000 \--header Accept: */* \--header Accept-Encoding: gzip, deflate, br \--header Connection: keep-alive \--header Content-Type: application/json \--header User-Agent: PostmanRuntime-ApipostRuntime/1.1.0 \--data {tradeId:1111,symbol:测试标记,price:32.3,volume:3
} 控制台输出
Trade Event. ID: 1111, Symbol: 测试标记, Price: 32.30, Volume: 3