Trên tay Reverb, official WebSocket server từ Laravel

Cách đây không lâu, phiên bản Laravel 11 đã chính thức ra mắt. Đi với đó là Reverb, package sẽ mang đến giao tiếp WebSocket cho các ứng dụng Laravel hoàn toàn bằng PHP (không cần cài đặt thêm extension hoặc sử dụng các stack khác như NodeJS).

Reverb hiện tại đang ở phiên bản dev-beta. Anh em muốn cài đặt được thì cần cập nhật "minimum-stability": "stable" sang "minimum-stability": "dev" nhé

REVERB HOẠT ĐỘNG NHƯ THẾ NÀO ?

"Under the hood", Reverb tạo lên WebSocket server sử dụng EventLoop của thư viện ReactPHP.

Mình sẽ nhắc lại một chút về EventLoop: EventLoop là một Pattern, cho phép ứng dụng của bạn có thể chờ đợi liên tục các sự kiện và xử lý một cách bất đồng bộ (async).

Một ví dụ khá phổ biến là khi bạn cần xử lý các sự kiện trên JavaScript, ví dụ onClick chẳng hạn.

Nếu website của bạn xử lý một cách tuần tự, thì khi bạn click, nó sẽ "treo" luôn ở đó để chạy đoạn code xử lý, cho đến khi xong bạn có thể mới thao tác được tiếp => Thật đúng là ác mộng.

EventLoop cho phép đẩy các handler (tên quen thuộc hơn là các Callback) xuống stack và EventLoop sẽ xử lý nó dần dần tách biệt khỏi main thread (giải thích cho việc bạn click liên tục trên website và vẫn có thể thao tác được việc khác khi hành động click được thực thi).

Hoặc đơn giản hơn, bạn có thể tưởng tượng lệnh queue:work chính là một EventLoop, liên tục chờ đợi các Event, chính là các job được dispatch và xử lý. ReactPHP xây dựng lên EventLoop bằng hàm stream_select() của PHP, nhờ đó nó không phụ thuộc vào các extension hay thư viện ngoài.

Nếu bạn muốn hiểu hơn về EventLoop và xử lý bất đồng bộ, thư viện https://revolt.run/ sẽ rất thú vị (và nó cũng hoàn toàn bằng PHP).

Quay trở lại Reverb, sau khi có EventLoop, chúng ta đã hoàn toàn sẵn sàng có một WebSocket server để giao tiếp.

REVERB CÓ GÌ ?

1. Websocket server chạy dưới Pusher Protocol

Tương tự như Laravel Websocket, Reverb sẽ implement Pusher Protocol. Nếu ứng dụng của bạn đang chạy với Pusher, việc switch sang Reverb gần như chỉ bằng thao tác thay đổi thông tin credentials.

Các thư viện client với Pusher, bạn không cần chỉnh sửa. Hiện nay việc tích hợp WebSocket với Pusher từ web đến mobile là cực kỳ dễ dàng và tiện lợi => bạn sẽ tận dụng được thế mạnh này với Reverb.

Đương nhiên, bạn có thể tích hợp ngay lập tức Reverb với Broadcasting và Laravel Echo rất tiện lợi (Nếu là fan của Soketi hoặc Laravel Websocket thì chắc chắn bạn không lạ gì cách làm này),

Tóm lại chúng ta sẽ có một Pusher server giá 0 đồng (nếu không tính phí server bạn đang chạy) và chạy hoàn toàn bằng PHP.

2. Nhanh

Reverb được quảng bá có thể handle hàng nghìn connection cùng lúc trên một server (tất nhiên bạn cần tuning đúng như trang chủ Laravel khuyến cáo, đó là căn chỉnh ulimit để nâng max open files). Performance có vẻ hứa hẹn nhưng sẽ cần được kiểm chứng.

3. Khả năng scale up rất tốt

Reverb cho phép bạn scale ra nhiều server để tăng khả năng handle connection thông qua sử dụng chung Redis server. Khi một trong các server Reverb nhận được message, nó có thể thông qua Redis để publish message đó đến toàn bộ các Reverb server khác, do đó bạn có thể scale theo chiều ngang để handle được nhiều connection hơn (Cái này khá ăn tiền, các package socket trước đó như Laravel Websocket chưa hỗ trợ việc này).

Tài liệu thêm về reverb: