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