PHP加MySQL訊息佇列深入理解
訊息佇列:在訊息的傳輸過程中儲存訊息的容器。
訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞;如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它。
如圖所示:
在不使用訊息佇列的情況下,使用者的請求資料直接寫入資料庫,再高併發的情況下,會對資料庫造成巨的壓力,同時也使得響應延遲加劇。程式設計客棧在使用訊息佇列後,使用者請求的資料傳送給訊息佇列後立即返回,再由訊息佇列的消費者程序(通常情況下,該程序獨立部署在專門的伺服器叢集上)從訊息佇列中獲取資料,非同步寫入資料庫。由於訊息佇列伺服器處理速度遠大於資料庫,因此使用者的響應延遲可得到有效改善。
尤其是在淘寶搞“雙十一”,“春節特賣”等活動時,使用訊息佇列有很好的削峰作用--------
即通過異程式設計客棧步處理,將短時間高併發產生的事務訊息儲存在訊息佇列中,從而削平高峰期的併發事務。所以在一些電子商務網站促銷活動中,合理使用訊息佇列,可有效抵禦促銷活動剛開始大量湧入的訂單對系統造成的衝擊。
需要注意的是,由於資料寫入訊息佇列後立即返回給使用者資料在後續的業務校驗、寫資料庫等操作可能失敗,因此在使用訊息佇列進行業務非同步處理後,需要適當修改業務流程進行配合,如訂單提交後,訂單資料寫入訊息佇列,不能立程式設計客棧即返回使用者訂單提交成功,需要在訊息佇列的訂單消費者程序真正處理完該訂單,甚至商品出庫後,再通過電子郵件或SMS訊息通知使用者訂單成功,以免交易糾紛。
最近遇到一個批量傳送簡訊的需求,簡訊介面是第三方提供的。剛開始想到,獲取到手機號之後,迴圈呼叫介面傳送不就可以了嗎?
但很快發現問題:當簡訊數量很大時,不僅耗時,而且成功率很低。
於是想到,用php和mysql實現一個訊息佇列,一條一條的傳送簡訊。下面介紹具體的實現方法:
首先,建立一個數據表sms,包含以下欄位:
id,phone,//手機號 content //簡訊內容
將需要傳送的簡訊和手機號存入sms表中。
接下來,需要用PHP實現一個定時器,定時讀取一條記錄,併發送簡訊:
<?php $db = new Db(); $sms = new Sms(); while(true){ $item = $db->getFirs程式設計客棧tRecord(); //獲取資料表第一條記錄 if(!$item){ //如果佇列中沒有資料,則結束定時器 break; } $res = $sms->send($item['phone'],$item['content']); //傳送簡訊 if($res){ pxZsCfdrUz $db->deleteFristRecord(); //刪除傳送成功的記錄 echo $item['phone'].'傳送成功'; }else{ echo $item['phone'].'傳送失敗,稍後繼續嘗試'; } sleep(10); //每隔十秒迴圈一次 } echo '傳送完畢!'; ?>
將程式碼儲存為timer_sms.php,開啟命令列,執行定時器:
php timer_sms.php
到此這篇關於PHP+MySQL訊息佇列深入理解的文章就介紹到這了,更多相關PHP+MySQL訊息佇列內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!