如何在不影響響應速度的情況下實現異步批量發送短信?

如何在不影響響應速度的情況下實現異步批量發送短信?

高效異步批量發送短信:提升用戶體驗與后臺處理效率

應用開發中,批量發送短信是常見需求。為了提升用戶體驗,避免用戶長時間等待,同時確保后臺任務順利執行,異步處理是最佳方案。本文將詳細闡述如何實現異步批量發送短信,并提供代碼示例。

異步處理流程

該方案采用異步處理機制,確保前臺快速響應,后臺則獨立處理短信發送任務。具體步驟如下:

  1. 前臺ajax請求: 用戶點擊發送按鈕,觸發AJAX請求,向后臺提交短信發送任務。后臺立即返回成功響應,告知請求已接收。
  2. 后臺任務接收與緩存: 后臺接收請求后,立即返回成功信息。然后,異步地從數據庫獲取手機號碼和短信內容,并將這些數據寫入redis緩存。redis作為高效的緩存數據庫,能夠快速存儲和讀取數據。
  3. 異步任務執行: 后臺啟動一個獨立的異步任務,從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
喜歡就支持一下吧
點贊7 分享