高效異步批量發(fā)送短信:提升用戶體驗(yàn)與后臺處理效率
在應(yīng)用開發(fā)中,批量發(fā)送短信是常見需求。為了提升用戶體驗(yàn),避免用戶長時間等待,同時確保后臺任務(wù)順利執(zhí)行,異步處理是最佳方案。本文將詳細(xì)闡述如何實(shí)現(xiàn)異步批量發(fā)送短信,并提供代碼示例。
異步處理流程
該方案采用異步處理機(jī)制,確保前臺快速響應(yīng),后臺則獨(dú)立處理短信發(fā)送任務(wù)。具體步驟如下:
- 前臺ajax請求: 用戶點(diǎn)擊發(fā)送按鈕,觸發(fā)AJAX請求,向后臺提交短信發(fā)送任務(wù)。后臺立即返回成功響應(yīng),告知請求已接收。
- 后臺任務(wù)接收與緩存: 后臺接收請求后,立即返回成功信息。然后,異步地從數(shù)據(jù)庫獲取手機(jī)號碼和短信內(nèi)容,并將這些數(shù)據(jù)寫入redis緩存。redis作為高效的緩存數(shù)據(jù)庫,能夠快速存儲和讀取數(shù)據(jù)。
- 異步任務(wù)執(zhí)行: 后臺啟動一個獨(dú)立的異步任務(wù),從Redis隊(duì)列中讀取數(shù)據(jù),并調(diào)用短信發(fā)送API發(fā)送短信。任何異常都會被記錄到日志中,方便后續(xù)排查。
代碼示例 (php + Redis)
以下代碼示例展示了如何使用PHP和Redis實(shí)現(xiàn)上述流程:
// 前臺AJAX請求 (JavaScript) $.ajax({ url: '/send-sms', type: 'POST', data: {template_id: 123, mobiles: ['13800138000', '13800138001'], content: '測試短信'}, success: function(result) { console.log('短信發(fā)送請求已提交'); } }); // 后臺處理 (PHP) public function sendSms() { $templateId = $_POST['template_id']; $mobiles = $_POST['mobiles']; $content = $_POST['content']; // 立即返回成功響應(yīng) echo json_encode(['success' => true, 'message' => '請求已接收']); // 異步任務(wù)處理 $this->dispatchSmsSendingTask($templateId, $mobiles, $content); } // 分發(fā)短信發(fā)送任務(wù) (PHP) private function dispatchSmsSendingTask($templateId, $mobiles, $content) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('redis_password'); // 請?zhí)鎿Q為您的Redis密碼 $data = ['template_id' => $templateId, 'mobiles' => $mobiles, 'content' => $content]; $redis->lPush('sms_queue', json_encode($data)); // 將任務(wù)添加到Redis隊(duì)列 // 使用合適的異步任務(wù)調(diào)度機(jī)制啟動任務(wù),例如: // 使用命令行工具:exec('php ' . __DIR__ . '/send_sms_worker.php > /dev/null 2>&1 &'); // 使用消息隊(duì)列:例如RabbitMQ, Kafka等 } // 短信發(fā)送工作進(jìn)程 (PHP - send_sms_worker.php) <?php while (true) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('redis_password'); $dataStr = $redis->rPop('sms_queue'); if ($dataStr) { $data = json_decode($dataStr, true); // 調(diào)用短信發(fā)送API $result = sendSmsViaAPI($data['template_id'], $data['mobiles'], $data['content']); // 記錄日志 if ($result !== true) { error_log("短信發(fā)送失敗: " . $result); } } sleep(1); // 避免CPU占用過高 } // 模擬短信發(fā)送api調(diào)用 (PHP) function sendSmsViaAPI($templateId, $mobiles, $content) { // 此處替換為實(shí)際的短信發(fā)送API調(diào)用 // ... return true; // 發(fā)送成功 }
此方案利用AJAX實(shí)現(xiàn)前后臺解耦,Redis隊(duì)列保證任務(wù)可靠存儲和有序處理,提高了系統(tǒng)效率和用戶體驗(yàn)。 請根據(jù)實(shí)際環(huán)境選擇合適的異步任務(wù)調(diào)度機(jī)制,例如使用消息隊(duì)列或進(jìn)程管理工具。 記得替換代碼中的Redis密碼和短信發(fā)送API。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END