備份交換器編程
備份交換器,英文名稱爲 Altemate Exchange,簡稱廟,或者更直白地稱之爲"備胎交換器"。 生產者在發送消息的時候若是不設置 mandatory 參數, 那麼消息在未被路由的狀況下將會丟失: 若是設置了 mandatory 參數,那麼須要添加 ReturnListener 的編程邏輯,生產者的代碼將變得複雜。若是既不想複雜化生產者的編程邏輯,又不想消息丟失,那麼可使用備份交換器, 這樣能夠將未被路由的消息存儲在 RabbitMQ 中,再在須要的時候去處理這些消息。spa
代碼以下:code
1 channel.ExchangeDeclare("myAe", "fanout", true, false, null); //聲明備份交換器 2 Dictionary<string, object> arg = new Dictionary<string, object>(); 3 arg.Add("a1ternate-exchange", "myAe"); 4 channel.ExchangeDeclare("ExchangeName", "direct", true, false, arg); //聲明交換器與備份交換器綁定 5 channel.QueueDeclare("QueueName", true, false, false, null); 6 channel.QueueDeclare("QueueAe", true, false, false, null); //備份隊列 7 channel.QueueBind("QueueName", "ExchangeName", "RoutingKey", null); 8 channel.QueueBind("QueueAe", "myAe", ""); 9 channel.BasicPublish("ExchangeName", "RoutingKey",null, Encoding.UTF8.GetBytes("helloword"));
當消息的 RoutingKey 不是 「RoutingKey」時,消息將不能被正確路由到「ExchangeName」上的隊列,此時就會發送給 myAe 交換器,進而發送到 QueueAe這個隊列 。對象
考慮到備份交換器的做用,建議將交換器類型設置爲fanout,由於消息被從新發送到 備份交換器時的路由鍵和從生產者發出的路由鍵是同樣的。blog
過時時間(TTL)隊列
RabbitMQ 能夠對"消息"和"隊列"設置 TTL。路由
目前有兩種方法能夠設置消息的 TTL。第一種方法是經過隊列屬性設置,隊列中全部消息都有相同的過時時間。第二種方法是對消息自己進行單獨設置,每條消息的TTL能夠不一樣。若是兩種方法一塊兒使用,則消息的 TTL 以二者之間較小的那個數值爲準。消息在隊列中的生存時間一旦超過設置的 TTL 值時,就會變成"死信" (Dead Message),消費者將沒法再收到該消息。string
1 channel.ExchangeDeclare("ExchangeName", "direct", true, false, null); //聲明交換器與備份交換器綁定 2 Dictionary<string, object> arg = new Dictionary<string, object>(); 3 arg.Add("x-message-ttl", 5000); //設置隊列過時時間 5000ms 4 channel.QueueDeclare("QueueName", true, false, false, arg); 5 channel.QueueBind("QueueName", "ExchangeName", "RoutingKey", null); 6 var basicProperties = channel.CreateBasicProperties(); 7 basicProperties.Expiration = "4000"; //設置消息過時時間 4000ms 8 channel.BasicPublish("ExchangeName", "RoutingKey", basicProperties, Encoding.UTF8.GetBytes("helloword"));
對於第一種設置隊列 TTL 屬性的方法,一旦消息過時,就會從隊列中抹去,而在第二種方 法中,即便消息過時,也不會立刻從隊列中抹去,由於每條消息是否過時是在即將投遞到消費者以前斷定的。it
死信隊列io
DLX,全稱爲 Dead-Letter-Exchange,能夠稱之爲死信交換器,也有人稱之爲死信郵箱。當消息在一個隊列中變成死信 (dead message) 以後,它能被從新被髮送到另外一個交換器中,這個交換器就是 DLX,綁定 DLX 的隊列就稱之爲死信隊列。
消息變成死信通常是因爲如下幾種狀況:
DLX 也是一個正常的交換器,和通常的交換器沒有區別,它能在任何的隊列上被指定, 實 際上就是設置某個隊列的屬性。當這個隊列中存在死信時 , RabbitMQ 就會自動地將這個消息從新發布到設置的 DLX 上去,進而被路由到另外一個隊列,即死信隊列。能夠監聽這個隊列中的消息,以進行相應的處理。
1 channel.ExchangeDeclare("exchange.dlx", "direct", true); //聲明DLX 2 channel.ExchangeDeclare("ExchangeName", "direct", true); //聲明交換器與備份交換器綁定 3 Dictionary<string, object> arg = new Dictionary<string, object>(); 4 arg.Add("x-dead-letter-exchange", "exchange.dlx"); //設置DLX 5 arg.Add("x-dead-letter-routing-key", "routingkey"); //爲私信消息重設路由鍵 6 channel.QueueDeclare("QueueName", true, false, false, arg); 7 channel.QueueDeclare("DlQueue",true,false,false); 8 channel.QueueBind("QueueName", "ExchangeName", "RoutingKey", null); 9 channel.QueueBind("DlQueue", "exchange.dlx", "routingkey"); 10 var basicProperties = channel.CreateBasicProperties(); 11 basicProperties.Expiration = "4000"; //設置消息過時時間 4000ms 12 channel.BasicPublish("ExchangeName", "RoutingKey", basicProperties, Encoding.UTF8.GetBytes("helloword"));
若是4s內消息沒有被消費者消費,那麼斷定這條消息爲過時,消息就會被丟給exchange.dlx,進而轉發給DlQueue。
死信隊列
延遲隊列存儲的對象是對應的延遲消息,所謂"延遲消息"是指當消息被髮送之後,並不想讓消費者馬上拿到消息,而是等待特定時間後,消費者才能拿到這個消息進行消費。
延遲隊列能夠經過設置消息的ttl和死信隊列來實現,消費者訂閱死信隊列達到延遲效果。
過時時間(TTL)