LARAVEL TUTORIALS
10 thủ thuật Lavavel giúp bạn code nhanh hơn! Routing trong Laravel, cách tạo Route và sử dung AZ Tạo Middleware trong Laravel đơn giản trong 5 phút Xử lý Authentication và Authorization trong Laravel Event và listener trong Laravel, cách tạo và quản lý cơ bản nhất Tạo broadcast event trong Laravel dễ dàng trong 10 phút Xử lý Form Validation trong Laravel từ A - Z Cách tạo Session và cookie trong Laravel dễ dàng như ăn cháo Top 10 Package Lavavel thường dùng trong dự án Laravel Sử dụng Task trong Laravel đơn giản trong 10 phút. Cách tạo API trong Laravel đơn giản chỉ trong 5 phút Cách tạo job trong Laravel sao cho hiệu quả? Queues trong Laravel, dùng để xử lý các tác vụ mất nhiều thời gian Cache trong Laravel, các loại Cache thường dùng trong Laravel Redis trong Laravel, biết cách sử dung Redis Laravel trong 5 phút Sử dụng Memcache trong Laravel tăng tốc độ truy cập website Unit Test trong Laravel, thực hành tạo testing Laravel A-Z 10 thủ thuật tối ưu quá trình Testing trong Laravel Top 7 thư viện Testing Laravel được dùng nhiều nhất Testbench và Orchestra Testbench trong Laravel, kiểm thử Laravel dễ dàng Cách dùng Browser Testing (Laravel Dusk) trong Laravel Cách tạo test case cho Controller trong Laravel Cách tạo test case cho Model trong Laravel Cách tạo Database Testing trong Laravel Real-time web applications là gì ? Tầm quan trọng trong Laravel Laravel WebSockets, các bước tạo WebSockets trong Laravel Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime Cách dùng Long polling trong Laravel để cải thiện trải nghiệm Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ Cách dùng Event Sourcing trong Laravel Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản Sử dụng Service Container trong Laravel dễ dàng Cách xử lý đa ngôn ngữ trong Laravel dễ dàng Tìm hiểu và sử dụng Service Provider trong Laravel Facades là gì? Cách dùng Facades trong Laravel Cách sử dụng Email Verification trong Laravel Cách dùng URL Generation trong Larevel Cách sử dụng Error Handling trong Laravel Cách dùng Encryption và decryption trong Laravel Cách sử dụng Relationships trong Laravel Bài 01: Laravel là gì? Hướng dẫn cài đặt laravel trên windows Sử dụng Event trong Laravel Một cách quản lý filter trong Laravel
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Tìm hiểu về Queue trong Laravel để thực hiện các tác vụ bất đồng bộ một cách hiệu quả và giúp tăng khả năng mở rộng của ứng dụng.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Queue trong Laravel. Đầu tiên, chúng ta sẽ tìm hiểu cách cấu hình Queue, bao gồm việc thiết lập các driver và các tham số cho Queue. Sau đó, chúng ta sẽ học cách tạo các tác vụ (jobs) cho Queue và đưa chúng vào hàng đợi để xử lý. Cuối cùng, chúng ta sẽ tìm hiểu cách xử lý các tác vụ trong Queue và hiển thị kết quả.

Nếu bạn đang tìm kiếm một công cụ mạnh mẽ để xử lý các tác vụ phức tạp trong Laravel, Queue là một giải pháp tuyệt vời. Hãy cùng bắt đầu tìm hiểu cách sử dụng Queue trong Laravel!

1. Queue trong Laravel là gì?

Queue jpg

Laravel Queues

Queue trong Laravel là một công cụ mạnh mẽ giúp xử lý các tác vụ phức tạp của ứng dụng một cách dễ dàng và hiệu quả. Chúng ta có thể đưa các tác vụ vào hàng đợi để xử lý ở sau, giúp giảm thiểu thời gian phản hồi và tăng tốc độ xử lý của ứng dụng. Trên cơ sở đó, chúng ta sẽ tìm hiểu cách sử dụng và cấu hình Queue trong Laravel để xử lý các tác vụ một cách nhanh chóng và hiệu quả hơn.

Bài viết này được đăng tại [free tuts .net]

