All posts
Laravel Reverb + Database Driver: Triển khai Real-time cực tiết kiệm không cần Redis
laravellaravelreverbdatabasedriver

Laravel Reverb + Database Driver: Triển khai Real-time cực tiết kiệm không cần Redis

Hao Nguyen K.'s avatarHao Nguyen K.
Table of Contents11 sections

Tính năng thời gian thực (Real-time) như thông báo tin nhắn, cập nhật tiến độ công việc hay live-dashboard đã trở thành tiêu chuẩn bắt buộc cho các ứng dụng web hiện đại. Trước đây, khi nhắc đến real-time trong Laravel, chúng ta thường nghĩ ngay đến các dịch vụ bên thứ ba đắt đỏ như Pusher, hoặc phải tự cấu hình một cụm hạ tầng phức tạp gồm Node.js, Socket.io và đặc biệt là Redis để làm một tầng đệm trung gian (Brodcasting Driver).

Sự ra đời của Laravel Reverb — WebSocket server "chính chủ" do đội ngũ Laravel phát triển — đã thay đổi hoàn toàn cuộc chơi. Và bước sang năm 2026 với phiên bản cập nhật mới nhất, Reverb đã chính thức hỗ trợ Database Driver.

Bài viết này sẽ hướng dẫn bạn cách tận dụng sự kết hợp này để xây dựng một hệ thống Real-time mượt mà, ổn định nhưng với chi phí hạ tầng bằng 0.

1. Tại sao sự kết hợp này lại là "Cứu cánh" cho các dự án vừa và nhỏ?

Trong kiến trúc real-time truyền thống, Redis đóng vai trò là một Pub/Sub broker (Hệ thống xuất bản/đăng ký tín hiệu). Khi có một sự kiện xảy ra, Laravel sẽ đẩy tín hiệu vào Redis, và WebSocket Server sẽ "nghe" từ Redis để phân phối đến trình duyệt của người dùng.

Tuy nhiên, việc cài đặt và duy trì Redis đi kèm với nhiều bài toán đau đầu:

  • Tốn chi phí phần cứng: Bạn phải thuê thêm một server trung gian hoặc mua các gói Managed Redis khá đắt đỏ trên AWS/DigitalOcean.

  • Tăng độ phức tạp khi DevOps: Phải cấu hình bảo mật, quản lý bộ nhớ RAM cho Redis và xử lý các lỗi mất kết nối giữa các tầng hạ tầng.

Với Reverb + Database Driver, cấu trúc Pub/Sub này được đẩy thẳng vào cơ sở dữ liệu có sẵn của bạn (MySQL/PostgreSQL). Reverb sẽ tận dụng chính các bảng dữ liệu để điều phối tín hiệu. Bạn không cần cài thêm Redis, không cần tốn thêm một byte RAM nào cho hạ tầng mới. Toàn bộ hệ thống gói gọn trong những gì bạn đang có.

2. Hướng dẫn cấu hình Reverb với Database Driver trong 3 bước

Bước 1: Cài đặt Laravel Reverb

Cài đặt Reverb vô cùng đơn giản chỉ với một câu lệnh Artisan. Laravel sẽ tự động thiết lập các cấu hình mặc định cho bạn:

Bash

  • php artisan install:broadcasting

(Khi được hỏi có muốn cài đặt Laravel Reverb không, hãy chọn Yes).

Bước 2: Chuyển đổi Driver sang Database

Mở file .env của bạn và cập nhật lại cấu hình Reverb Driver từ reverb (mặc định dùng bộ nhớ tạm) hoặc redis sang database:

Code snippet

BROADCAST_CONNECTION=reverb
REVERB_DRIVER=database

Tiếp theo, chạy lệnh migration để Laravel tạo bảng lưu trữ tín hiệu real-time:

Bash

  • php artisan migrate

Laravel sẽ tạo ra một bảng hệ thống (thường là reverb_signals) đóng vai trò nhận và phân phối các gói tin WebSocket.

Bước 3: Khởi chạy Reverb Server

Trên server của bạn, chỉ cần chạy duy nhất lệnh sau để kích hoạt WebSocket Server:

Bash

  • php artisan reverb:start

3. Demo thực chiến: Bắn thông báo Real-time cho người dùng

Hãy cùng tạo một Event đơn giản để gửi thông báo "Đơn hàng đã được duyệt" đến cho khách hàng theo thời gian thực.

Tạo Event bằng Artisan:

Bash

php artisan make:event OrderApprovedEvent

Viết logic trong file Event:

Khai báo Class triển khai Interface ShouldBroadcast để Laravel biết cần phải phát tín hiệu này đi.

PHP

namespace App\Events;

use App\Models\Order;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class OrderApprovedEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public function __construct(public Order $order) {}

    // Định nghĩa kênh nhận thông báo (ví dụ kênh riêng tư của từng user)
    public function broadcastOn(): array
    {
        return [
            new Channel('user.' . $this->order->user_id),
        ];
    }

    // Dữ liệu sẽ trả về cho phía Frontend (JavaScript)
    public function broadcastWith(): array
    {
        return [
            'order_id' => $this->order->id,
            'message' => "Đơn hàng #{$this->order->id} của bạn đã được phê duyệt thành công!",
        ];
    }
}

Kích hoạt Event tại Controller:

Bất cứ khi nào trạng thái đơn hàng thay đổi, bạn chỉ cần gọi hàm event():

PHP

public function approve($id)
{
    $order = Order::findOrFail($id);
    $order->update(['status' => 'approved']);

    // Phát tín hiệu real-time! Dữ liệu sẽ đi qua DB và Reverb bắn thẳng lên trình duyệt khách hàng
    event(new OrderApprovedEvent($order));

    return response()->json(['message' => 'Đã duyệt đơn hàng!']);
}

4. Những lưu ý quan trọng để không làm nghẽn Database

Mặc dù giải pháp này cực kỳ tiết kiệm, nhưng vì dữ liệu đi qua Database, bạn cần tuân thủ 2 quy tắc "vàng" sau để tránh làm chậm hệ thống:

  1. Chỉ dùng cho dự án vừa và nhỏ: Nếu ứng dụng của bạn có hàng chục ngàn người online và nhắn tin chat liên tục (tần suất ghi vào DB quá dày), bạn vẫn nên nâng cấp lên Redis. Database Driver sinh ra để phục vụ cho các tác vụ tần suất vừa phải như thông báo ứng dụng (Notifications), cập nhật trạng thái đơn từ.

  2. Cấu hình tự dọn dẹp (Pruning): Bảng reverb_signals sẽ phình to rất nhanh nếu không được dọn dẹp. Hãy đảm bảo bạn đã bật lệnh php artisan model:prune trong Scheduler hàng đêm để Laravel tự động xóa bỏ các tín hiệu real-time cũ đã được xử lý xong.

Lời kết

Bằng việc ra mắt Reverb + Database Driver, Laravel một lần nữa chứng minh họ là framework tối ưu nhất cho trải nghiệm của lập trình viên và doanh nghiệp. Bạn không còn phải đánh đổi giữa "chi phí hạ tầng" và "tính năng hiện đại" nữa.