亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析Disruptor高性能線程消息傳遞并發(fā)框架

 更新時間:2022年03月01日 11:33:53   作者:kl  
這篇文章主要為大家介紹了Disruptor高性能線程消息傳遞并發(fā)框架的簡單分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

前言碎語

Disruptor是英國LMAX公司開源的高性能的線程間傳遞消息的并發(fā)框架,和jdk中的BlockingQueue非常類似,但是性能卻是BlockingQueue不能比擬的,下面是官方給出的一分測試報告,可以直觀的看出兩者的性能區(qū)別:


Disruptor 項目地址:https://github.com/LMAX-Exchange/disruptor

核心概念?

這么性能炸裂的框架肯定要把玩一番,試用前,我們先了解下disruptor的主要的概念,然后結合樓主的weblog項目(之前使用的BlockingQueue),來實踐下

RingBuffer:環(huán)形的緩沖區(qū),消息事件信息的載體。曾經 RingBuffer 是 Disruptor 中的最主要的對象,但從3.0版本開始,其職責被簡化為僅僅負責對通過 Disruptor 進行交換的數據(事件)進行存儲和更新。在一些更高級的應用場景中,Ring Buffer 可以由用戶的自定義實現來完全替代。

Event:定義生產者和消費者之間進行交換的數據類型。

EventFactory:創(chuàng)建事件的工廠類接口,由用戶實現,提供具體的事件

EventHandler:事件處理接口,由用戶實現,用于處理事件。

目前為止,我們了解以上核心內容即可,更多的詳情,可以移步wiki文檔:https://github.com/LMAX-Exchange/disruptor

核心架構圖:

實踐Disruptor

改造boot-websocket-log項目,這是一個典型的生產者消費者模式的實例。然后將BlockingQueue替換成Disruptor,完成功能,有興趣的可以對比下。

第一步,定義事件類型

/**
 * Created by kl on 2018/8/24.
 * Content :進程日志事件內容載體
 */
public class LoggerEvent {
    private LoggerMessage log;
    public LoggerMessage getLog() {
        return log;
    }
    public void setLog(LoggerMessage log) {
        this.log = log;
    }
}

第二步,定義事件工廠

/**
 * Created by kl on 2018/8/24.
 * Content :進程日志事件工廠類
 */
public class LoggerEventFactory implements EventFactory{
    @Override
    public LoggerEvent newInstance() {
        return new LoggerEvent();
    }
}

第三步,定義數據處理器

/**
 * Created by kl on 2018/8/24.
 * Content :進程日志事件處理器
 */
@Component
public class LoggerEventHandler implements EventHandler{
    @Autowired
    private SimpMessagingTemplate messagingTemplate;
    @Override
    public void onEvent(LoggerEvent stringEvent, long l, boolean b) {
        messagingTemplate.convertAndSend("/topic/pullLogger",stringEvent.getLog());
    }
}

第四步,創(chuàng)建Disruptor實操類,定義事件發(fā)布方法,發(fā)布事件

/**
 * Created by kl on 2018/8/24.
 * Content :Disruptor 環(huán)形隊列
 */
