AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

SpringBoot + Disruptor 實現(xiàn)特快高并發(fā)處理,贊!

來源: 責編: 時間:2023-10-23 17:03:45 285觀看
導(dǎo)讀1.背景工作中遇到項目使用Disruptor做消息隊列,對你沒看錯,不是Kafka也不是rabbitmq。Disruptor有個最大的優(yōu)點就是快,還有一點它是開源的哦,下面做個簡單的記錄。2.Disruptor介紹Disruptor 是英國外匯交易公司LMAX開發(fā)的

1.背景

工作中遇到項目使用Disruptor做消息隊列,對你沒看錯,不是Kafka也不是rabbitmq。Disruptor有個最大的優(yōu)點就是快,還有一點它是開源的哦,下面做個簡單的記錄。D4j28資訊網(wǎng)——每日最新資訊28at.com

D4j28資訊網(wǎng)——每日最新資訊28at.com

2.Disruptor介紹

Disruptor 是英國外匯交易公司LMAX開發(fā)的一個高性能隊列,研發(fā)的初衷是解決內(nèi)存隊列的延遲問題(在性能測試中發(fā)現(xiàn)竟然與I/O操作處于同樣的數(shù)量級)。D4j28資訊網(wǎng)——每日最新資訊28at.com

基于 Disruptor 開發(fā)的系統(tǒng)單線程能支撐每秒 600 萬訂單,2010 年在 QCon 演講后,獲得了業(yè)界關(guān)注。D4j28資訊網(wǎng)——每日最新資訊28at.com

D4j28資訊網(wǎng)——每日最新資訊28at.com

Disruptor是一個開源的Java框架,它被設(shè)計用于在生產(chǎn)者—消費者(producer-consumer problem,簡稱PCP)問題上獲得盡量高的吞吐量(TPS)和盡量低的延遲。D4j28資訊網(wǎng)——每日最新資訊28at.com

從功能上來看,Disruptor 是實現(xiàn)了“隊列”的功能,而且是一個有界隊列。那么它的應(yīng)用場景自然就是“生產(chǎn)者-消費者”模型的應(yīng)用場合了。D4j28資訊網(wǎng)——每日最新資訊28at.com

Disruptor是LMAX在線交易平臺的關(guān)鍵組成部分,LMAX平臺使用該框架對訂單處理速度能達到600萬TPS,除金融領(lǐng)域之外,其他一般的應(yīng)用中都可以用到Disruptor,它可以帶來顯著的性能提升。D4j28資訊網(wǎng)——每日最新資訊28at.com

其實Disruptor與其說是一個框架,不如說是一種設(shè)計思路,這個設(shè)計思路對于存在“并發(fā)、緩沖區(qū)、生產(chǎn)者—消費者模型、事務(wù)處理”這些元素的程序來說,Disruptor提出了一種大幅提升性能(TPS)的方案。D4j28資訊網(wǎng)——每日最新資訊28at.com

Disruptor的github主頁:https://github.com/LMAX-Exchange/disruptorD4j28資訊網(wǎng)——每日最新資訊28at.com

3.Disruptor 的核心概念

先從了解 Disruptor 的核心概念開始,來了解它是如何運作的。下面介紹的概念模型,既是領(lǐng)域?qū)ο?,也是映射到代碼實現(xiàn)上的核心對象。D4j28資訊網(wǎng)——每日最新資訊28at.com

(1) Ring BufferD4j28資訊網(wǎng)——每日最新資訊28at.com

如其名,環(huán)形的緩沖區(qū)。曾經(jīng) RingBuffer 是 Disruptor 中的最主要的對象,但從3.0版本開始,其職責被簡化為僅僅負責對通過 Disruptor 進行交換的數(shù)據(jù)(事件)進行存儲和更新。在一些更高級的應(yīng)用場景中,Ring Buffer 可以由用戶的自定義實現(xiàn)來完全替代。D4j28資訊網(wǎng)——每日最新資訊28at.com

(2) Sequence DisruptorD4j28資訊網(wǎng)——每日最新資訊28at.com

通過順序遞增的序號來編號管理通過其進行交換的數(shù)據(jù)(事件),對數(shù)據(jù)(事件)的處理過程總是沿著序號逐個遞增處理。一個 Sequence 用于跟蹤標識某個特定的事件處理者( RingBuffer/Consumer )的處理進度。D4j28資訊網(wǎng)——每日最新資訊28at.com

雖然一個 AtomicLong 也可以用于標識進度,但定義 Sequence 來負責該問題還有另一個目的,那就是防止不同的 Sequence 之間的CPU緩存?zhèn)喂蚕?Flase Sharing)問題。D4j28資訊網(wǎng)——每日最新資訊28at.com

