RabbitMQ延時隊列和死信隊列實現

一、理論基礎

1.1、RabbitMQ有哪些重要的組件(6個)

ConnectionFactory連接管理器:用戶與MQ建立的連接管理器;

Channel信道:消息推送使用的通道;

Exchange交換機:用於接收、分配消息;

Queue隊列用於存儲生產者的消息

RoutingKey路由鍵:用於把生產者的數據分配(路由)到交換機上;

BingDingKey綁定建:用於把交換器的消息綁定到隊列中。

1.2、Rabbitmq 的消息是怎麼發送的

客戶端通過TCP連接到MQ服務器,連接成功後MQ與客戶端建立了一條amqp信道Channer,信道是創建的真實的TCP上的虛擬連接,amqp命令都是通過信道發送出去的

1.3、MQ怎麼避免消息丟失

消息持久化、ACK確認機制、集羣、消息補償機制

1.4、三種廣播模式

fanout:凡事綁定到此交換機和隊列都可以接受消息;

direct:通過路由鍵和交換機決定唯一的隊列可以接受消息;

topic:所有符合路由鍵所綁定的隊列都可以接受消息。

1.5、延遲隊列

什麼是延遲隊列:用來存放需要在指定時間被處理的元素的隊列,延遲隊列中的元素都是帶時間屬性(TTL)的

什麼場景使用延遲隊列:

  • 訂單在十分鐘未支付則自動取消;
  • 新創建的店鋪如果十天內未上傳過商品,則自動發送消息提醒;
  • 賬單在一週內未支付,則自動支付;
  • 用戶發起退款,如果三天內沒有處理則通知相關人員;
  • 預定會議後,需要在預定時間前10分鐘,通知參會人員。

1.6、什麼是TTL

TTL是MQ中一個消息或者隊列的屬性,表明一條消息或者隊列中所有消息或者隊列的最大存活時間,單位是毫秒。如果一條消息設置了TTL屬性,或者進入了設置TTL的隊列,如果這條消息在TTL內的時間未被消費則該條消息則變成死信,如果配置了消息的TTL和隊列的TTL則較小的那個值會被使用。

如何設置TTL(2種方式)

(1)一種是創建隊列的時候設置隊列的“x-message-ttl”屬性,如:

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 6000);
channel.queueDeclare(queueName, durable, exclusive, autoDelete, args);

(2)另一種是針對每條消息設置TTL:

AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.expiration("6000");
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName, routingKey, mandatory, properties, "msg body".getBytes());

兩種方式的區別:

如果設置了隊列的TTL,如果消息過期則被隊列丟棄;而第二種即使消息過期也不會馬上被丟棄, 因爲消息是否過期是在即將投遞到消費者之前被判定的。此外,如果不設置TTL則表示消息永遠不會過期,消息過期則變成死信。

 

二、實戰

.....待更新

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