需求:收到銀行異步通知,要在2秒內將結果返回銀行,同時還要根據銀行返回的交易狀態更新數據庫訂單狀態和其餘業務。java
採用disruptor,其實最好使用獨立MQ產品。本次用的是disruptor,遇到了一些問題,本文說下disruptor的問題排查。數據庫
問題一、消費者不在接收隊列消息。異步
緣由:handler程序中throw e ,將異常拋給了disruptor,而咱們沒有設定com.lmax.disruptor.ExceptionHandler。spa
解決:法1.handler中不要throw e,而是catch捕獲並處理。法2,設定ExceptionHandlerblog
問題二、壓測時,ringBufferSize=1024,策略=BlockingWaitStrategy。1個用戶連續發,結果到1000筆左右時,就不在執行了,但沒報錯。因而改爲2048,結果到2000筆左右時也不在執行了。隊列
解決:隊列設置爲1024*1024,就解決了。源碼
緣由:產品
SingleProducerSequencer.java 部分源碼:it
有些人會說,隊列數調在高也可能會出現102四、2048時的阻塞狀況,這不是解決問題的根本方法。io
的確如此,可經過構建多消費者,使得消費能力盡量的敢上生產能力。