Lợi ích của việc sử dụng Queue trong ứng dụng Laravel bao gồm:

  • Giảm thiểu thời gian phản hồi của ứng dụng: Khi sử dụng Queue, các tác vụ được đưa vào hàng đợi để xử lý ở sau, giúp giảm thiểu thời gian phản hồi của ứng dụng đối với người dùng.
  • Tăng tốc độ xử lý ứng dụng: Bằng cách xử lý các tác vụ trong hàng đợi, ứng dụng có thể xử lý được nhiều tác vụ cùng lúc, giúp tăng tốc độ xử lý của ứng dụng.
  • Xử lý các tác vụ phức tạp: Queue cho phép xử lý các tác vụ phức tạp như gửi email, xử lý file, tính toán phức tạp một cách dễ dàng và hiệu quả hơn.
  • Giảm thiểu thiệt hại khi xảy ra lỗi: Nếu có lỗi xảy ra trong quá trình xử lý một tác vụ, Queue sẽ lưu lại thông tin về tác vụ và thực hiện lại sau khi ứng dụng được khởi động lại, giúp giảm thiểu thiệt hại cho ứng dụng.

Với những lợi ích trên, Queue là một công cụ quan trọng và hữu ích trong phát triển ứng dụng Laravel.

2. Các loại Queue trong Laravel

  • Sync Queue: đây là loại queue đơn giản nhất và được sử dụng mặc định trong Laravel. Nó hoạt động trên cùng một process và không sử dụng bất kỳ công nghệ queue system nào khác. Sử dụng Sync Queue có thể hữu ích cho các ứng dụng nhỏ hoặc khi bạn muốn kiểm tra các job đang chạy trên local environment.

  • Redis Queue: đây là loại queue sử dụng Redis làm nơi lưu trữ các job đang chờ xử lý. Redis là một hệ thống lưu trữ dữ liệu in-memory nhanh và phổ biến, cho phép Queue được xử lý đồng thời bởi nhiều worker process. Ngoài ra, Redis Queue còn có thể được cấu hình để sử dụng các tính năng như job retry, thời gian xử lý tối đa,...

  • Beanstalkd Queue: Beanstalkd là một hệ thống queue đơn giản, nhẹ và được thiết kế để xử lý các job đơn giản một cách hiệu quả. Nó được sử dụng trong Laravel như một tùy chọn queue system thay thế cho Redis. Beanstalkd cho phép worker process lấy các job đang chờ xử lý từ một pool các tubes (tương tự như các hàng đợi).

  • Database Queue: Đây là loại queue sử dụng cơ sở dữ liệu để lưu trữ các job đang chờ xử lý. Nó cho phép các ứng dụng sử dụng các cơ sở dữ liệu phổ biến như MySQL, PostgreSQL hoặc SQL Server để quản lý các job. Tuy nhiên, sử dụng Database Queue không hiệu quả bằng các hệ thống queue system khác như Redis hay Beanstalkd.

3. Tại sao nên sử dụng Queue trong ứng dụng Laravel?

Việc sử dụng Queue trong ứng dụng Laravel đem lại nhiều lợi ích cho người phát triển, bao gồm:

  • Tăng hiệu suất và độ ổn định: Khi có nhiều nhiệm vụ được kích hoạt cùng một lúc, việc xử lý chúng trực tiếp trên web server có thể ảnh hưởng đến hiệu suất và độ ổn định của hệ thống. Queue giúp tách các nhiệm vụ xử lý độc lập và đưa chúng vào hàng đợi để xử lý. Điều này giúp giảm tải cho server và tăng hiệu suất của hệ thống.
  • Xử lý bất đồng bộ: Với Queue, các nhiệm vụ có thể được xử lý bất đồng bộ, điều này cho phép các request và response của client không bị block trong quá trình thực hiện các nhiệm vụ xử lý dài hạn.
  • Định thời xử lý: Queue cũng hỗ trợ định thời xử lý, cho phép người phát triển đặt thời gian chạy các nhiệm vụ cụ thể, giúp tiết kiệm tài nguyên và tối ưu hóa quá trình xử lý.
  • Dễ dàng quản lý và mở rộng: Laravel cung cấp các công cụ và tài liệu để quản lý và mở rộng Queue, giúp người phát triển dễ dàng tùy chỉnh và cấu hình theo nhu cầu của ứng dụng.

Tóm lại, sử dụng Queue trong ứng dụng Laravel giúp tăng hiệu suất và độ ổn định của hệ thống, cũng như cung cấp các tính năng linh hoạt để xử lý các nhiệm vụ độc lập và có thể định thời, tăng tính bảo mật và dễ dàng quản lý và mở rộng.

4. Các bước cấu hình Queue trong Laravel

Để cấu hình Queue trong Laravel, bạn có thể thực hiện các bước sau đây:

Bước 1: Cấu hình driver cho Queue

Laravel hỗ trợ nhiều loại driver cho Queue, bao gồm Beanstalkd, Amazon SQS, Redis, và Database. Bạn có thể cấu hình driver bằng cách sửa đổi giá trị của QUEUE_DRIVER trong file .env.

Ví dụ, nếu bạn muốn sử dụng Redis làm driver, bạn có thể đặt

