Triển khai server Pusher bằng Poxa để làm realtime miễn phí
Chào các bạn, hôm nay chúng ta lại quay về với một vấn đề quen thuộc đối với các ứng dụng web (và có lẽ là cả mobile, desktop ... ) hiện đại: xử lý thời gian thực (realtime). Realtime đang ngày càng trở thành một yếu tố không thể thiếu đối với mỗi người dùng khi sử dụng ứng dụng, nâng cao trải ...
Chào các bạn, hôm nay chúng ta lại quay về với một vấn đề quen thuộc đối với các ứng dụng web (và có lẽ là cả mobile, desktop ... ) hiện đại: xử lý thời gian thực (realtime). Realtime đang ngày càng trở thành một yếu tố không thể thiếu đối với mỗi người dùng khi sử dụng ứng dụng, nâng cao trải nghiệm web và giữ chân được khách hàng. Về cơ bản, chúng ta có thể implement một ứng dụng thời gian thực theo nhiều cách khác nhau, nhưng tựu chung lại, sẽ có 2 phương án chính
- Cách 1: Tự xây dựng một server websocket. Có nhiều cách để xây dựng server này: socket.io, redis pub-sub, .... Lợi thế của phương pháp này chắc chắn là ở chi phí rẻ, quyền chỉnh sửa can thiệp server là hoàn toàn do chúng ta quyết định. Tuy nhiên chi phí rẻ đi kèm là công sức bỏ ra, độ ổn định không cao, khả năng scale, và thiếu nhiều tính năng (hoặc tốn nhiều thời gian để thực hiện).
- Cách 2: Sử dụng dịch vụ bên thứ 3: Nổi lên có thể kể để Firebase với Realtime Database (Với sự hậu thuẫn Google), Pusher (Dịch vụ server socket trung gian cực nổi tiếng hiện nay). Độ ổn định, khả năng scale và thời gian triển khai tích hợp siêu nhanh là điều không phải bàn khi sử dụng dịch vụ của các ông lớn trên. Đặc biệt là đối với các startup, khi họ cần tinh gọn nhân sự và đẩy nhanh tốc độ triển khai sản phẩm ra thị trường nhanh nhất có thể. Tuy nhiên chi phí bỏ ra không nhỏ lại chính là rào cản đối với nhiều cá nhân, hoặc startup trong giai đoạn đầu triển khai ứng dụng của mình.
Tựu chung lại, nếu tìm được một giải pháp: tích hợp nhanh, triển khai dễ, và chi phí thấp thì thật là tuyệt vời cho Realtime. Câu trả lời của mình trong bài viết này là Poxa.
À mà khoan, trước khi đọc tiếp, các bạn hãy theo dõi bài viết này của mình tại Đây. Trong bài viết trước mình cũng đã cung cấp về cách triển khai một opensource là Slanger để làm một server Pusher. Slanger rất tốt, nhưng đã lâu nó không được duy trì và cập nhật đối với các thay đổi của giao thức Pusher. Poxa đang nổi lên là một ứng cứ viên sáng giá thay thế cho tiền bối của mình.
Thế Pusher là gì, Poxa là gì thế ?
Pusher is a simple hosted API for quickly, easily and securely integrating realtime bi-directional functionality via WebSockets to web and mobile apps, or any other Internet connected device.
Nói đơn giản, pusher là một dịch vụ cloud, tạo ra một server trung gian giúp chúng ta có thể xử lý các tác vụ thời gian thực. Dữ liệu được gửi tới pusher, và pusher lại gửi nó đi tới các client đã subscribe (đăng ký) và các channel. Bạn có thể tham khảo Pusher tại: https://pusher.com
Còn Poxa ?. Poxa là một opensource được viết bằng Elixir, giúp chúng ta có thể tự dựng một server với giao thức pusher ngay trên VPS cá nhân của mình, hoàn toàn tương thích với thư viện mà Pusher cung cấp. Nói cách khác, bạn có thể chuyển ứng dụng đang xài Pusher của bạn sang Poxa chỉ bằng thay đổi config, và hoàn toàn miễn phí, rất phù hợp với các sản phẩm startup cần nhanh, rẻ đầu tiên (như đoạn đầu mình đã đề cập)
Poxa support đầy đủ private channel, presence channel, rest api cũng như webhook theo doc của Pusher các bạn nhé, thoải mái đồ chơi cho chúng ta sử dụng rồi :D
Github của poxa: https://github.com/edgurgel/poxa
Lan man nhiều rồi, đi vào cài đặt nào. Server mình sử dụng là server Ubuntu 16.04 nhé các bạn. Các distro khác cũng sẽ hoàn toàn tương tự.
Bước 1: Cài đặt Elixir và Erlang. Poxa yêu cầu Elixir tối thiếu 1.5 và Erlang 20.0. (Ngôn ngữ lập trình Elixir lại chạy trên Erlang VM nên ta cần cài cả 2) Mình khuyên các bạn nên cài Elixir 1.5 (Mặc dù thời điểm này Elixir đã ra bản 1.7). Nguyên nhân là do issue này: https://github.com/bitwalker/distillery/issues/431. (Không phải issue trên Poxa nhưng là lỗi tương tự khi mình cài đặt; và hiện tại Poxa cũng chưa có update lại). Với Elixir 1.5 chúng ta sẽ không gặp phải vấn đề này.
Install các package cần thiết đã nhé:
sudo apt-get install build-essential git wget libssl-dev libreadline-dev libncurses5-dev zlib1g-dev m4 curl wx-common libwxgtk3.0-dev autoconf
Cài thêm 1 số dependencies cho Erlang
sudo apt-get install libxml2-utils xsltproc fop unixodbc unixodbc-bin unixodbc-dev
Cài đặt Erlang
sudo apt-get install erlang
Sau đó cài asdf và các plugins của nó (asdf là công cụ quản lý phiên bản support ruby, elixir, nodejs, .... Chúng ta có thể cài đặt Elixir với phiên bản tùy ý qua công cụ này)
cd git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.3 # For Ubuntu or other linux distros echo '. $HOME/.asdf/asdf.sh' >> ~/.bashrc echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
Bạn mở một terminal mới rồi add plugin
asdf plugin-add elixir
Cài đặt Elixir
asdf install elixir 1.5.0
Nếu được yêu cầu set version cho Elixir bạn có thể chạy:
asdf global elixir 1.5.0
Xong rồi, giờ ta clone poxa về nào. Bạn có thể clone vào thư mục nào tùy ý nhé, ở đây mình clone về thư mục poxa
cd git clone https://github.com/edgurgel/poxa
Xong xuôi, chúng ta tiến hành build bản release của poxa luôn nhé (Kể từ đoạn này trở đi mình coi như thao tác trong thư mục poxa vừa được clone về)
Tải các dependencies và generate release
MIX_ENV=prod mix do deps.get, compile, release
Nếu cài đặt hệ thống hỏi thì ta cứ Y để setup thôi.
Chạy dịch vụ poxa
_build/prod/rel/poxa/bin/poxa start
Done ! Nếu bạn thấy như hình dưới thì chúng ta đã có một server Pusher miễn phí sẵn sàng hoạt động :D
Config cho Poxa
Bản hiện tại của Poxa là version 0.8.0. Các bạn truy cập file poxa.conf trong _build/prod/rel/poxa/releases/0.8.0/poxa.conf (các phiên bản khác nhau thay tên thư mục tương ứng với release)
Bạn tinh chỉnh lại các tham số, trong đó có HTTP Port, app key, app secret và app Id. Mình sẽ để lần lượt là 8080, 'huybeo', 'huybeo@123', '123456'
# HTTP port poxa.port = 8080 # Pusher app key poxa.app_key = "huybeo" # Pusher secret poxa.app_secret = "huybeo@123" # Pusher app id poxa.app_id = "123456"
Với các website đang sử dụng https, bạn cần cài đặt SSL cho Poxa. Cách làm đơn giản nhất là bạn đăng ký một cái domain và dùng letsencrypt để lấy chứng chỉ free cho domain đó, sau đó trỏ domain đó về server poxa và setup ssl như sau
# HTTPS port poxa.ssl.port = 8081 # Path to user certificate poxa.ssl.certfile = "/path/your_domain.crt" # Path to the file containing the user's private PEM-encoded key poxa.ssl.keyfile = "/path/your_domain.key"
Đổi config các bạn run: _build/prod/rel/poxa/bin/poxa restart để restart lại service nhé.
Mình đã setup sẵn một server Poxa tại địa chỉ IP:
128.199.69.252
Các bạn có thể kết nối đến với các thông số sau, ví dụ phía server side PHP dùng thư viện của Pusher
$app_id = '123456'; $app_key = 'huybeo'; $app_secret = 'huybeo@123'; $app_cluster = 'mt1'; $host = '128.199.69.252' $port = '8080' $pusher = new Pusher($app_key, $app_secret, $app_id, array('cluster' => $app_cluster, 'debug' => true), $host, $port); //trigger một sự kiện $pusher->trigger( 'my-channel', 'my-event', 'test-nhan' );
Kết nối phía client Javascript:
<html> <head> <script src="https://js.pusher.com/4.1/pusher.min.js"></script> <script> var pusher = new Pusher('huybeo', { 'wsHost': '128.199.69.252', 'wsPort': '8080', 'cluster': 'mt1', enabledTransports: ['ws', 'flash'], 'secret': 'huybeo@123', 'appId': '123456' }); //đăng ký sự kiện và nhận var channel = pusher.subscribe('my-channel'); // dùng my-channel như bên php push sang channel.bind('my-event', function(data) { // dùng my-event như bên php push qua alert(data); }); </script> </head> </html>
Nếu bạn run đoạn code PHP trên, nếu client có thể alert được dòng chữ 'test-nhan' là đã thành công nhé :D :D
Lưu ý là demo không support https bạn nhé, nghĩa là client của bạn từ web có https sẽ báo là connection refused. Mình sẽ update SSL ngay khi có thể.
Đối với website sử dụng https, các bạn chú ý tham số dưới client cần là wssPort (websocket secure)
Poxa thực sự là một giải pháp hiệu quả để triển khai nhanh (Vì tích hợp Pusher vào client JS, hoặc Mobile App đều hết sức tiện lợi), support được nhiều tính năng hay của Pusher, phù hợp với ứng dụng vừa và nhỏ (Nếu lớn mình vẫn khuyên các bạn đầu tư vào Pusher :D :D). Chúc các bạn thành công và có một hệ thống realtime nhanh gọn lẹ cho riêng mình :D. Cám ơn các bạn đã đọc bài viết của mình nhé.