Các công ty có thẻ gặp khó khăn trong việc quản lý các dịch vụ hoặc ứng dụng của họ. Ví dụ, các công ty các thực hiện gửi email cho hàng triệu người dùng hoặc thực hiện sao lưu dữ liệu. Tất cả các hoạt động này đều yêu cầu đều tiêu tốn nhiều tài nguyên của máy chủ.

Việc chạy tất cả các dịch vụ cùng một lúc có thể ảnh hưởng nhiều đến hiệu suất của ứng dụng, Do đó, có thể người dùng cảm thấy thất vọng do sự chậm trễ kéo dài. Laravel tìm cách giải quyết vấn đề này thông qua việc sử dụng queues.

Laravel queue là gì?

Queue liên quan đến việc sắp xếp mọi thứ thứ tự. Ví dụ một hệ thống của hàng có thể quản lý phục vụ khách hàng trên cơ sở ai đến trước thì sẽ phục vụ trước.

Điều này không khác gì Laravel queue. Nó phục vụ cùng một công việc bằng cách đảm bảo các dịch vụ được hiện theo một trình tự nhất định.

Sau này, tôi sẽ hướng dẫn các bạn một ví dụ đơn giản để bạn hiểu rõ về Laravel queue.

Cấu hình Laravel queue

Đầu tiên, bạn hãy chạy các lệnh sau để tạo bảng jobs chứa các công việc cần phải thưc hiện

php artisan queue:table
php artisan migrate

Tiếp theo, chúng ta cần sử dụng queue driver là database bằng cách cập nhật .env như sau

QUEUE_CONNECTION=database

Tiếp theo, chúng ta tạo ra một job có nhiệm vụ thêm dữ liệu giả vào bảng users, để tạo job bạn hãy chạy lệnh command sau

php artisan make:job CreateUserJob

Tiếp theo, bạn hay mở file CreateUserJob.php nằm trong thư mục app/Jobs và chỉnh sửa như sau

<?php

namespace App\Jobs;

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

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

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        \App\Models\User::factory(10)->create();
    }
}

Kiểm tra hoạt động Laravel queue

Trong bước này, chúng ta cần thêm một controller để thực hiện job trên.

Để làm được điều này, bạn hãy chạy lệnh command sau

php artisan make:controller TestQueueJobController

Tiếp theo, bạn hãy mở TestQueueJobController và chỉnh sửa như sau

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Jobs\CreateUserJob;

class TestQueueJobController extends Controller
{
    /**
    * Test queue job
    **/
    public function run()
    {
        $createUserJob = new CreateUserJob();
        $this->dispatch($createUserJob);
    }
}

Tiếp theo, bạn mở routes/web.php và thêm dòng bên dưới vào

Route::get('test-queue-job', [App\Http\Controllers\TestQueueJobController::class,'run']);

Sau đó, bạn hãy mở trình duyệt và truy cập vào url /test-queue-job để thực hiện công việc thêm user.

Sau khi một công việc được thực hiện, bạn cần xử lý queue, đối với điều này, bạn cần sử dụng lệnh command sau

php artisan queue:work

Cuối cùng, khi công việc thực hiện xong, bạn sẽ có thêm 10 user mới trong bảng users.

Xử lý lỗi các Queue Closure

Đôi khi một công việc thực hiện thất bại, bạn muốn có thể gửi thông báo đến cho người dùng của mình. Để thực hiện được điều này, bạn có thể thêm phương thức failed trong class job của mình

/**
 * The job failed to process.
 *
 * @param  Exception  $exception
 * @return void
 */
public function failed(\Throwable $exception)
{

}

Tùy chỉnh thời gian thử lại sau mỗi Job failed

Bạn có thể thêm phương thức backoff() vào Job class của mình để trả về một mảng các số nguyên nhằm quy định thời gian chờ giữa các lần thử nếu không thành công

/**
* Calculate the number of seconds to wait before retrying the job.
*
* @return array
*/
public function backoff()
{
    return [1, 5, 10];
}

Trong ví dụ trên, nếu Job không thành công trong lần thử đầu tiên, nó sẽ đợi 1 giây trước khi thử lại. Nếu Job sau đó tiếp tục không thành công trong lần thử thứ 2, nó sẽ đợi 5 giây trước khi thử lại. Sau đó, Nếu Job vẫn không thành công vào lần thứ 3 (và các lần sau đó) nó sẽ đợi 10 giây trước khi tiếp tục thử lại

Để cho Job được thực hiện 1 lần nữa hoặc nhiều lần hơn, bạn hãy thêm thuộc tính $tries vào Job class của bạn.

/**
 * The number of times the job may be attempted.
 *
 * @var int
 */
public $tries = 3;

Ngoài ra, bạn có thể giới hạn số lần chạy tối đa của một Job, bằng cách thêm thuộc tính $maxExceptions vào Job class của bạn.

/**
 * The maximum number of unhandled exceptions to allow before failing.
 *
 * @var int
 */
public $maxExceptions = 3;

Bạn cũng có thể xác định số giây tối đa mà Job đó được phép chạy, bằng cách thêm thuộc tính $timeout vào Job class của bạn

/**
 * The number of seconds the job can run before timing out.
 *
 * @var int
 */
public $timeout = 120;

Vậy, câu hỏi được đặt ra là làm sao biết được Job nào đã thực hiện không đúng thời gian, đơn giản thôi bạn chỉ cần thêm thuộc tính $failOnTimeout với giá trị là true vào Job class của bạn

/**
 * Indicate if the job should be marked as failed on timeout.
 *
 * @var bool
 */
public $failOnTimeout = true;

Ignoring Missing Models

Nếu như một dữ liệu trong model bị xóa mà Job đang trong quá trình chờ, thì công việc của bạn sẽ thực hiện không thành công.

Để thuận tiện, bạn có thể tự động xóa Job khi không có dữ liệu model, bằng cách thêm thuộc tính $deleteWhenMissingModels có giá trị là true, khi đó Laravel sẽ loại bỏ công việc mà không đưa vào ngoại lệ

/**
 * Delete the job if its models no longer exist.
 *
 * @var bool
 */
public $deleteWhenMissingModels = true;

Như vậy, chúng ta đã thực hiện xong một ví dụ đơn giản về Laravel Queue, tôi hy vọng hướng dẫn của tôi sẽ giúp ích cho công việc của bạn. Nếu bạn có bất kỳ câu hỏi nào hãy liên hệ với chúng tôi qua trang contact. Cảm ơn bạn.

CÓ THỂ BẠN QUAN TÂM

Csv import with Validation for Laravel

Csv import with Validation for Laravel

Trong một bài viết lúc trước, mình đã chia sẻ đến các bạn cách xây dựng một service import và export CSV sử dụng Facades, nếu có bạn nào không biết hoặc đã quên các bạn có thể tham khảo lại bài viết t...

Implementing Private User Folders with CKFinder in Laravel

Implementing Private User Folders with CKFinder in Laravel

CKFinder 3 CKFinder 3 là trình quản lý tập tin được tích hợp với CKEditor 4 và CKEditor 5. Nó giúp bạn dễ dàng đưa các tập tin và hình ảnh vào nội dung của Editor một cách an toàn. Đây là một tín...

Laravel Factories, Seeder

Laravel Factories, Seeder

Trong bài viết này, tôi sẽ hướng dẫn các bạn về cách tạo dữ liệu giả trong cơ sở dữ liệu bằng cách sử dụng Laravel Factory và Seed trong Database Seeder. Để tạo model factory, bạn cần chạy lệnh sau...

Laravel One to Many Polymorphic Relationship

Laravel One to Many Polymorphic Relationship

One to Many Polymorphic Model Relationship được sử dụng khi một model thuộc về nhiều model khác trên một model kết hợp duy nhất. Ví dụ: Nếu chúng ta có bảng post và video, cả hai đều cần thêm hệ thống...

Laravel TinyMCE 6 Image Upload

Laravel TinyMCE 6 Image Upload

TinyMCE TinyMCE là một trình soạn thảo  WYSIWYG  được xây dựng trên nền tảng Javascript, được phát triển dưới dạng mã nguồn mở theo giấy phép  MIT  bởi Tiny Technologies Inc. TinyMCE cho phép ngư...

Export CSV from AWS RDS - Import into MySQL with Laravel

Export CSV from AWS RDS - Import into MySQL with Laravel

Transfer Database Trong quá trình phát triển và bảo trì dự án, nhiệm vụ di chuyển cơ sở dữ liệu từ hệ thống này sang hệ thống khác là một nhiệm vụ khá là phổ biến. Chúng ta thường sẽ sử dụng câu...

Integrating AI Assistant with CKEditor 5 in Laravel using Vite

Integrating AI Assistant with CKEditor 5 in Laravel using Vite

OpenAI OpenAI là một công ty nghiên cứu và triển khai trí tuệ nhân tạo, nổi tiếng với việc phát triển các mô hình AI tiên tiến. Mục tiêu của OpenAI là đảm bảo rằng trí tuệ nhân tạo tổng quát (AGI...

Laravel Model

Laravel Model

Model là gì? Trong mô hình MVC, chữ “M” viết tắt là Model, Model dùng để xử lý logic nghiệp vụ trong bất kì ứng dụng dựa trên mô hình MVC. Trong Laravel, Model là lớp đại diện cho cấu trúc logic và...

Laravel Task Scheduling

Laravel Task Scheduling

Trong các ứng dụng lớn, bạn cần lên lịch định kì cho các công việc bằng Cron jobs.  Tại số một số thời điểm, việc quản lý các cron jobs trở nên cồng kềnh và khó khăn hơn. Laravel Scheduler là một côn...

ManhDanBlogs