使用RabbitMQ插件實現延遲隊列

使用場景

  • 訂單下單30分鐘後,如果用戶沒有付款,則系統自動取消訂單。
  • 會議開始前10分鐘,推送消息提醒用戶。
  • 自定義某個操作的執行時間,如果設置文章在明早9點發布。

概要

  • 新增type爲x-delayed-message的exchange,必須配置x-delayed-type: topic/direct/fanout。
  • 新增隊列queue1, 綁定exchange和routingkey(rountingkey根據自己的需求來,可配可不配)。
  • 生產者設置消息的delay時長併發送消息至queue1。
  • 消費者消費queue1。

該插件的影響和限制

  • 會降低性能,所以如果沒有該需求,則不要使用。
  • 該插件不適合大數據量的延時消息,比如百萬或一億。
  • 延時時長:0<=n<=(2^32)-1 ,單位毫秒。

步驟

1.下載並安裝插件

rabbitmq_delayed_message_exchange 插件,這是一個 GitHub 上的開源項目,我們直接下載即可:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

選擇適合自己的版本,放到插件目錄,執行如下命令

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

2.在Springboot項目裏面配置自定義交換機

@Bean
CustomExchange customExchange() {
    Map<String, Object> args = new HashMap<>();
    args.put("x-delayed-type", "direct");
    return new CustomExchange(EXCHANGE_NAME, EXCHANGE_TYPE, true, false,args);
}

這裏主要是交換機的定義有所不同,小夥伴們需要注意。

這裏我們使用的交換機是 CustomExchange,這是一個 Spring 中提供的交換機,創建 CustomExchange 時有五個參數,含義分別如下:

  • 交換機名稱。
  • 交換機類型,這個地方是固定的。
  • 交換機是否持久化。
  • 如果沒有隊列綁定到交換機,交換機是否刪除。
  • 其他參數。

最後一個 args 參數中,指定了交換機消息分發的類型,這個類型就是大家熟知的 direct、fanout、topic 以及 header 幾種,用了哪種類型,將來交換機分發消息就按哪種方式來。

3.創建生產者和消費者

創建一個消費者:

@Component
public class MsgReceiver {
    private static final Logger logger = LoggerFactory.getLogger(MsgReceiver.class);
    @RabbitListener(queues = RabbitConfig.QUEUE_NAME)
    public void handleMsg(String msg) {
        logger.info("handleMsg,{}",msg);
    }
}

使用單元測試創建一個生產者:

@SpringBootTest
class MqDelayedMsgDemoApplicationTests {

    @Autowired
    RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() throws UnsupportedEncodingException {
        Message msg = MessageBuilder.withBody(("hello 江南一點雨"+new Date()).getBytes("UTF-8")).setHeader("x-delay", 3000).build();
        rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_NAME, RabbitConfig.QUEUE_NAME, msg);
    }

}

在消息頭中設置消息的延遲時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章