Thắc mắc về WebSocket và RESTful

Hi mọi người cho mình hỏi tí về 2 thằng này

  1. Mình thấy websocket truyền gửi dữ liệu realtime hơn thằng rest vậy tại sao không dùng luôn websocket để thay thế cho thằng rest
  2. Mình thấy websocket nó sẽ luôn giữ 1 cái connection giữa client và server trong suốt thời gian truy cập. Vậy số lượng connection mà thằng socket tạo ra có bị giới hạn không, nếu có vậy ví dụ một website mà mình đưa ứng dụng chat vào như messenger chẳng hạn. Gỉa sử cùng lúc số lượng người dùng chat vượt quá số lượng connect của socket thì xử lý như thế nào vậy mọi người ?
5 Likes

Có một tiệm bách khóa lớn có phục vụ giao hàng
giao một thùng bia thì họ chạy xe máy đi giao, mỗi ngày cũng tầm 100 thùng lẻ, họ phải đi tới 100 lần
nếu có người đặt 100 thùng thì họ lấy xe tải đi giao

vậy hỏi, một chiếc xe tải vẫn chở được 1 thùng đó thôi, tại sao khi giao 1 thùng họ không giao luôn xe tải mà lại dùng xe máy để giao?

8 Likes

oke bạn, ví dụ của bạn làm mình dễ hiểu hơn ấy chứ :v

Mình xin giải đáp 2 câu hỏi của bạn như sau:

  1. WebSocket đúng là realtime hơn rest, nhưng rest vẫn dễ dùng hơn WebSocket. Đối với nhiều API cần sự đơn giản, tiện dụng, không nhất thiết phải realtime hay chỉ cần dùng theo mô hình:
Client --> Server --> Trả kết quả về cho client

thì họ vẫn thích dùng rest. Trong trường hợp cần realtime thì họ sẽ dùng WebSocket

  1. Con số connection tối đa thực chất được dựa vào phần cứng và băng thông của server.
6 Likes

à vậy nếu cùng lúc số connection đã dùng hết thì mình nên xử lý thế nào bạn, ví dụ số lượng connection là 65355 thì người dùng thứ 65356 phải chờ 1 khoảng thời gian để check xem connect nào đã được ngắt thì mới tới họ hay sao bạn ?

À khoan, đọc kĩ lại thì con số 65355 kia chỉ là đối với “hầu hết” thôi. Nghĩa là con số connection tối đa có thể vượt trên con số đó. Theo một bình luận mình đọc được trên Stack OverFlow thì con số connection tối đa nó sẽ phụ thuộc vào phần cứng và băng thông của server. Đối với Zalo hay Messenger thì họ có hệ thống server cực kì khủng rồi nên không phải lo :V. À cái bình luận đó đây:

1 Like

oke, cảm ơn bạn nha :v

Nói tới đây, tớ nghĩ là cậu hiểu vấn đề lớn của WebSocket rồi. Nó khá khó để scale.

Ngoài ra:

  • Connection sẽ giữ resource (connection process ở server) trong thời gian dài (mà đa số thời gian là chờ), đồng nghĩa với 1 lượt phục vụ sẽ tốn kém hơn ở server side
  • Đa số các request không cần giữ thành session, nên việc giữ connection giữa client và server là không cần thiết trong đa số TH.
    Trong thiểu số các request cần lưu trữ session, cậu có cách khác đỡ tốn kém hơn để giải quyết việc đó.
  • Server websocket thường cần spec rất cao (giữ connection đồng nghĩa với việc CPU cũng bận hơn).

nên cậu không nên dùng Web socket thay cho Rest :smiley: 2 cái đó phục vụ cho 2 mục đích khác nhau.

Rest dễ scale hơn, dễ implement/setup infra hơn, dễ cache hơn, phục vụ được nhiều hơn so với web socket.

7 Likes

65535 (lý thuyết) là số lượng socket server mở để listen thôi, không giống với câu hỏi cho lắm

bạn ấy hỏi 1 cái socket được mở thì có tối đa bao nhiêu client có thể kết nối đồng thời tới socket server mà bạn ấy đã mở
cái này phụ thuộc vào hệ điều hành, thông thường nó rất lớn không tới mức phải quan tâm tới.

4 Likes

À tại mình không đọc kĩ. Mình edit lại rồi nha.

mình thấy các ứng dụng chat, hoặc cache thường dùng với websocket. Với ứng dụng chat chẳng hạn như messenger trên facebook ấy, khi user1 truy cập FB rồi nhắn tin với ai đó, lúc này sẽ tạo socket đến user2 để truyền nhận dữ liệu rồi khi tắt khung chat thì cũng ngắt socket luôn đúng ko bạn :v

với ứng dụng chat bt nó chỉ mở 1 port để listen client thôi chứ, nên bao nhiêu client connect cũng đc miễn là ram đủ. Còn bt thì 1 máy có thể mở 65355 cổng. Như rest thì bt server cũng listen cổng 80

1 Like

Hi @LuuPhat,
Sorry cậu, tớ miss cậu hỏi này.
Disclaimer: Tớ không familiar lắm với implementation của facebook, nên đây chỉ là phán đoán của tớ, dựa trên 1 số bằng chứng tớ quan sát được. Correct me if I am wrong!

Về cơ bản, khi user truy cập facebook, tớ nghĩ websocket đã được tạo lúc này (đó là lý do cậu có notification khi ai đó gửi tin nhắn cho cậu - in realtime manner).
Khi cậu tắt khung chat, websocket tớ nghĩ vẫn được mở (thế nên cậu mới nhận được notification như ở trên).
Cá nhân tớ không rõ khi nào websocket được tắt, nhưng khi cậu tắt tất cả tab facebook và không có plugin/không accept notification popup từ facebook trên browser, tớ nghĩ khi đó websocket sẽ được tắt đi.

Hope it helps!

4 Likes

oke cảm ơn nhiều nha :v

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?