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