最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot disruptor高性能隊列使用

 更新時間:2023年02月02日 16:00:48   作者:ldcaws  
這篇文章主要介紹了SpringBoot disruptor高性能隊列使用,Disruptor是英國外匯交易公司LMAX開發(fā)的一個高性能隊列,研發(fā)的初衷是解決內(nèi)存隊列的延遲問題

Disruptor是一個高性能隊列,常見的還有kafka、rabbitmq等,下面體驗一下~

1、Disruptor簡介

Disruptor 是英國外匯交易公司LMAX開發(fā)的一個高性能隊列,研發(fā)的初衷是解決內(nèi)存隊列的延遲問題(在性能測試中發(fā)現(xiàn)竟然與I/O操作處于同樣的數(shù)量級)。基于 Disruptor 開發(fā)的系統(tǒng)單線程能支撐每秒 600 萬訂單,2010 年在 QCon 演講后,獲得了業(yè)界關(guān)注。

其特點簡單總結(jié)如下:

  • 開源的java框架,用于生產(chǎn)者-消費者場景;
  • 高吞吐量和低延遲;
  • 有界隊列;

disruptor在github網(wǎng)址為:https://github.com/LMAX-Exchange/disruptor

2、Disruptor概念

  • Ring Buffer:環(huán)形的緩沖區(qū),環(huán)形數(shù)組中的元素采用覆蓋方式,避免了jvm的GC;
  • Sequence Disruptor:通過順序遞增的序號來編號管理通過其進行交換的數(shù)據(jù)(事件),對數(shù)據(jù)(事件)的處理過程總是沿著序號逐個遞增處理;
  • Sequencer:Sequencer 是 Disruptor 的真正核心。此接口有兩個實現(xiàn)類 SingleProducerSequencer、MultiProducerSequencer ,它們定義在生產(chǎn)者和消費者之間快速、正確地傳遞數(shù)據(jù)的并發(fā)算法;
  • Sequence Barrier:用于保持對RingBuffer的 main published Sequence 和Consumer依賴的其它Consumer的 Sequence 的引用;
  • Wait Strategy:定義 Consumer 如何進行等待下一個事件的策略;
  • Event:在 Disruptor 的語義中,生產(chǎn)者和消費者之間進行交換的數(shù)據(jù)被稱為事件(Event)。它不是一個被 Disruptor 定義的特定類型,而是由 Disruptor 的使用者定義并指定;
  • EventProcessor:EventProcessor 持有特定消費者(Consumer)的 Sequence,并提供用于調(diào)用事件處理實現(xiàn)的事件循環(huán)(Event Loop);
  • EventHandler:定義的事件處理接口,由用戶實現(xiàn),用于處理事件,是 Consumer 的真正實現(xiàn);
  • Producer:生產(chǎn)者,只是泛指調(diào)用 Disruptor 發(fā)布事件的用戶代碼,Disruptor 沒有定義特定接口或類型;

3、springboot+disruptor實例

在pom.xml文件中添加依賴

		<dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>

消息體Model

@Data
public class MessageModel {
    private String message;
}

構(gòu)造EventFactory

public class HelloEventFactory implements EventFactory<MessageModel> {
    @Override
    public MessageModel newInstance() {
        return new MessageModel();
    }
}

構(gòu)造消費者

@Slf4j
public class HelloEventHandler implements EventHandler<MessageModel> {
    @Override
    public void onEvent(MessageModel event, long sequence, boolean endOfBatch) {
        try {
            //這里停止1000ms是為了確定消費消息是異步的
            Thread.sleep(1000);
            log.info("消費者處理消息開始");
            if (event != null) {
                log.info("消費者消費的信息是:{}",event);
            }
        } catch (Exception e) {
            log.info("消費者處理消息失敗");
        }
        log.info("消費者處理消息結(jié)束");
    }
}

構(gòu)造MQManager

@Configuration
public class MqManager {
    @Bean("messageModel")
    public RingBuffer<MessageModel> messageModelRingBuffer() {
        //定義用于事件處理的線程池, Disruptor通過java.util.concurrent.ExecutorSerivce提供的線程來觸發(fā)consumer的事件處理
        ExecutorService executor = Executors.newFixedThreadPool(2);
        //指定事件工廠
        HelloEventFactory factory = new HelloEventFactory();
        //指定ringbuffer字節(jié)大小,必須為2的N次方(能將求模運算轉(zhuǎn)為位運算提高效率),否則將影響效率
        int bufferSize = 1024 * 256;
        //單線程模式,獲取額外的性能
        Disruptor<MessageModel> disruptor = new Disruptor<>(factory, bufferSize, executor, ProducerType.SINGLE, new BlockingWaitStrategy());
        //設(shè)置事件業(yè)務(wù)處理器---消費者
        disruptor.handleEventsWith(new HelloEventHandler());
        //啟動disruptor線程
        disruptor.start();
        //獲取ringbuffer環(huán),用于接取生產(chǎn)者生產(chǎn)的事件
        RingBuffer<MessageModel> ringBuffer = disruptor.getRingBuffer();
        return ringBuffer;
    }
}

構(gòu)造生產(chǎn)者

