Giới thiệu về Laravel Reverb
Trong phiên bản cập nhật Laravel 11, Taylor Otwell đã giới thiệu nhiều tính năng hữu ích mới, trong đó nổi bật là Laravel Reverb. Laravel Reverb cung cấp khả năng giao tiếp WebSocket thời gian thực nhanh chóng và khả năng mở rộng dễ dàng đến ứng dụng của bạn. Nó tích hợp hoàn hảo với công cụ phát sóng sự kiện hiện có của Laravel.
Reverb được xây dựng dựa trên EventLoop của ReactPHP thay vì sử dụng phương pháp Long Polling hay các cơ chế HTTP tương tự. Điều này cho phép Reverb xử lý bất đồng bộ một cách hiệu quả hơn và cải thiện đáng kể hiệu suất ứng dụng của bạn.
Cài đặt Laravel Reverb
Để cài đặt Laravel Reverb, bạn chỉ cần chạy lệnh sau trong Terminal:
php artisan install:broadcasting
Lệnh Artisan này sẽ tự động cài đặt Reverb với cấu hình mặc định hợp lý thông qua lệnh reverb:install
.
Cách cấu hình Reverb
Bạn có thể cập nhật cấu hình của Reverb bằng cách điều chỉnh các biến môi trường trong tệp .env
hoặc thông qua tệp cấu hình config/reverb.php
. Để thiết lập kết nối giữa client và server, bạn cần định nghĩa thông tin xác thực ứng dụng Reverb như sau:
REVERB_APP_ID=my-app-id
REVERB_APP_KEY=my-app-key
REVERB_APP_SECRET=my-app-secret
Ngoài ra, bạn cũng có thể chỉ định nguồn gốc cho phép cho các request từ client bằng cách cập nhật tùy chọn allow_origins
trong tệp cấu hình. Ví dụ:
'apps' => [
[
'id' => 'my-app-id',
'allowed_origins' => ['*'],
],
]
Reverb cho phép bạn phục vụ nhiều ứng dụng bằng cách chỉ định nhiều ứng dụng trong tệp cấu hình config/reverb.php
:
'apps' => [
[
'id' => 'my-app-one',
],
[
'id' => 'my-app-two',
],
],
Khởi Chạy Máy Chủ Reverb
Để khởi chạy máy chủ Reverb, bạn sử dụng lệnh sau:
php artisan reverb:start
Mặc định, máy chủ sẽ khởi động trên địa chỉ 0.0.0.0:8080. Nếu muốn thay đổi địa chỉ và cổng, bạn có thể thêm các tùy chọn --host
và --port
như sau:
php artisan reverb:start --host=127.0.0.1 --port=9000
Quá trình khởi động lại máy chủ có thể được thực hiện bằng lệnh:
php artisan reverb:restart
Tối Ưu Hóa Máy Chủ cho Môi Trường Production
Máy chủ WebSocket cần hoạt động liên tục, vì vậy việc tối ưu hóa là rất quan trọng. Mỗi kết nối WebSocket được giữ trong bộ nhớ cho đến khi có yêu cầu ngắt kết nối. Trên hệ điều hành Unix, tệp sẽ đại diện cho mỗi kết nối. Bạn có thể kiểm tra giới hạn số lượng tệp mở được phép với lệnh:
ulimit -n
Để nâng giới hạn lên 10.000 cho user forge
, bạn cần cập nhật tệp /etc/security/limits.conf
như sau:
# /etc/security/limits.conf
forge soft nofile 10000
forge hard nofile 10000
Vòng Lặp Sự Kiện
Reverb sử dụng vòng lặp sự kiện của ReactPHP để quản lý kết nối WebSocket. Mặc định, vòng lặp này sử dụng stream_select
, nhưng có giới hạn ở 1.024 tệp mở. Nếu bạn có nhu cầu cần hơn 1.000 kết nối, hãy cài đặt các tiện ích mở rộng PHP thông qua PECL:
pecl install event
# hoặc
pecl install ev
# hoặc
pecl install uv
Máy Chủ Web Nginx
Reverb hoạt động trên cổng không liên quan đến web. Để định tuyến lưu lượng đến Reverb, bạn phải cấu hình máy chủ proxy ngược bằng Nginx, ví dụ:
server {
...
location / {
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://0.0.0.0:8080;
}
...
}
Quản Lý Quy Trình
Sử dụng trình quản lý quy trình như Supervisor là cách tốt nhất để máy chủ Reverb hoạt động liên tục. Bạn cũng nên cấu hình minfds
trong supervisor.conf
để đảm bảo Supervisor có thể mở đủ tệp cần thiết:
[supervisord]
...
minfds=10000
Mở Rộng Quy Mô
Nếu bạn cần phục vụ nhiều kết nối hơn mức cho phép trên một máy chủ, hãy sử dụng khả năng publish/subscribe của Redis để mở rộng Reverb theo chiều ngang. Bạn chỉ cần bật tùy chọn mở rộng trong tệp .env
:
REVERB_SCALING_ENABLED=true
Cấu hình máy chủ Redis để tất cả các máy chủ Reverb có thể giao tiếp. Với việc bật tùy chọn mở rộng và cấu hình Redis, chỉ cần gọi lệnh reverb:start
trên nhiều máy chủ.
Kết Luận
Laravel Reverb là một công cụ mạnh mẽ giúp bạn xây dựng ứng dụng thời gian thực dễ dàng và hiệu quả. Với khả năng mở rộng và tích hợp tốt với Laravel, bạn có thể tạo ra những trải nghiệm người dùng mượt mà và nhanh chóng.
source: viblo