redis - PHP用什麼來快速消費隊列

來源:互聯網
上載者:User

應用情境

一、群發業務

這些業務的特點就是不是很要求即時性,可以保證統計,支援查看進度,可將不成功的任務重扔回隊列,又可以手動剔除一些重複不正常的任務。

  • 簡訊群發

  • 郵件群發

  • 群PUSH

二、資料移轉業務

因為資料庫的特性不能一庫走天下,所以在使用者發布內容時,能夠進行較為即時的資料移轉

  • 要求可用性高

  • 處理最好能夠並發(因為現在業務小所以是最好

  • 即時性強(如果即時性不強,使用者發布動作,一個頁面跳轉的網路I/O時間內會對使用者造成庫困擾)

根據目前未知的熱心回答簡單總結

一、 crontab + php

  • 定時能力不強,雖然可以多個crontab 跑,PHP自己做定時器

  • 另外涉及到鎖,要不有些任務是不是會重複跑了

    二、php-resque https://github.com/chrisboulton/php-resque

  • 是否是支援持REDIS?

  • 在架構內例如YII2使用方便嗎?

為什麼沒有人提到swoole workman?

不管怎麼樣,我是都點了贊 …………

回複內容:

應用情境

一、群發業務

這些業務的特點就是不是很要求即時性,可以保證統計,支援查看進度,可將不成功的任務重扔回隊列,又可以手動剔除一些重複不正常的任務。

  • 簡訊群發

  • 郵件群發

  • 群PUSH

二、資料移轉業務

因為資料庫的特性不能一庫走天下,所以在使用者發布內容時,能夠進行較為即時的資料移轉

  • 要求可用性高

  • 處理最好能夠並發(因為現在業務小所以是最好

  • 即時性強(如果即時性不強,使用者發布動作,一個頁面跳轉的網路I/O時間內會對使用者造成庫困擾)

根據目前未知的熱心回答簡單總結

一、 crontab + php

  • 定時能力不強,雖然可以多個crontab 跑,PHP自己做定時器

  • 另外涉及到鎖,要不有些任務是不是會重複跑了

    二、php-resque https://github.com/chrisboulton/php-resque

  • 是否是支援持REDIS?

  • 在架構內例如YII2使用方便嗎?

為什麼沒有人提到swoole workman?

不管怎麼樣,我是都點了贊 …………

php-resque,內建dashborad可以查看任務執行情況
php-resque-scheduler 支援延時執行任務,比如多少小時之後

ruby版的resque貌似還支援cron,但是php版的resque是不支援的。

甭想了用php resque吧,基於redis的,夠快!

指令碼,不斷的消費

crontab

php指令碼,生命週期設定為10min
crontab計劃5分鐘調用一次,這樣可以保證有2個任務一直在工作

===========================================
針對題主第一個問題,做任務隊列,可以放到redis的隊列中,這是單線程的,保證不會有兩個進程獲得一個任務

用隊列,可以看看php_resque。

crontab也可以,但是頻率比較固定不太好控制。

寫指令碼迴圈的話需要開一個守護進程,不然進程掛了都不知道,不推薦。

可以試試php的多線程:pthreads

其實使用一個PHP 指令碼一直去擷取MQ 中的資料,並對資料進行消費。然後使用 supervisor 或者daemonise 做守護也是可以的。不過PHP 指令碼還是有一個最長已耗用時間比較好,這樣可以定時的釋放一些沒有釋放的記憶體,然後由守護進程重啟

laravel解決這個問題用了兩個辦法:

  1. crontab,每一分鐘跑一次。

  2. 隊列(redis+supervisord)。,實際上就是supervisord不斷起進程去消費,消費完了進程停止,supervisor檢測到於是重新起進程。適用於小並發。

總結起來無非:死迴圈/觸發。

while(true){    //如果隊列空了 sleep幾秒    //處理過程    //處理完一條usleep幾毫秒,別把伺服器拖垮}

守護進程這一塊可以使用swoole來搞就可以了。

使用swoole即可

我的做法是用Workman去執行一個死迴圈,當然用swoole也是很好的

簡單對於消費隊列常見的做法基本差不多了
配置crontab,每分鐘都運行,運用一個shell,
此shell要判斷當前有沒有消費進程在,shell中時是死迴圈

例如

if ( 'test.php'進程存在 ) {    exit()}while( true ){    sleep 1    php  test.php}

用 supervisor 或者daemonise 做守護,結合mq,一般的業務不成問題

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.