`
steveoyung
  • 浏览: 29299 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

disruptor - 并发编程框架

 
阅读更多

disruptor发布了Java的2.0版本(.Net版本见这里),disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件-监听模式的实现,直接称disruptor模式。

disruptor最大特点是高性能,其LMAX架构可以获得每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。

disruptor与传统高性能模型是不同的,LMAX团队通过测试发现热门的Actor模型在高并发设计有瓶颈,disruptor的RingBuffer根据多核CPU的高速缓存设计特点进行了优化,让每个CPU运行一个线程,多个CPU就是多线程并发模式了,正如团队所言:我们想出一个更好,更快的线程之间共享数据的方式,不与世界分享将是自私的,不共享知识让我们看上去是死聪明。

传统消息框架使用Queue队列,如JDK LinkedList等数据结构实现,RingBuffer比Linked之类数据结构要快,因为没有锁,是CPU友好型的。另外一个不同的地方是不会在清除RingBuffer中数据,只会覆盖,这样降低了垃圾回收机制启动频率。

使用案例代码:

DisruptorWizard<MyEvent> dw = new DisruptorWizard<MyEvent>(MyEvent.FACTORY, 32, Executors.newCachedThreadPool());
		EventHandler<MyEvent> handler1 = new EventHandler<MyEvent>() {
			public void onEvent(MyEvent event, boolean endOfBatch) throws Exception {
				System.out.println("MyEvent=" + event.r);
			}

		};
		EventHandler<MyEvent> handler2 = new EventHandler<MyEvent>() {
			public void onEvent(MyEvent event, boolean endOfBatch) throws Exception {
				System.out.println("MyEvent=" + event.getResult());
			}

		};
		dw.handleEventsWith(handler1);
		dw.after(handler1).handleEventsWith(handler2);

		RingBuffer ringBuffer = dw.start();


		MyEvent event = (MyEvent) ringBuffer.nextEvent();
		event.setValue(60);
		ringBuffer.publish(event);


或者:

		SampleExecutor executor = new SampleExecutor();
		RingBuffer<MyEvent> ringBuffer = new RingBuffer<MyEvent>(MyEvent.FACTORY, 4, ClaimStrategy.Option.SINGLE_THREADED,
				WaitStrategy.Option.YIELDING);
		MyBatchHandler batchHandler = new MyBatchHandler();

		DependencyBarrier dependencyBarrier = ringBuffer.newDependencyBarrier();
		BatchEventProcessor<MyEvent> batchProcessorFizz = new BatchEventProcessor<MyEvent>(ringBuffer, dependencyBarrier, batchHandler);
		executor.execute(batchProcessorFizz);

		MyEvent event = ringBuffer.nextEvent();
		event.setValue(60);
		ringBuffer.publish(event);

 

Disruptor没有像JDK的LinkedBlockQueue等那样使用锁,针对CPU高速缓存进行了优化。

原来我们以为多个线程同时写一个类的字段会发生争夺,这是多线程基本原理,所以使用了锁机制,保证这个共用字段(资源)能够某个时刻只能一个线程写,但是这样做的坏处是:有可能发生死锁。

比如1号线程先后访问共享资源A和B;而2号线程先后访问共享资源B和A,因为在资源A和资源B都有锁,那么1号在访问资源A时,资源A上锁了,准备访问资源B,但是无法访问,因为与此同时;而2号线程在访问资源B,资源B锁着呢,正准备访问资源A,发现资源A被1号线程锁着呢,结果彼此无限等待彼此下去,死锁类似逻辑上自指悖论。

所以,锁是坏的,破坏性能,锁是并发计算的大敌。

我们回到队列上,一把一个队列有至少两个线程:生产者和消费者,这就具备了资源争夺的前提,这两个线程一般彼此守在队列的进出两端,表面上好像没有访问共享资源,实际上队列存在两个共享资源:队列大小或指针. 

除了共享资源写操作上存在资源争夺问题外,Disruptor的LMAX团队发现Java或C#在多核CPU情况下有伪共享问题
CPU会把数据从内存加载到高速缓存中 ,这样可以获得更好的性能,高速缓存默认大小是64 Byte为一个区域,CPU机制限制只能一个CPU的一个线程访问(写)这个高速缓存区。

CPU在将主内存中数据加载到高速缓冲时,如果发现被加载的数据不足64字节,那么就会加载多个数据,以填满自己的64字节,悲催就发生了,恰恰otspot JVM中对象指针等大小都不会超过64字节,这样一个高速缓冲中可能加载了两个对象指针,一个CPU一个高速缓冲,双核就是两个CPU各自一个高速缓冲,那么两个高速缓冲中各有两个对象指针,都是指向相同的两个对象。

因为一个CPU只能访问(写)自己高速缓存区中数据,相当于给这个数据加锁,那么另外一个CPU同时访问自己高速缓冲中同样数据时将会被锁定不能访问。

这就发生与锁机制类似的性能陷进,Disruptor的解决办法是填满高速缓冲的64字节,不是对象指针等数据不够64字节吗?那么加一些字节填满64字节,这样CPU将数据加载到高速缓冲时,就只能加载一个了,刚刚好啊。

所以,尽管两个线程是在写两个不同的字段值,也会因为双核CPU底层机制发生伪装的共享,并没有真正共享,其实还是排他性的独享。

现在我们大概知道RingBuffer是个什么东东了:
1.ring buffer是一个大的数组.
2.RingBuffer里所有指针都是Java longs (64字节) 不断永远向前计数,如后面图,不断在圆环中循环。
3.RingBuffer只有当前序列号,没有终点序列号,其中数据不会被取出后消除,这样以便实现从过去某个序列号到当前序列号的重放,这样当消费者说没有接受到生产者发送的消息,生产者还可以再次发送,这点是一种原子性的“事务”机制。

鉴于Disruptor如此革命性的优点,JdonFramework 6.4新版 采取Disruptor作为其Domain Events实现机制。 即可以方便简单享用Disruptor的新特点;又能根据自己的要求继续深化使用Disruptor,最极致的情况如运行的LMAX系统一样,每秒处理6百万个订单。

 

 

 项目地址:

https://code.google.com/p/disruptor/

分享到:
评论

相关推荐

    Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip

    Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip

    springboot整合Disruptor并发编程框架 #资源达人分享计划#

    SpringBoot整合Disruptor并发编程框架是针对高并发场景下性能优化的一种技术实践。Disruptor是由LMAX公司开发的一款高性能、低延迟的并发工具,它通过消除线程间的锁竞争,大大提升了多线程环境下的处理速度。...

    disruptor-3.2.1.zip

    Disruptor-3.2.1是由LMAX公司开发并开源的一款高性能的并发框架,其核心是一个环形缓冲区(Ring Buffer)。这个框架的设计理念是消除多线程之间的锁竞争,从而大幅度提高系统的处理速度。在3.2.1版本中,Disruptor...

    disruptor-3.2.1源码带jar包20140321

    Disruptor是一款高性能的Java并发框架,由LMAX公司开发并开源。它的设计目标是解决多线程环境下的数据同步问题,特别是在高并发...通过研究其源码和编写示例,你将能够掌握这个框架的精髓,提升你的Java并发编程能力。

    并发编程框架Disruptor.zip

    Disruptor 是一个 Java 的并发编程框架,大大的简化了并发程序开发的难度,在性能上也比 Java 本身提供的一些并发包要好。 标签:Disruptor

    disruptor-3.4.1

    disruptor-3.4.1,并发编程的利器,是一个高性能的一部处理框架,也可以认为是一个最快的消息处理框架(轻量级的JMS),还可以认为是一个观察者模式的实现,或者事件监听模式的实现。

    基于Spring Boot和LMAX Disruptor的高性能并发框架.zip

    通过本项目,开发者可以深入理解并发编程的原理,掌握Disruptor框架的使用,并能够构建高性能的并发应用。 项目的主要特性和功能 1. 并发编程与无锁并行计算框架初探 介绍并发编程课程大纲与重点。 介绍无锁...

    disruptor-starter:干扰器的使用示例

    总的来说,"disruptor-starter"项目为我们提供了一个实践Disruptor的平台,通过学习和实践,我们可以更好地理解和掌握Disruptor在Java并发编程中的强大功能。同时,它也提醒我们在面临高并发挑战时,应该考虑使用更...

    Disruptor C++版(仅支持单生产者)

    Disruptor是由LMAX公司开发的一种高性能的并发编程框架,主要应用于金融交易系统。它以其高效、低延迟的事件处理机制而闻名。在C++版本的Disruptor中,我们同样可以享受到这种高效的并发能力,尤其适用于需要大量...

    disruptror的jar包和例子

    在Java并发编程中,线程之间的数据共享通常会带来锁竞争,这会成为性能瓶颈。Disruptor通过消除锁和减少内存缓存失效,实现了线程间的数据交换,从而提高了系统吞吐量。它的核心是环形缓冲区(Ring Buffer),这是一...

    并发框架Disruptor

    Java并发框架Disruptor,里面采取环形缓存结构,速度更快,适用于生产者消费者模式

    JAVA并发编程深度学习-无锁并行计算框架1

    在Java并发编程中,无锁并行计算框架如Disruptor提供了一种高效且低延迟的方式来处理高并发场景。无锁技术避免了线程之间的竞争条件,从而提升了多线程环境下的性能。本节我们将深入探讨Disruptor框架以及与...

    Disruptor并发框架

    总结,Disruptor并发框架凭借其创新的设计和优秀的性能,为并发编程提供了一种新的解决方案。通过理解和运用Disruptor,开发者可以构建出更加高效、稳定的系统,应对日益增长的并发处理需求。不过,由于Disruptor的...

    基于JavaDisruptor的并发编程深度学习项目.zip

    本项目是一个深入学习Java并发编程和无锁并行计算框架Disruptor的课程源代码。通过本项目,你将学习到并发编程的核心概念、无锁并行计算框架的基础使用与高级特性,以及如何整合Disruptor与Netty构建高性能的网络...

    disruptor框架案例.rar

    Disruptor它是一个开源的并发框架能够在无锁的情况下实现网络的Queue并发操作。同时,Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者...

    并发编程demo

    在IT行业中,并发编程是提升系统性能和效率的关键技术,特别是在多核处理器和高并发应用场景中。本项目“并发编程demo”聚焦于Java平台上的并发处理,主要利用了`java.util.concurrent`包中的工具和机制。这个包包含...

    Disruptor框架:无锁并发性能的革命

    Disruptor是一个高性能的无锁并发框架,最初由LMAX开发。与传统的基于锁的并发模型相比,Disruptor通过创新的设计大幅提升了数据处理的效率和吞吐量。其核心特性包括环形数组结构、元素位置定位、无锁设计、和多种...

    Disruptor学习(1)

    总的来说,Disruptor是一个高性能的并发框架,通过创新的数据结构和同步机制,解决了传统并发编程中的性能问题。对于需要处理大量并发请求的系统来说,Disruptor提供了一种值得考虑的设计思路。通过深入学习和实践...

    Disruptor 一种可替代有界队列完成并发线程间数据交换高性能解决方案.docx

    Disruptor 是一个高性能的并发编程框架,由 LMAX 公司开发,旨在解决线程间数据交换的效率问题。它的设计目标是替代传统的有界队列,提供更高的吞吐量和更低的延迟。Disruptor 的核心在于其创新的数据交换机制,包括...

    Java工具:高性能并发工具Disruptor简单使用

    Disruptor,由LMAX公司开源的一款并发框架,为处理高并发场景提供了一种新颖且高效的解决方案。它通过消除锁和线程间通信的开销,实现了微秒级的延迟和极高的吞吐量,尤其适用于金融交易、实时分析等对性能有苛刻...

Global site tag (gtag.js) - Google Analytics