QUEUE_DRIVER=redis.

Bước 2: Cấu hình connection cho Queue

Mỗi loại driver sẽ có các cấu hình kết nối khác nhau. Ví dụ, nếu bạn sử dụng Redis, bạn cần cấu hình địa chỉ Redis và số cổng trong file config/queue.php. Bạn cũng có thể sử dụng các tùy chọn khác để cấu hình các tham số như mật khẩu hoặc tên cơ sở dữ liệu.

Ví dụ: Để cấu hình Redis, bạn cần thực hiện các bước sau:

  • Mở file config/queue.php và tìm kiếm 'redis' trong mảng connections.
  • Bạn có thể sửa đổi các giá trị host, port, password, và database tùy thuộc vào cấu hình Redis của bạn.
  • Nếu bạn muốn sử dụng kết nối Redis cụ thể, bạn có thể thay đổi giá trị của 'default' trong mảng connections bằng tên kết nối bạn muốn sử dụng.

Bước 3: Cấu hình queue worker

Bạn cần tạo một queue worker để xử lý các công việc được đưa vào queue. Laravel đi kèm với một số lệnh Artisan để hỗ trợ việc này.

Để bắt đầu một queue worker, bạn có thể chạy lệnh sau đây trong terminal:

php artisan queue:work

Bạn có thể sử dụng các tùy chọn để chỉ định driver, connection, số lượng công việc được xử lý cùng lúc, thời gian chờ giữa các lần kiểm tra queue, và nhiều tùy chọn khác. Để biết thêm chi tiết, bạn có thể sử dụng lệnh để xem danh sách các tùy chọn.

php artisan queue:work --help

Bạn cũng có thể sử dụng Supervisor để chạy queue worker như một dịch vụ nền và đảm bảo rằng nó luôn chạy. Để biết thêm thông tin về cách cấu hình Supervisor, bạn có thể đọc tài liệu của nó.

Tạo và sử dụng Queue trong Laravel

Tạo một Job

Trong Laravel, một Job là một class PHP được sử dụng để thực hiện một công việc nào đó. Để tạo một Job mới, chúng ta có thể sử dụng lệnh Artisan make:job. Ví dụ, để tạo một Job để gửi email, chúng ta có thể chạy lệnh sau:

php artisan make:job SendEmail

Lệnh này sẽ tạo ra một file SendEmail.php trong thư mục app/Jobs với nội dung như sau:

<?php

namespace App\Jobs;

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

class SendEmail 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()
    {
        //
    }
}

Đưa Job vào Queue

Sau khi tạo một Job, chúng ta cần đưa Job này vào hàng đợi để nó được thực hiện bởi một hoặc nhiều worker. Để đưa Job vào hàng đợi, chúng ta sử dụng phương thức dispatch() hoặc dispatchNow() của class Illuminate\Foundation\Bus\Dispatchable. Ví dụ, để đưa Job SendEmail vào hàng đợi, chúng ta có thể sử dụng lệnh sau:

SendEmail::dispatch();

Hoặc để thực hiện Job ngay lập tức mà không đưa vào hàng đợi, chúng ta có thể sử dụng phương thức dispatchNow():

SendEmail::dispatchNow();

Xử lý Job

Khi một Job được đưa vào hàng đợi, nó sẽ chờ đợi được lấy ra và xử lý bởi một worker. Để xử lý Job, chúng ta cần định nghĩa phương thức handle() trong class Job. Ví dụ, để thực hiện gửi email trong Job SendEmail, chúng ta có thể cập nhật phương thức handle() như sau:

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    // Code để gửi email
}

Lưu ý rằng Job phải implement interface ShouldQueue để được đưa vào hàng đợi và được xử lý bởi worker. Nếu không implement interface này, Job sẽ được thực hiện ngay lập tức khi được gọi, chứ không được đưa vào hàng đợi.

5. Xử lý lỗi và ghi nhật ký khi sử dụng Queue trong Laravel

Cách xử lý lỗi khi Job gặp vấn đề

Khi một Job gặp lỗi trong quá trình thực hiện, Laravel sẽ tự động đưa Job vào danh sách các Job thất bại (failed jobs). Để xem danh sách các Job thất bại, chúng ta có thể sử dụng lệnh Artisan sau:

php artisan queue:failed

Để xử lý các Job thất bại, chúng ta có thể sử dụng một trong hai cách sau:

Thực hiện lại Job thất bại

Chúng ta có thể sử dụng lệnh Artisan queue:retry để thực hiện lại một Job thất bại. Ví dụ, để thực hiện lại một Job thất bại có id là 5, chúng ta có thể sử dụng lệnh sau:

php artisan queue:retry 5

Xóa Job thất bại