@Configuration
public class MqManager {
    @Bean("messageModel")
    public RingBuffer<MessageModel> messageModelRingBuffer() {
        //定義用于事件處理的線程池, Disruptor通過java.util.concurrent.ExecutorSerivce提供的線程來觸發(fā)consumer的事件處理
        ExecutorService executor = Executors.newFixedThreadPool(2);
        //指定事件工廠
        HelloEventFactory factory = new HelloEventFactory();
        //指定ringbuffer字節(jié)大小,必須為2的N次方(能將求模運算轉(zhuǎn)為位運算提高效率),否則將影響效率
        int bufferSize = 1024 * 256;
        //單線程模式,獲取額外的性能
        Disruptor<MessageModel> disruptor = new Disruptor<>(factory, bufferSize, executor, ProducerType.SINGLE, new BlockingWaitStrategy());
        //設(shè)置事件業(yè)務(wù)處理器---消費者
        disruptor.handleEventsWith(new HelloEventHandler());
        //啟動disruptor線程
        disruptor.start();
        //獲取ringbuffer環(huán),用于接取生產(chǎn)者生產(chǎn)的事件
        RingBuffer<MessageModel> ringBuffer = disruptor.getRingBuffer();
        return ringBuffer;
    }
}

測試

	/**
     * 項目內(nèi)部使用Disruptor做消息隊列
     * @throws Exception
     */
    @Test
    public void sayHelloMqTest() throws Exception{
        helloEventProducer.sayHelloMq("Hello world!");
        log.info("消息隊列已發(fā)送完畢");
        //這里停止2000ms是為了確定是處理消息是異步的
        Thread.sleep(2000);
    }

運行結(jié)果如下

4、小結(jié)

引用disruptor作為內(nèi)部的高性能隊列,應(yīng)用于生產(chǎn)者-消費者模式中還是非常nice的,后面若有工程需求可以嘗試一下。

到此這篇關(guān)于SpringBoot disruptor高性能隊列使用的文章就介紹到這了,更多相關(guān)SpringBoot disruptor內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC @RequestBody屬性名大寫字母注入失敗的解決

    SpringMVC @RequestBody屬性名大寫字母注入失敗的解決

    這篇文章主要介紹了SpringMVC @RequestBody屬性名大寫字母注入失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot整合Netty服務(wù)端的實現(xiàn)示例

    SpringBoot整合Netty服務(wù)端的實現(xiàn)示例

    Netty提供了一套完整的API,用于處理網(wǎng)絡(luò)IO操作,如TCP和UDP套接字,本文主要介紹了SpringBoot整合Netty服務(wù)端的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • SpringBoot種如何使用?EasyExcel?實現(xiàn)自定義表頭導(dǎo)出并實現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換

    SpringBoot種如何使用?EasyExcel?實現(xiàn)自定義表頭導(dǎo)出并實現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換

    本文詳細介紹了如何使用EasyExcel工具類實現(xiàn)自定義表頭導(dǎo)出,并實現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換與添加下拉框操作,通過示例和代碼,展示了如何處理不同數(shù)據(jù)結(jié)構(gòu)和注解,確保數(shù)據(jù)在導(dǎo)出時能夠正確顯示和格式化,此外,還介紹了如何解決特定數(shù)據(jù)類型的轉(zhuǎn)換問題,并提供了解決方案
    2024-11-11
  • Java實現(xiàn)鎖定某個變量的幾種方式示例詳解

    Java實現(xiàn)鎖定某個變量的幾種方式示例詳解

    這篇文章主要為大家介紹了Java實現(xiàn)鎖某個變量的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • mybatis自動生成時如何設(shè)置不生成Example類詳解

    mybatis自動生成時如何設(shè)置不生成Example類詳解

    這篇文章主要給大家介紹了關(guān)于mybatis自動生成時如何設(shè)置不生成Example類的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • JAVA實現(xiàn)網(wǎng)絡(luò)/本地圖片轉(zhuǎn)BASE64存儲代碼示例

    JAVA實現(xiàn)網(wǎng)絡(luò)/本地圖片轉(zhuǎn)BASE64存儲代碼示例

    這篇文章主要給大家介紹了關(guān)于JAVA實現(xiàn)網(wǎng)絡(luò)/本地圖片轉(zhuǎn)BASE64存儲的相關(guān)資料,Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數(shù)據(jù)的方法,需要的朋友可以參考下
    2023-07-07
  • 使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 詳解基于redis實現(xiàn)分布式鎖

    詳解基于redis實現(xiàn)分布式鎖

    系統(tǒng)的不斷擴大,分布式鎖是最基本的保障。與單機的多線程不一樣的是,分布式跨多個機器。線程的共享變量無法跨機器。本文將介紹基于redis實現(xiàn)分布式鎖。
    2021-06-06
  • Java日常練習(xí)題,每天進步一點點(26)

    Java日常練習(xí)題,每天進步一點點(26)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java實現(xiàn)樹形結(jié)構(gòu)管理的組合設(shè)計模式

    Java實現(xiàn)樹形結(jié)構(gòu)管理的組合設(shè)計模式

    Java組合模式是一種結(jié)構(gòu)型設(shè)計模式,它允許將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。組合模式使得用戶可以使用統(tǒng)一的方式處理單個對象和對象組合,從而簡化了系統(tǒng)的設(shè)計和維護
    2023-04-04

最新評論

高唐县| 台北县| 阳原县| 绵竹市| 沽源县| 特克斯县| 巴东县| 陆丰市| 上蔡县| 龙口市| 丽水市| 桦甸市| 从江县| 南溪县| 随州市| 衡水市| 祁东县| 汾阳市| 全南县| 阳江市| 卓尼县| 兴隆县| 武清区| 闸北区| 高青县| 马尔康县| 扬州市| 通许县| 郴州市| 江陵县| 岳池县| 濮阳市| 五原县| 磐石市| 东丽区| 永州市| 读书| 濮阳市| 湾仔区| 甘孜县| 高唐县|