Scale Socket.IO với Redis và HAProxy – Bài giới thiệu

Nguồn cảm hứng nào khiến anh tuôn ra series này?

Mình đang làm cái app VoIP xài WebRTC signaling bằng Socket.IO, viết lên đây để tổng hợp sau này tham khảo lại cho nhanh, với lại cũng muốn chia sẽ cho anh em đồng đạo cách mình đang scale Socket.IO để có thể cùng nhau thảo luận, tìm ra cái hay, cái dỡ, cốt là để có cái mà chém nhau :)))

Có rất nhiều thứ liên quan không thể ba mặt một lời mà dồn nói hết trong một post được nên mình mới chia ra thành nhiều bài, mục tiêu là từ giờ đến cuối năm phải xong series để sang năm còn mần ăn các thứ khác :)))

Anh nói là cả series, vậy nó gồm những gì?

Thong thả nào, đây đây:

  1. Socket.IO là em nào? Dễ ăn không? – Socket.IO là em gái trẻ đẹp, tinh gọn và cực kì dễ xơi :)))
    Đọc xong bạn biết cách chạy cái demo của Socket.IO, coi như khởi động xí cho vui.
    Link bài: http://blog.appconus.com/2016/10/23/scale-socket-io-voi-redis-va-haproxy-bai-1-gioi-thieu-socket-io-chay-demo/

  2. Làm sao để tổ chức một đường dây gồm nhiều em Socket.IO dễ thương để phục vụ được số lượng cực lớn client
    Giới thiệu cách dùng HAProxy để cân bằng tải đến nhiều node Socket.IO, ngoài ra còn dính một xíu đến Redis nữa.
    Link bài: http://blog.appconus.com/2017/04/01/scale-socket-io-voi-redis-va-haproxy-bai-2-haproxy-load-balancing/

  3. Làm sao để đường dây vẫn hoạt động xuyên suốt trong trường hợp bị tóm thóp? – Đơn giản, sinh thêm một thóp nữa, tóm thằng này còn thằng khác :)))
    Phần này hướng dẫn bạn cách xài 2 thằng HAProxy hoạt động theo cơ chế Active/Passive để backup cho nhau.

Thông tin bên lề

Ở trên mình có nhắc tới WebRTC với signaling, chúng nó là cái gì vậy?
WebRTC là một dự án nguồn mở cung cấp các APIs để web-apps, mobile apps có thể giao tiếp thời gian thực với nhau (Gửi text, audio/video). Hiện tại thì mình đang có client bên Android với iOS, hai bên gọi nhau ngon lành cành đào. Bạn nào muốn xây dựng ứng dụng VoIP thì WebRTC cũng là một cách tiếp cận bên cạnh SIP hoặc những thứ khác. Series này mình sẽ không nói cách bạn cài đặt WebRTC như thế nào (nếu muốn tìm hiểu bạn có thể đọc bài này của thằng bạn mình), series này mình chỉ tập trung nói về signaling cho thằng WebRTC thôi.

Signaling? Cho xin thêm 500 thông tin?

Chuyện là thế này, bạn vừa gặp một em rất dễ thương ngoài phố, hên cái là bạn biết thêm nó ở cùng dãy trọ với thằng bạn thời cùng ở truồng tắm mưa. Đúng là thiên thời, địa lợi :))) Bạn nhờ thằng bạn hẹn em nó đi cafe nói chuyện chơi coi như làm quen bạn mới. Sau đó nếu bạn lại hên, có tín hiệu tốt, lần sau tự hẹn, không cần đến thằng bạn giúp nữa. Lúc này nhân cơ hội thủ tiêu nó là tốt nhất, nghe mình, đừng để nó đẻ trứng :)))

Thì WebRTC cũng tương tự, client A muốn nói chuyện với client B thì hai bên phải thông tin network của nhau để gửi gói tin peer to peer như vậy ban đầu hai bên phải connect thông qua một thằng thứ 3 để trao đổi thông tin network, thằng này gọi là signaling. Sau khi hai bên có được thông tin network của nhau, thiết lập được session thì cho thằng signaling lui, không còn nhiệm vụ nữa.

Xây dựng signaling bằng cái gì?

Để xây dựng signaling thì bạn có thể chọn bất cứ IM server hay messaging service nào, ví dụ bạn có thể tự setup một cái chat server dùng XMPP như Ejabberd, Openfire, … hoặc nếu không muốn maintain server chat thì bạn có thể dùng thẳng dịch vụ của thằng Pubnub. Còn mình thì mình xài Socket.IOscale nó trên phần cứng của mình.

Mô hình cơ bản nó như thế này:

Scale Socket.IO

Trong hình bạn có thể thấy mình đặt 3 em Socket.IO bên dưới một Floating Load Balancer, 3 em này connect với nhau thông qua anh bạn Redis Pub-Sub.
Thả thính tới đó đủ rồi, sẽ giải thích từng thứ một trong series.

Bài 1 sẽ lên sóng trong tuần này nhé, mời anh em đón đọc.
Happy coding!

Spread the love
  • 18
  •  
  •  
  •  
  •  
    18
    Shares

Leave a Reply

3 Comments on "Scale Socket.IO với Redis và HAProxy – Bài giới thiệu"

avatar
  Subscribe  
newest oldest most voted
Notify of
Cuong
Guest

cool

Anonymous
Guest

cuối tuần rồi đó nha mầy :v

Cao Quảng Bình
Admin

Rất nhiều cái cuối tuần rồi đó nha mầy :v