91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Disruptor高性能線程消息傳遞并發框架的示例分析

發布時間:2022-03-01 14:18:49 來源:億速云 閱讀:127 作者:小新 欄目:開發技術

這篇文章主要介紹了Disruptor高性能線程消息傳遞并發框架的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    前言碎語

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

    Disruptor高性能線程消息傳遞并發框架的示例分析

    Disruptor高性能線程消息傳遞并發框架的示例分析

    核心概念?

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

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

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

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

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

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

    核心架構圖:

    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());
        }
    }

    第四步,創建Disruptor實操類,定義事件發布方法,發布事件

    /**
     * Created by kl on 2018/8/24.
     * Content :Disruptor 環形隊列
     */
    @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高性能線程消息傳遞并發框架的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    漳州市| 惠水县| 嵊泗县| 扶绥县| 兴海县| 乌鲁木齐市| 房产| 城口县| 邻水| 卫辉市| 容城县| 宁武县| 共和县| 右玉县| 常熟市| 江北区| 三台县| 苍梧县| 奎屯市| 镇安县| 大竹县| 汕尾市| 渝中区| 额敏县| 毕节市| 广水市| 义乌市| 金平| 呈贡县| 来凤县| 句容市| 奈曼旗| 武冈市| 永顺县| 资讯| 交城县| 筠连县| 阿城市| 宁乡县| 临潭县| 高清|