@Component
public class LoggerDisruptorQueue {
    private Executor executor = Executors.newCachedThreadPool();
    // The factory for the event
    private LoggerEventFactory factory = new LoggerEventFactory();
    private FileLoggerEventFactory fileLoggerEventFactory = new FileLoggerEventFactory();
    // Specify the size of the ring buffer, must be power of 2.
    private int bufferSize = 2 * 1024;
    // Construct the Disruptor
    private Disruptordisruptor = new Disruptor<>(factory, bufferSize, executor);;
    private DisruptorfileLoggerEventDisruptor = new Disruptor<>(fileLoggerEventFactory, bufferSize, executor);;
    private static  RingBufferringBuffer;
    private static  RingBufferfileLoggerEventRingBuffer;
    @Autowired
    LoggerDisruptorQueue(LoggerEventHandler eventHandler,FileLoggerEventHandler fileLoggerEventHandler) {
        disruptor.handleEventsWith(eventHandler);
        fileLoggerEventDisruptor.handleEventsWith(fileLoggerEventHandler);
        this.ringBuffer = disruptor.getRingBuffer();
        this.fileLoggerEventRingBuffer = fileLoggerEventDisruptor.getRingBuffer();
        disruptor.start();
        fileLoggerEventDisruptor.start();
    }
    public static void publishEvent(LoggerMessage log) {
        long sequence = ringBuffer.next();  // Grab the next sequence
        try {
            LoggerEvent event = ringBuffer.get(sequence); // Get the entry in the Disruptor
            // for the sequence
            event.setLog(log);  // Fill with data
        } finally {
            ringBuffer.publish(sequence);
        }
    }
    public static void publishEvent(String log) {
        if(fileLoggerEventRingBuffer == null) return;
        long sequence = fileLoggerEventRingBuffer.next();  // Grab the next sequence
        try {
            FileLoggerEvent event = fileLoggerEventRingBuffer.get(sequence); // Get the entry in the Disruptor
            // for the sequence
            event.setLog(log);  // Fill with data
        } finally {
            fileLoggerEventRingBuffer.publish(sequence);
        }
    }
}

文末結語

以上四步已經完成了Disruptor的使用,啟動項目后就會不斷的發(fā)布日志事件,處理器會將事件內容通過websocket傳送到前端頁面上展示,

boot-websocket-log項目地址:https://gitee.com/kailing/boot-websocket-log

Disruptor是高性能的進程內線程間的數據交換框架,特別適合日志類的處理。Disruptor也是從https://github.com/alipay/sofa-tracer了解到的,這是螞蟻金服 團隊開源的分布式鏈路追蹤項目,其中日志處理部分就是使用了Disruptor。

以上就是淺析Disruptor高性能線程消息傳遞并發(fā)框架的詳細內容,更多關于Disruptor線程消息傳遞并發(fā)框架的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot SSMP 整合案例分享

    SpringBoot SSMP 整合案例分享

    這篇文章主要介紹了SpringBoot SSMP 整合案例分享,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • java編程之遞歸算法總結

    java編程之遞歸算法總結

    這篇文章主要介紹了java編程之遞歸算法總結,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java實現猜數字小游戲

    java實現猜數字小游戲

    這篇文章主要為大家詳細介紹了java實現猜數字小游戲,隨機給定一個數字,直到猜對大小,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • SpringMVC九大組件之HandlerMapping詳解

    SpringMVC九大組件之HandlerMapping詳解

    這篇文章主要介紹了SpringMVC九大組件之HandlerMapping詳解,HandlerMapping 叫做處理器映射器,它的作用就是根據當前 request 找到對應的 Handler 和 Interceptor,然后封裝成一個 HandlerExecutionChain 對象返回,需要的朋友可以參考下
    2023-09-09
  • SpringBoot整合Security權限控制登錄首頁

    SpringBoot整合Security權限控制登錄首頁

    這篇文章主要為大家介紹了SpringBoot整合Security權限控制登錄首頁示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java多線程下載網圖的完整案例

    Java多線程下載網圖的完整案例

    這篇文章主要給大家介紹了關于Java多線程下載網圖的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 實現一個簡單Dubbo完整過程詳解

    實現一個簡單Dubbo完整過程詳解

    這篇文章主要為大家介紹了實現一個簡單Dubbo完整過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java實現的AES256加密解密功能示例

    Java實現的AES256加密解密功能示例

    這篇文章主要介紹了Java實現的AES256加密解密功能,結合完整實例形式分析了Java實現AES256加密解密功能的步驟與相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • Java核心庫實現AOP過程

    Java核心庫實現AOP過程

    給大家分享一下利用Java核心庫實現簡單的AOP的經驗分享和教學,需要的讀者們參考下吧。
    2017-12-12
  • Java實現企業(yè)員工管理系統(tǒng)

    Java實現企業(yè)員工管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現企業(yè)員工管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論