Chúng ta có thể sử dụng lệnh Artisan queue:forget để xóa một Job thất bại khỏi danh sách các Job thất bại. Ví dụ, để xóa một Job thất bại có id là 5, chúng ta có thể sử dụng lệnh sau:

php artisan queue:forget 5

Cách ghi nhật ký khi sử dụng Queue

Khi sử dụng Queue trong Laravel, chúng ta có thể ghi nhật ký (logging) các hoạt động của các Job thông qua các hàm ghi nhật ký đã được cài đặt trong Laravel như Log::info(), Log::debug(), Log::error()Log::warning(). Ví dụ, để ghi nhật ký một thông báo khi Job SendEmail được thực hiện, chúng ta có thể sử dụng hàm Log::info() như sau:

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    Log::info('SendEmail Job is being executed');
    // Code để gửi email
}

Các thông tin ghi nhật ký này sẽ được lưu trữ trong các tập tin log của Laravel, mà có thể được tìm thấy trong thư mục storage/logs.

6. Tối ưu hóa Queue trong Laravel

Giới hạn số lượng Job được đưa vào Queue

Trong Laravel, chúng ta có thể giới hạn số lượng Job được đưa vào Queue bằng cách sử dụng phương thức onQueue() trong các lệnh dispatch của Job. Ví dụ, để giới hạn số lượng Job được đưa vào Queue là 10, chúng ta có thể sử dụng phương thức onQueue() như sau:

// Job được đưa vào Queue với tên là send-email và giới hạn 10 Job
SendEmail::dispatch()->onQueue('send-email')->onConnection('redis')->batchSize(10);

Trong ví dụ này, chúng ta đang sử dụng driver Redis cho Queue. Để giới hạn số lượng Job được đưa vào Queue, chúng ta sử dụng phương thức batchSize(10).

Xử lý Job cùng lúc trên nhiều máy chủ:

Để xử lý Job cùng lúc trên nhiều máy chủ, chúng ta có thể sử dụng các công nghệ như Redis, RabbitMQ hoặc Beanstalkd. Với Redis, chúng ta có thể cấu hình các máy chủ Redis để làm các máy chủ Queue và xử lý Job trên các máy chủ này. Ví dụ, để cấu hình một máy chủ Redis để xử lý Job, chúng ta có thể sử dụng file config/queue.php như sau:

'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => env('REDIS_QUEUE', 'default'),
    'retry_after' => 90,
    'block_for' => null,
    'balance' => 'simple',
    'servers' => [
        [
            'host' => '127.0.0.1',
            'port' => 6379,
            'password' => null,
            'database' => 0,
            'timeout' => 0.5,
            'read_timeout' => 0,
            'persistent' => false,
            'options' => [],
        ],
    ],
],

Trong ví dụ này, chúng ta đang sử dụng driver Redis cho Queue và cấu hình một máy chủ Redis để xử lý Job. Nếu chúng ta muốn thêm máy chủ Redis khác để xử lý Job, chúng ta chỉ cần thêm một mục vào mảng servers. Các máy chủ Redis này sẽ được sử dụng để xử lý Job đồng thời và tăng hiệu suất xử lý của Queue.

7. Kết bài viết

Trong bài viết này, chúng ta đã tìm hiểu về cách sử dụng Queue trong Laravel để xử lý các tác vụ nặng trong ứng dụng. Chúng ta đã tìm hiểu về các khái niệm cơ bản liên quan đến Queue, cách cấu hình và sử dụng Queue trong Laravel, cách xử lý lỗi và ghi nhật ký khi sử dụng Queue, và cách tối ưu hóa Queue để tăng hiệu suất xử lý. Sử dụng Queue giúp chúng ta xử lý các tác vụ nặng trong ứng dụng một cách hiệu quả hơn và tránh ảnh hưởng đến trải nghiệm của người dùng.

Tài liệu tham khảo

Cùng chuyên mục:

Cách sử dụng Relationships trong Laravel

Cách sử dụng Relationships trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách dùng URL Generation trong Larevel

Cách dùng URL Generation trong Larevel

Cách sử dụng Email Verification trong Laravel

Cách sử dụng Email Verification trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Sử dụng Service Container trong Laravel dễ dàng

Sử dụng Service Container trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách dùng Event Sourcing trong Laravel

Cách dùng Event Sourcing trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Real-time web applications là gì ? Tầm quan trọng  trong Laravel

Real-time web applications là gì ? Tầm quan trọng trong Laravel

Cách tạo Database Testing trong Laravel

Cách tạo Database Testing trong Laravel

Cách dùng Browser Testing (Laravel Dusk) trong Laravel

Cách dùng Browser Testing (Laravel Dusk) trong Laravel

Top