使用 Laravel Queue 以及 AWS SQS

前言

本篇重點如下:

  1. 使用 Laravel queue 完成寄 Email 功能
  2. 使用 AWS SQS

為什麼要使用 queue 呢?
當我們執行一些耗時較久的工作時,像是發送 Email , 或是上傳圖片或是影片,讓使用者等到工作執行完畢才進行下一個動作的話,是不太現實的。
所以當使用者發出一些需要較長時間執行的請求時,我們要使用 queue 來幫我們隊列,在背景慢慢執行,然後讓使用者可以立即執行下一個動作。

申請 AWS SQS 服務

  • 首先,你要有 AWS 帳號
  • 到 AWS 上申請 SQS 服務
  • 這邊可以參考 AWS教學,完成設定。
  • 記住下面的資料,後面會用到
  • 到右上角,選擇帳戶的地方,選擇My Security Credentials

  • 到左邊選擇 Users 建立新的 User

  • 輸入 user 名稱,打勾 Programmatic access ,然後下一步

  • 然後 Create group ,如下圖

  • 再來把剛剛建立的 user 加到這個新建的 group

  • 接下來 Add tags 是選填,不一定要填

  • 然後就可以獲得 Access key ID 以及 Secret access key ,如果怕忘記的話,可以下載下來哦! 這個 Secret access key 只會出現一次哦,如果不小心忘記或沒有記下來的話,就要重新產生哦!

實作 Laravel queue

配置 AWS SQS

  • 以下操作均參考官方文件
  • 安裝 AWS 官方 SDK ,參照官方文件 ,在專案資料夾底下:
    composer require aws/aws-sdk-php
  • .env檔案中,做以下配置
    QUEUE_CONNECTION=sqs
    SQS_KEY=上面拿到的 key
    SQS_SECRET=上面拿到的 secret
    SQS_QUEUE=testSQS
    SQS_REGION=ap-northeast-1
    SQS_PREFIX=依照上面的URL去掉queue名稱後填入

建立 jobs

php artisan make:job ProcessPodcast
  • job 範本如下
    <?php

    namespace App\Jobs;

    use App\Helpers;
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;

    class SendMailWhenOrderPlaced implements ShouldQueue
    {
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $job;

    // 嘗試執行最高次數
    public $tries = 5;

    /**
    * Create a new job instance.
    *
    * @return void
    */
    public function __construct($order, $FB_email, $Local_email)
    {
    $this->order = $order;
    $this->FB_email = $FB_email;
    $this->Local_email = $Local_email;
    $this->job = Helpers::mailWhenOrderPlaced($order, $FB_email, $Local_email);
    }

    /**
    * Execute the job.
    *
    * @return void
    */
    public function handle()
    {
    return $this->job;
    }
    }

上面的範例,是使用 queue 來執行 Ray 專案裡頭的一個寄送 Email 的功能,叫做 mailWhenOrderPlaced

使用 dispatch

  • 在我們想要執行這一個job的地方,使用dispatch,就可以囉!
    SendMailWhenOrderPlaced::dispatch($order, $FB_email, $Local_email);

執行 queue

  • 在專案底下,執行
    php artisan queue:work

測試

  • 這個時候,當程式執行到 dispatch 那行時,就會使用 queue 來執行哦!

總結

是不是很簡單啊?
另外,因為我們使用了 queue ,所以必須要確保 queue 的運作是正常的。以這個例子來說的話,如果 queue 不幸失效了,那這個發 Email 的功能就會失效哦!
為了確保 queue 在失敗後重新自動執行,我們需要 Supervisor 來幫我們監控並管理程序!
關於 Supervisor ,可以參考 Ray 的另外一篇文章哦!
如果想知道如何用 Laravel Mail 以及 AWS SES 來發送 mail ,也可以參考 Ray 的另外一篇文章

使用 `Laravel` `template` 與 `blade` 在 MacOS 及 AWS 上部署 supervisor

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×