【问题标题】:Send Multiple SMS to users using Jobs使用 Jobs 向用户发送多条 SMS
【发布时间】:2016-07-18 02:42:13
【问题描述】:

我有大约 25,000 个用户,我想为每个用户发送短信。

我做了以下工作,

<?php
namespace App\Jobs;
use App\User;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use GuzzleHttp\Client;
use GuzzleHttp\Post\PostBodyInterface;
use GuzzleHttp\Exception\ClientException;

class SendSMS extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    protected $user;
    public function __construct($user)
    {
        $this->user = $user;
    }

     /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
            $client = new \GuzzleHttp\Client(['base_uri' => "example.com"]);

            $messageBody = "Message";
            $data = ["messageBody"=>$messageBody,
                    "msisdn"=>$this->user];

            $client->request('POST', 'SendSMS',[ 'json'=>$data]);

        }
    }

我正在使用 JobController 分派作业

<?php

namespace App\Http\Controllers;
use App\Jobs\SendSMS;

use Illuminate\Http\Request;
use App\User;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class JobController extends Controller
{

    public function sendSMS()
    {
        $users = User::all(); 
        foreach ($users as $user) 
        {
            $job = (new SendSMS($user->mobile))->onQueue('sms');

            $this->dispatch($job);
            echo $player->mobile;
            echo "<br/>";
        }
    }
}

我使用命令行运行队列,

现在我有两个问题

首先:请求非常慢,这意味着我等待大约 20 秒的 http 请求完成后再发送给下一个用户,我可以发送请求并转到第二个用户而不等待短信的响应接口?

second:我可以在不实际运行控制器中的方法的情况下运行调度,例如我希望使用命令行或任何其他方法对作业进行排队。

【问题讨论】:

标签: laravel sms scheduled-tasks jobs guzzle


【解决方案1】:

创建一个SendSMSToAllUsers 工作,而不是为每个用户移动创建工作,您的请求将非常快。 SendSMSToAllUsers 作业将获取所有用户并为每个用户调度一个新作业。

要在不实际运行控制器中的方法的情况下进行调度,您只需在任何类(工匠命令、队列作业等)中包含 Illuminate\Foundation\Bus\DispatchesJobs 特征并使用 $this-&gt;dispatch($job) 方法。

为了获得更好的性能,要么使用 Guzzle 的异步功能,要么将 SMS 作业分派到多个队列并并行运行多个队列工作程序,每个队列使用参数 --queue=myqueue。拥有 25k 用户是使用多个队列的充分理由。

例如,您可以创建 10 个队列:“sms-0”用于以 0 结尾的电话号码,“sms-1”用于以 1 结尾的电话号码,……等等。或者,您可以为奇数或偶数创建两个队列,“sms-odd”和“sms-even”。

【讨论】:

  • 如何为句柄内的每个用户分派作业?
  • 与您在控制器中使用的方式完全相同:$this-&gt;dispatch($job)。请记住包含 Illuminate\Foundation\Bus\DispatchesJobs 特征
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多