1. 程式人生 > >rabbitmq實現延遲訊息(附原始碼)

rabbitmq實現延遲訊息(附原始碼)

rabbitmq實現延遲訊息的方案


1. 使用延時佇列

單機不考慮拓展的情況下,可以使用java.util.concurrent包的DelayQueue, 但插入的物件需實現Delayed介面,並實現其getDelay方法。

優點:針對任意訊息佇列均可使用
缺點:可拓展性差,編碼略複雜,可複用性不高


2.藉助ScheduledExecutorService非同步延時提交

廢話不多說,程式碼如下:

 ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
        executorService.schedule(new
Callable<String>() { @Override public String call() throws Exception { try { amqpTemplate.convertAndSend(MAIN_EXCHANGE, MAIN_ROUTING, JSON.toJSONString(t).getBytes(DEFAULT_CHARSET)); log.info("已經發送:" + new Date()); } catch
(AmqpException e) { } catch (Exception e) { } return "ok"; } },time,unit);

優點:實現簡單,程式碼簡潔易懂
缺點:訊息量比較大的情況下,需要對ScheduledExecutorService的建立做優化,否則會造成效能的瓶頸


3.使用rabbitmq的ttl訊息和死信佇列實現

簡單來說,就是在傳送至指定exchange前建一個delayQueue,並繫結對應的delayExchange和路由,設定超時時間,並指定超時後死信佇列為目標佇列。當傳送至delayExchange的訊息始終無消費者進行消費時並且發生超時時,則會進入目標死信佇列,從而完成延遲訊息的實現.

官網rabbitmq延遲訊息實現說明

優點:可拓展性強,支援的併發數更高
缺點:理解上要麻煩一些,程式碼需要進行相應改造


最後說一句,程式碼已上傳至github, 歡迎有需要的小夥伴關注並下載~
rabbitmq-springboot