Rails 5: ActionCable và Demo

Hi all,

Đã lâu không gặp, hôm nay mình xin trở lại với một bài nóng hổi, đó chính là Action Cable của Rails 5. Hiện tại Rails 5 đã có bản beta khá ổn và chức năng Action Cable cũng hoạt động khá trơn tru. Vì vậy mình xin trình bày về nó và một demo do mình tự chế (khá bựa nhưng hoạt động cũng khá ổn).

Từ các version trước của Rails việc Realtime khá vất vả với Rails (xin được nhắc lại là vất vả chứ không hề khó)

ActionCable là chức năng cung cấp cơ chế để bạn đưa Rails app hoặc một phần nào của app có thể thực thi được tính năng Realtime thông qua công nghệ WebSocket với phần hỗ trợ ở client là code Javascript và phần server là Ruby. Vì được tích hợp vào Rails nên bạn hoàn toàn có thể xử lý các truy vấn đến CSDL một cách tuỳ thích.

Để hiểu rõ hơn bạn có thể xem qua tài liệu tại đây

Hôm nay chúng ta sẽ xem một demo mình thực hiện để hiểu rõ hơn về ActionCable.

Mình thực hiện tải demo chuẩn của DHH tại đây

OK. Sau khi chúng ta đã clone được repo về.

Mở repo này lên chúng ta sẽ thấy thêm thư mục channel, đây chính là thư mục chứa các xử lý với action cable.

Tuy nhiên cùng điểm qua một vài lưu ý khi các bạn muốn tạo 1 chức năng Realtime với ActionCable nào.

Về nguyên tắc ActionCable chạy trên 1 server riêng và sử dụng công nghệ Websocket để thực thi, vì vậy chúng ta cần chú ý cài:

  • Redis (để có thể cung cấp cơ chế Pub/Sub vì ActionCable sử dụng nó)

  • Sử dụng 1 Rack-Server hỗ trợ ActionCable (trong ví dụ sử dụng Puma, tuy nhiên hiện tại Passenger 5.0 đã hỗ trợ).

  • Rails 5 (* hiển nhiên là phải cài rồi) 😀 .

 

Nói về phần demo của mình, đơn giản là rất nhiều ứng dụng đang thực hiện demo làm 1 server chát chit realtime. Tuy nhiên mình sẽ làm khác 1 xíu, đó là thực hiện Near-Realtime với video, đơn giản có thể hiểu như sau:

  • Mình là máy chủ muốn viết 1 page có thể chia sẻ video từ Webcam laptop của mình cho nhiều người khác cùng xem sử dụng ActionCable, vậy có được không?

Tất nhiên mình vừa dùng từ Near-Realtime phía trên kia vì với Video thì dung lượng rất lớn nên mình chọn 1 cách khá đơn giản để làm là update near-realtime các bức hình cho người xem khác.

  • Vậy chúng ta cần chuẩn bị gì?
  1. Page chính share Webcamlaptop
  2. Xử lý gởi hình ảnh lên server.
  3. Một vài xử lý trên Rails app server.
  4. Xử lý websocket cập nhật cho các client.

Ở bước 1 khi mình xử lý xong việc share, một điểm mình lưu ý ở đây là các bạn có thể gởi theo 2 cách lên server như sau, chuyển bức hình thành Base64 rồi đẩy Base64 xuống lại client, tuy nhiên với bức hình khoảng 600 KB việc này mình đã trải qua và thấy vô cùng thảm khốc. (15s để bắn lên và 15s để render xuống), việc này làm cho ứng dụng mất tính thiết thực.

Vì vậy mình quyết định thực hiện chuyển đống dữ liệu thành Blob và send về Server, Sau đó Server lưu lại bức hình và gởi lại tên file mới cho phía client để hiển thị).

Đơn giản là vậy thôi.

Sau đây các bạn có thể xem qua video mình quay lại.

Các bạn có thể tham khảo code ứng dụng tại đây.

P/s: Việc ứng dụng Realtime cho video theo mình là rất tốn kém về tài nguyên máy, bản thân cho rằng việc sử dụng TCP cho việc này là chưa hợp lý, vì vậy cần cách tích hợp UDP vào rails app để thực hiện việc này, tuy nhiên đây là một demo nho nhỏ để ta có thể thấy việc ActionCable làm được điều gì trong tương lai.

Thân,

 

Tiến An

Admin tại RubySG.com

You may also like...