注:這是 Disruptor 實現(xiàn)高性能的關(guān)鍵點之一,網(wǎng)上關(guān)于偽共享問題的介紹已經(jīng)汗牛充棟,在此不再贅述。D4j28資訊網(wǎng)——每日最新資訊28at.com

D4j28資訊網(wǎng)——每日最新資訊28at.com

(3) SequencerD4j28資訊網(wǎng)——每日最新資訊28at.com

Sequencer 是 Disruptor 的真正核心。此接口有兩個實現(xiàn)類 SingleProducerSequencer、MultiProducerSequencer ,它們定義在生產(chǎn)者和消費者之間快速、正確地傳遞數(shù)據(jù)的并發(fā)算法。D4j28資訊網(wǎng)——每日最新資訊28at.com

(4) Sequence BarrierD4j28資訊網(wǎng)——每日最新資訊28at.com

用于保持對RingBuffer的 main published Sequence 和Consumer依賴的其它Consumer的 Sequence 的引用。 Sequence Barrier 還定義了決定 Consumer 是否還有可處理的事件的邏輯。D4j28資訊網(wǎng)——每日最新資訊28at.com

(5) Wait StrategyD4j28資訊網(wǎng)——每日最新資訊28at.com

定義 Consumer 如何進行等待下一個事件的策略。 (注:Disruptor 定義了多種不同的策略,針對不同的場景,提供了不一樣的性能表現(xiàn))D4j28資訊網(wǎng)——每日最新資訊28at.com

(6) EventD4j28資訊網(wǎng)——每日最新資訊28at.com

在 Disruptor 的語義中,生產(chǎn)者和消費者之間進行交換的數(shù)據(jù)被稱為事件(Event)。它不是一個被 Disruptor 定義的特定類型,而是由 Disruptor 的使用者定義并指定。D4j28資訊網(wǎng)——每日最新資訊28at.com

(7) EventProcessorD4j28資訊網(wǎng)——每日最新資訊28at.com

EventProcessor 持有特定消費者(Consumer)的 Sequence,并提供用于調(diào)用事件處理實現(xiàn)的事件循環(huán)(Event Loop)。D4j28資訊網(wǎng)——每日最新資訊28at.com

(8) EventHandlerD4j28資訊網(wǎng)——每日最新資訊28at.com

Disruptor 定義的事件處理接口,由用戶實現(xiàn),用于處理事件,是 Consumer 的真正實現(xiàn)。D4j28資訊網(wǎng)——每日最新資訊28at.com

(9) ProducerD4j28資訊網(wǎng)——每日最新資訊28at.com

即生產(chǎn)者,只是泛指調(diào)用 Disruptor 發(fā)布事件的用戶代碼,Disruptor 沒有定義特定接口或類型。D4j28資訊網(wǎng)——每日最新資訊28at.com

D4j28資訊網(wǎng)——每日最新資訊28at.com

4.案例-demo

通過下面8個步驟,你就能將Disruptor Get回家啦:D4j28資訊網(wǎng)——每日最新資訊28at.com

(1) 添加pom.xml依賴D4j28資訊網(wǎng)——每日最新資訊28at.com

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

(2) 消息體ModelD4j28資訊網(wǎng)——每日最新資訊28at.com

/** * 消息體 */@Datapublic class MessageModel {    private String message;}

(3) 構(gòu)造EventFactoryD4j28資訊網(wǎng)——每日最新資訊28at.com

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

(4) 構(gòu)造EventHandler-消費者D4j28資訊網(wǎng)——每日最新資訊28at.com

@Slf4jpublic 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é)束");    }}

(5) 構(gòu)造BeanManagerD4j28資訊網(wǎng)——每日最新資訊28at.com

/** * 獲取實例化對象 */@Componentpublic class BeanManager implements ApplicationContextAware {    private static ApplicationContext applicationContext = null;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;    }    public static ApplicationContext getApplicationContext() { return applicationContext; }    public static Object getBean(String name) {        return applicationContext.getBean(name);    }    public static <T> T getBean(Class<T> clazz) {        return applicationContext.getBean(clazz);    }}

(6) 構(gòu)造MQManagerD4j28資訊網(wǎng)——每日最新資訊28at.com

@Configurationpublic 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;    }}

(7) 構(gòu)造Mqservice和實現(xiàn)類-生產(chǎn)者D4j28資訊網(wǎng)——每日最新資訊28at.com

