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高速缓存进行了优化。 |