disruptor - 併發程式設計框架

banq發表於2011-09-02
disruptor - Concurrent Programming Framework 併發程式設計框架

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);
<p class="indent">

或者:

		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);
<p class="indent">



相關主題:

JVM偽共享

Disruptor系列文件

Martin Fowler的LMAX架構

Disruptor為什麼這麼快?鎖是壞的

[該貼被banq於2011-09-07 18:58修改過]

相關文章