RabbitMQ 實戰指南 一 過期時間TTL

2022-08-23 23:51:08 字數 3194 閱讀 9560

目前有兩種方式可以設定訊息的ttl

如果兩種方法一起使用,則訊息的ttl已較小的數值為準。

1.1、通過設定佇列屬性來控制訊息的ttl

在宣告佇列的時候可以通過 x-message-ttl 屬性來控制訊息的ttl, 這個引數的單位是毫秒。如果不設定 ttl.則表示此訊息不會過期 ;如果將 ttl 設定為 0,則表示除非此時可以直 接將訊息投遞到消費者,否則該訊息會被立即丟棄。 

<?php 

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();

執行該**之後可以在web管理後台中發現增加了 test_msg_ttl 佇列,然後佇列特性中會有 ttl標誌,佇列中會有一條訊息。10 秒之後該訊息會自動刪除。

1.2、通過設定訊息的屬性控制訊息的ttl

在建立訊息的時候可以指定引數 expiration 來控制訊息的ttl,單位是毫秒。

<?php 

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();

執行該**之後可以在web管理後台中發現增加了 test_msg_ttl1 佇列,每條訊息的過期時間都不同。

1.3、訊息過期之後刪除的時機

對於第一種方式通過佇列屬性控制ttl的訊息來說,一旦訊息過期,則會立馬刪除,這是因為過期的訊息肯定是在隊頭,刪除代價很低。

對於第二種方式來說,訊息過期之後是不會立馬刪除的,因為每條訊息的過期時間不同,如果要刪除過期訊息,那必須掃瞄整個佇列,代價太高,所以消失是否過期是在訊息消費的時候判斷的。

在宣告佇列的時候可以通過 x-expires 引數來控制佇列被自動刪除前處於未使用狀態的時間。未使用的意思是佇列上沒有任何的消費者,佇列也沒有被重新宣告,並 且在過期時間段 內也未呼叫過 basic.get 命令。 x-expires 引數以毫秒為單位。

<?php 

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();

執行該**之後可以在web管理後台中發現增加了 test_queue_ttl 佇列,然後佇列特性中會有 exp 標誌,10 秒之後該佇列會被刪除。

RabbitMQ 實戰指南 一 延遲佇列

延遲佇列中儲存延遲訊息,延遲訊息是指當訊息被傳送到佇列中不會立即消費,而是等待一段時間後再消費該訊息。延遲佇列很多應用場景,乙個典型的應用場景是訂單未支付超時取消,使用者下單之後30分鐘內未支付成功,則把訂單取消。rabbitmq 本身沒有直接支援延遲佇列的功能,但是可以通過過期時間ttl和死信佇列...

RabbitMQ 實戰指南 一 死信佇列

dlx,全稱為 dead letter exchange,可以稱之為死信交換器。當訊息在乙個佇列中變成死信 dead message 之後,它能被傳送到另乙個交換器中,這個交換器就是dlx,繫結dlx的佇列就稱之為死信佇列。dlx 也是乙個正常的交換器,和一般的交換器沒有區別,它能在任何的佇列上被指...

《RabbitMQ實戰指南》整理(七)網路分割槽

當乙個集 生網路分割槽時,集群會分為兩個部分或者更多,它們各自為政,互相都認為對方分區內的節點已經掛了,包括佇列 交換器及繫結等元資料的建立和銷毀都處於自身分區內,與其他分割槽無關。分割槽的引入是為了配合rabbitmq的資料一致性複製原理。一般情況下,網路分割槽都是由於單個節點的故障引起的,且通常...