如果兩種方法一起使用,則訊息的ttl已較小的數值為準。
1.1、通過設定佇列屬性來控制訊息的ttl
在宣告佇列的時候可以通過 x-message-ttl 屬性來控制訊息的ttl, 這個引數的單位是毫秒。如果不設定 ttl.則表示此訊息不會過期 ;如果將 ttl 設定為 0,則表示除非此時可以直 接將訊息投遞到消費者,否則該訊息會被立即丟棄。
<?php執行該**之後可以在web管理後台中發現增加了 test_msg_ttl 佇列,然後佇列特性中會有 ttl標誌,佇列中會有一條訊息。10 秒之後該訊息會自動刪除。require __dir__ . '/../../../vendor/autoload.php';
usephpamqplib\wire\amqptable;
usephpamqplib\message\amqpmessage;
usephpamqplib\connection\amqpstreamconnection;
//todo 換成自己的配置
$connection = new amqpstreamconnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');
$channel = $connection->channel();
//通過佇列屬性設定訊息過期時間為10s, 然後在管理頁面檢視10s之後訊息是否消失
$arguments = new
amqptable();
$arguments->set("x-message-ttl", 10000);
$queuename = 'test_msg_ttl';
$channel->queue_declare($queuename, false, true, false, false, false, $arguments
);$message = new amqpmessage('hello rabbitmq');
$channel->basic_publish($message, '', $queuename
);$channel->close();
$connection->close();
1.2、通過設定訊息的屬性控制訊息的ttl
在建立訊息的時候可以指定引數 expiration 來控制訊息的ttl,單位是毫秒。
<?php執行該**之後可以在web管理後台中發現增加了 test_msg_ttl1 佇列,每條訊息的過期時間都不同。require __dir__ . '/../../../vendor/autoload.php';
usephpamqplib\wire\amqptable;
usephpamqplib\message\amqpmessage;
usephpamqplib\connection\amqpstreamconnection;
//todo 換成自己的配置
$connection = new amqpstreamconnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');
$channel = $connection->channel();
$queuename = 'test_msg_ttl1';
$channel->queue_declare($queuename, false, true, false, false
);//
通過訊息屬性設定訊息過期時間為10s, 然後在管理頁面檢視10s之後訊息是否消失
$message = new amqpmessage('hello rabbitmq',[
'expiration' => 10000]);
$channel->basic_publish($message, '', $queuename
);$channel->close();
$connection->close();
1.3、訊息過期之後刪除的時機
對於第一種方式通過佇列屬性控制ttl的訊息來說,一旦訊息過期,則會立馬刪除,這是因為過期的訊息肯定是在隊頭,刪除代價很低。
對於第二種方式來說,訊息過期之後是不會立馬刪除的,因為每條訊息的過期時間不同,如果要刪除過期訊息,那必須掃瞄整個佇列,代價太高,所以消失是否過期是在訊息消費的時候判斷的。
在宣告佇列的時候可以通過 x-expires 引數來控制佇列被自動刪除前處於未使用狀態的時間。未使用的意思是佇列上沒有任何的消費者,佇列也沒有被重新宣告,並 且在過期時間段 內也未呼叫過 basic.get 命令。 x-expires 引數以毫秒為單位。
<?php執行該**之後可以在web管理後台中發現增加了 test_queue_ttl 佇列,然後佇列特性中會有 exp 標誌,10 秒之後該佇列會被刪除。require __dir__ . '/../../../vendor/autoload.php';
usephpamqplib\wire\amqptable;
usephpamqplib\message\amqpmessage;
usephpamqplib\connection\amqpstreamconnection;
//todo 換成自己的配置
$connection = new amqpstreamconnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');
$channel = $connection->channel();
//通過佇列屬性設定佇列的過期時間為10s, 然後在管理頁面檢視10s之後佇列是否消失
$arguments = new
amqptable();
$arguments->set("x-expires", 10000);
$queuename = 'test_queue_ttl';
$channel->queue_declare($queuename, false, true, false, false, false, $arguments
);$channel->close();
$connection->close();
RabbitMQ 實戰指南 一 延遲佇列
延遲佇列中儲存延遲訊息,延遲訊息是指當訊息被傳送到佇列中不會立即消費,而是等待一段時間後再消費該訊息。延遲佇列很多應用場景,乙個典型的應用場景是訂單未支付超時取消,使用者下單之後30分鐘內未支付成功,則把訂單取消。rabbitmq 本身沒有直接支援延遲佇列的功能,但是可以通過過期時間ttl和死信佇列...
RabbitMQ 實戰指南 一 死信佇列
dlx,全稱為 dead letter exchange,可以稱之為死信交換器。當訊息在乙個佇列中變成死信 dead message 之後,它能被傳送到另乙個交換器中,這個交換器就是dlx,繫結dlx的佇列就稱之為死信佇列。dlx 也是乙個正常的交換器,和一般的交換器沒有區別,它能在任何的佇列上被指...
《RabbitMQ實戰指南》整理(七)網路分割槽
當乙個集 生網路分割槽時,集群會分為兩個部分或者更多,它們各自為政,互相都認為對方分區內的節點已經掛了,包括佇列 交換器及繫結等元資料的建立和銷毀都處於自身分區內,與其他分割槽無關。分割槽的引入是為了配合rabbitmq的資料一致性複製原理。一般情況下,網路分割槽都是由於單個節點的故障引起的,且通常...