mysql 延時佇列 rabbitmq 延時佇列

2021-10-20 22:24:58 字數 1714 閱讀 2573

前言

某個產品 或者訂單,有個有效期 過了有效期要取消

方法一 : 寫個指令碼,用crontab 定時掃瞄 改變狀態 但是最低只能一分鐘 ,不適合

方法二 : 用swoole得毫秒定時器,每秒鐘去掃瞄表 明顯占用資源 mysql受不了

方法三 :用rabbitmq延時佇列 一開始將其丟入mq 死信佇列,設定有效期,過時**到其他佇列,再啟動乙個消費者 消費  更改表狀態

php 安裝mq擴充套件

搭建mq服務

建立生產者和消費者

生產者  publish.php

header(『content-type:text/html;charset=utf8;『);

$time = 30;

$params = array(

『exchangename『 => 『test_cache_exchange『."_".$time,

『queuename『 => 『test_cache_queue『."_".$time,

『routekey『 => 『test_cache_route『."_".$time,

$connectconfig = array(

『host『 => 『127.0.0.1『,

『port『 => 5672,

『login『 => 『admin『,

『password『 => 『password『,

『vhost『 => 『/『

//var_dump(extension_loaded(『amqp『));

//exit();

try catch(exception $e) catch (exception$e) else else {

//echo『messagenotfound『.php_eol;

執行推送 我改了不同時間推送,會生成不同的交換機 路由 佇列,因為我用得是direct型別  要一一匹配

消費者開啟

[root@localhost mq]# php consumer.php

2020-07-18 11:07:22--失效時間 2020-07-18 11:07:42

2020-07-18 11:07:22--失效時間 2020-07-18 11:07:42

2020-07-18 11:07:23--失效時間 2020-07-18 11:07:43

2020-07-18 11:07:23--失效時間 2020-07-18 11:07:43

2020-07-18 11:13:04--失效時間 2020-07-18 11:13:24

2020-07-18 11:21:00--失效時間 2020-07-18 11:21:10

2020-07-18 11:21:32--失效時間 2020-07-18 11:22:02

2020-07-18 11:21:32--失效時間 2020-07-18 11:22:02

2020-07-18 11:21:22--失效時間 2020-07-18 11:22:12

2020-07-18 11:21:23--失效時間 2020-07-18 11:22:13

2020-07-18 11:21:23--失效時間 2020-07-18 11:22:13

發現正常,都是我設定的事件過期後就到處理佇列,在這裡消費,處理邏輯即可

參考 

Redis 延時佇列

延時佇列可以通過 redis 的 zset 有序列表 來實現。我們將訊息序列化成乙個字串作為 zset 的 value,這個訊息的到期處理時間作為 score,然後用多個執行緒輪詢 zset 獲取到期的任務進行處理,多個執行緒是為了保障可用性,萬一掛了乙個執行緒還有其它執行緒可以繼續處理。因為有多個...

redis 佇列 redis 延時佇列

定時發公告 使用者下單30分鐘後未付款自動關閉訂單 使用者下單後延時簡訊提醒 延時關閉空閒客戶端連線 使用redis提供的有序資料結構zset,把過期時間戳作為score。public void produce string topic,string msg,date date 生產訊息 於 消費 ...

RabbitMQ實現延時佇列

rabbitmq實現延時佇列一般有兩種形式 第一種方式 利用兩個特性 time to live ttl dead letter exchanges dlx a訊息佇列過期 傳送給b佇列 第二種方式 利用rabbitmq的外掛程式x delay message rabbitmq可以針對佇列設定x ex...