Triển khai server Pusher bằng Poxa để làm realtime miễn phí

Bài toán Realtime

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.

Triển khai Poxa thay thế Pusher

À 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

Cài đặt

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
alt text

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é.

Demo

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é.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Thế Huy

9 bài viết.
39 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
30 8
Hi cả nhà, đây là bài viết đầu tiên của mình trên Kipalog nên có gì không hay mong các bạn thông cảm :D Realtime là gì ? Như chúng ta đều đã biế...
Nguyễn Thế Huy viết gần 2 năm trước
30 8
White
27 5
Xin chào mọi người :D Trong bài viết này mình sẽ trình bày một cách cơ bản để ứng dụng kỹ thuật Http Live Streaming (HLS) để play video trên web, ...
Nguyễn Thế Huy viết hơn 1 năm trước
27 5
White
21 4
Bài toán Machine Learning và những ứng dụng của nó đang ngày càng trở nên nổi bật trong những năm trở lại đây. Với sự phát triển thần tốc của cấu ...
Nguyễn Thế Huy viết 6 tháng trước
21 4
Bài viết liên quan
White
30 8
Hi cả nhà, đây là bài viết đầu tiên của mình trên Kipalog nên có gì không hay mong các bạn thông cảm :D Realtime là gì ? Như chúng ta đều đã biế...
Nguyễn Thế Huy viết gần 2 năm trước
30 8
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
39 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!