RabbitMQ 實戰指南 一 延遲佇列

2022-08-23 23:51:07 字數 3001 閱讀 5522

延遲佇列中儲存延遲訊息,延遲訊息是指當訊息被傳送到佇列中不會立即消費,而是等待一段時間後再消費該訊息。

延遲佇列很多應用場景,乙個典型的應用場景是訂單未支付超時取消,使用者下單之後30分鐘內未支付成功,則把訂單取消。

rabbitmq 本身沒有直接支援延遲佇列的功能,但是可以通過過期時間ttl和死信佇列來模擬延遲佇列。

過期時間ttl 可以參考文章: 【rabbitmq 實戰指南】一 過期時間ttl

死信佇列可以參考文章:【rabbitmq 實戰指南】一 死信佇列

採用訂單未支付超時取消的應用場景來做測試,其具體步驟如下:

3.1、生產者**

<?php 

require __dir__ . '/../../../../vendor/autoload.php';

usephpamqplib\wire\amqptable;

usephpamqplib\message\amqpmessage;

usephpamqplib\exchange\amqpexchangetype;

usephpamqplib\connection\amqpstreamconnection;

//todo 更改配置

$connection = new amqpstreamconnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');

$channel = $connection->channel();

$channel->exchange_declare('exchange.order', amqpexchangetype::direct, false, true

);$channel->exchange_declare('exchange.delay', amqpexchangetype::direct, false, true

);$args = new

amqptable();

//訊息過期方式:設定 queue.order 佇列中的訊息10s之後過期

$args->set('x-message-ttl', 10000);

$args->set('x-dead-letter-exchange', 'exchange.delay');

$args->set('x-dead-letter-routing-key', 'routingkey.delay');

$channel->queue_declare('queue.order', false, true, false, false, false, $args

);$channel->queue_declare('queue.delay', false, true, false, false

);$channel->queue_bind('queue.order', 'exchange.order', 'routingkey.cancel.order');

$channel->queue_bind('queue.delay', 'exchange.delay', 'routingkey.delay');

$message = new amqpmessage('f20190413180108970');

$channel->basic_publish($message, 'exchange.order', 'routingkey.cancel.order');

$channel->close();

$connection->close();

執行生產者**之後,queue.order 佇列會有一條訊息,如下圖:

10秒之後,訊息會過期,然後被進入 exchange.delay, 進而路由到 queue.delay 佇列中:

3.2、消費者**

<?php 

require __dir__ . '/../../../../vendor/autoload.php';

usephpamqplib\message\amqpmessage;

usephpamqplib\exchange\amqpexchangetype;

usephpamqplib\connection\amqpstreamconnection;

//todo 更改配置

$connection = new amqpstreamconnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');

$channel = $connection->channel();

$channel->exchange_declare('exchange.delay', amqpexchangetype::direct, false, true

);$channel->queue_declare('queue.delay', false, true, false, false

);$channel->queue_bind('queue.delay', 'exchange.delay', 'routingkey.delay');

function process_message($message

)$channel->basic_consume('queue.delay', 'cancelorder', false, false, false, false, 'process_message');

function shutdown($channel, $connection

)register_shutdown_function('shutdown', $channel, $connection

);while ($channel ->is_consuming())

執行消費者**之後,會獲取到訂單號,之後可以檢查該訂單的狀態,如果未支付則進行取消操作,如下圖:

RabbitMQ 實戰指南 一 死信佇列

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

RabbitMQ 實戰指南 一 過期時間TTL

目前有兩種方式可以設定訊息的ttl 如果兩種方法一起使用,則訊息的ttl已較小的數值為準。1.1 通過設定佇列屬性來控制訊息的ttl 在宣告佇列的時候可以通過 x message ttl 屬性來控制訊息的ttl,這個引數的單位是毫秒。如果不設定 ttl.則表示此訊息不會過期 如果將 ttl 設定為 ...

Rabbitmq延遲佇列

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...