public interface DisruptorMqService {    /**     * 消息     * @param message     */    void sayHelloMq(String message);}@Slf4j@Component@Servicepublic class DisruptorMqServiceImpl implements DisruptorMqService {    @Autowired    private RingBuffer<MessageModel> messageModelRingBuffer;    @Override    public void sayHelloMq(String message) {        log.info("record the message: {}",message);        //獲取下一個Event槽的下標        long sequence = messageModelRingBuffer.next();        try {            //給Event填充數(shù)據(jù)            MessageModel event = messageModelRingBuffer.get(sequence);            event.setMessage(message);            log.info("往消息隊列中添加消息:{}", event);        } catch (Exception e) {            log.error("failed to add event to messageModelRingBuffer for : e = {},{}",e,e.getMessage());        } finally {            //發(fā)布Event,激活觀察者去消費,將sequence傳遞給改消費者            //注意最后的publish方法必須放在finally中以確保必須得到調(diào)用;如果某個請求的sequence未被提交將會堵塞后續(xù)的發(fā)布操作或者其他的producer            messageModelRingBuffer.publish(sequence);        }    }}

(8) 構(gòu)造測試類及方法D4j28資訊網(wǎng)——每日最新資訊28at.com

@Slf4j@RunWith(SpringRunner.class)@SpringBootTest(classes = DemoApplication.class)public class DemoApplicationTests {    @Autowired    private DisruptorMqService disruptorMqService;    /**     * 項目內(nèi)部使用Disruptor做消息隊列     * @throws Exception     */    @Test    public void sayHelloMqTest() throws Exception{        disruptorMqService.sayHelloMq("消息到了,Hello world!");        log.info("消息隊列已發(fā)送完畢");        //這里停止2000ms是為了確定是處理消息是異步的        Thread.sleep(2000);    }}

測試運行結(jié)果:D4j28資訊網(wǎng)——每日最新資訊28at.com

2020-04-05 14:31:18.543  INFO 7274 --- [           main] c.e.u.d.d.s.Impl.DisruptorMqServiceImpl  : record the message: 消息到了,Hello world!2020-04-05 14:31:18.545  INFO 7274 --- [           main] c.e.u.d.d.s.Impl.DisruptorMqServiceImpl  : 往消息隊列中添加消息:MessageModel(message=消息到了,Hello world!)2020-04-05 14:31:18.545  INFO 7274 --- [           main] c.e.utils.demo.DemoApplicationTests      : 消息隊列已發(fā)送完畢2020-04-05 14:31:19.547  INFO 7274 --- [pool-1-thread-1] c.e.u.d.disrupMq.mq.HelloEventHandler    : 消費者處理消息開始2020-04-05 14:31:19.547  INFO 7274 --- [pool-1-thread-1] c.e.u.d.disrupMq.mq.HelloEventHandler    : 消費者消費的信息是:MessageModel(message=消息到了,Hello world!)2020-04-05 14:31:19.547  INFO 7274 --- [pool-1-thread-1] c.e.u.d.disrupMq.mq.HelloEventHandler    : 消費者處理消息結(jié)束

5.總結(jié)

其實 生成者 -> 消費者 模式是很常見的,通過一些消息隊列也可以輕松做到上述的效果。不同的地方在于,Disruptor 是在內(nèi)存中以隊列的方式去實現(xiàn)的,而且是無鎖的。這也是 Disruptor 為什么高效的原因。D4j28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-14545-0.htmlSpringBoot + Disruptor 實現(xiàn)特快高并發(fā)處理,贊!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入探討 Golang 中的追加操作

下一篇: Golang數(shù)組:全面指南與實際示例

標簽:
  • 熱門焦點
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產(chǎn)品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發(fā)布會上看到了iQOO的首款平板產(chǎn)品iQOO Pad。雖
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學(xué)習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 得物效率前端微應(yīng)用推進過程與思考

    一、背景效率工程隨著業(yè)務(wù)的發(fā)展,組織規(guī)模的擴大,越來越多的企業(yè)開始意識到協(xié)作效率對于企業(yè)團隊的重要性,甚至是決定其在某個行業(yè)競爭中突圍的關(guān)鍵,是企業(yè)長久生存的根本。得物
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發(fā)搭載了聯(lián)發(fā)科天璣9200+旗艦
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發(fā)布的朋友圈
  • SN570 NVMe SSD固態(tài)硬盤 價格與性能兼具

    SN570 NVMe SSD固態(tài)硬盤是西部數(shù)據(jù)發(fā)布的最新一代WD Blue系列的固態(tài)硬盤,不僅閃存技術(shù)更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
  • 華為舉行春季智慧辦公新品發(fā)布會 首次推出電子墨水屏平板

    北京時間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會,在海外市場推出之前已經(jīng)在中國市場上市的筆記本、平板、激光打印機等辦公產(chǎn)品,并首次推出搭載
Top