三步創建Disruptor應用

jopen 10年前發布 | 43K 次閱讀 Disruptor 消息系統

Disruptor是一個高性能的用于線程間消息處理的開源框架。它的目標就是.
我們知道,java.util.concurrent.ArrayBlockingQueue 是一個非常優秀的有界隊列實現。Disruptor與之相比,性能更加的優秀。
性能比較
性能比較

完整的性能報告在這里.

Disruptor內部使用了RingBuffer,它是Disruptor的核心的數據結構。和其它的RingBuffer實現不同,Disruptor沒有尾指針。這樣實現是經過深思熟慮的,你可以看這篇文檔了解其細節。
更多的參考資料請參照官方文檔以及并發編程網上翻譯的一些文章

本文主要參考Disruptor入門這篇文章。

本文的代碼已全部放在github上。

在正式使用Disruptor之前,我們先聲明一個ObjectEvent類,它用來傳遞消息的內容。

public class ObjectEvent {
private Object object;
public Object getObject() {
return object;
}
public ObjectEvent setObject(Object object) {
this.object = object;
return this;
}
}

  • 第一步,創建一個Disruptor對象
Executor executor = Executors.newCachedThreadPool();
int bufferSize = 1024;
Disruptor<ObjectEvent> disruptor = new Disruptor<>(ObjectEvent::new, bufferSize, executor,
ProducerType.SINGLE, new LiteBlockingWaitStrategy());

這是一個單一生產者的例子,如果在你的代碼中僅僅有一個事件生產者,那么可以設置為單一生產者模式來提高系統的性能。

第一個參數用來在ring buffer中創建event,第二個參數是ring buffer的大小,第三個參數是消費者處理消息而使用的線程池。第四個參數是單或者多生產者模式,地五個參數是可選的等待策略。
以上代碼主要用來設置RingBuffer.

  • 第二步,創建消息處理的processors
public static void handleEvent1(ObjectEvent event, long sequence, boolean endOfBatch) {
System.out.println("handler-1: " + event.getObject());
}
public static void handleEvent2(ObjectEvent event, long sequence, boolean endOfBatch) {
System.out.println("handler-2: " + event.getObject());
}
...
disruptor.handleEventsWith(App::handleEvent1);
disruptor.handleEventsWith(App::handleEvent2);
...

定義了兩個processor,并使用handleEventsWith注冊到Disruptor。注意這個方法可以使用職責鏈模式,例如handleEventsWith(A).then(B)
然后就可以啟動Disruptor了:

1
disruptor.start();
  • 第三步,創建生產者
    這一步我們可以創建一個生產者來發布消息(事件)。
private static void produceEvents(Disruptor<ObjectEvent> disruptor) throws InterruptedException {
RingBuffer<ObjectEvent> ringBuffer = disruptor.getRingBuffer();
for (long l = 0; true; l++) {
String obj = "Test-" + l;
ringBuffer.publishEvent((event, sequence) -> event.setObject(obj));
Thread.sleep(1000);
}
}

通過以上三步,我們就可以創建一個簡單的應用Disruptor的例子了。

來自:http://colobu.com/2014/08/01/3-steps-to-create-a-disruptor-application/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!