thắc mắc Cách để user lấy real time data từ server hiệu quả nhất

halasatthu9x

Senior Member
Hello ae đồng đạo,

Cho mình hỏi xíu, hiện tại mình có đang làm 2 dự án web nhỏ (Python - Django - Flask). Dự án này có 1 phần chức năng yêu cầu user phải get data real-time từ server liên tục để hiển thị trên UI. Hiện tại mình đang sử dụng call api chay từ phía user, mỗi 1s 1 lần, 10 user là 10 call mỗi giây, 1000 user là 1000 call api mỗi giây để update dữ liệu real time.

Tự nhận thấy cách làm này khá ko hiệu quả cho perfomance lắm, mong ae chỉ giáo hướng dẫn cách làm khác hiệu quả hơn và dễ migrate sang nó nhất.

Mình cảm ơn ạ !
 
Thím đang xài short polling rồi, thử chuyển qua long polling, websocket hoặc server-sent event xem sao.

Edit: Websocket cá nhân em thấy hơi dư thừa trong tình huống này nha thím, do mình chỉ cần truyền dữ liệu 1 chiều.
 
Hello ae đồng đạo,

Cho mình hỏi xíu, hiện tại mình có đang làm 2 dự án web nhỏ (Python - Django - Flask). Dự án này có 1 phần chức năng yêu cầu user phải get data real-time từ server liên tục để hiển thị trên UI. Hiện tại mình đang sử dụng call api chay từ phía user, mỗi 1s 1 lần, 10 user là 10 call mỗi giây, 1000 user là 1000 call api mỗi giây để update dữ liệu real time.

Tự nhận thấy cách làm này khá ko hiệu quả cho perfomance lắm, mong ae chỉ giáo hướng dẫn cách làm khác hiệu quả hơn và dễ migrate sang nó nhất.

Mình cảm ơn ạ !
Get 1 lần thôi, còn lại để client tự tính, mỗi phút lại cho client sync lại với server
 
Hello ae đồng đạo,

Cho mình hỏi xíu, hiện tại mình có đang làm 2 dự án web nhỏ (Python - Django - Flask). Dự án này có 1 phần chức năng yêu cầu user phải get data real-time từ server liên tục để hiển thị trên UI. Hiện tại mình đang sử dụng call api chay từ phía user, mỗi 1s 1 lần, 10 user là 10 call mỗi giây, 1000 user là 1000 call api mỗi giây để update dữ liệu real time.

Tự nhận thấy cách làm này khá ko hiệu quả cho perfomance lắm, mong ae chỉ giáo hướng dẫn cách làm khác hiệu quả hơn và dễ migrate sang nó nhất.

Mình cảm ơn ạ !
data giữa các user giống nhau hay khác nhau thế bác, nếu giống thì implement cache đi như redis chẳng hạn
 
Nếu mà thực sự cần real-time mà data 1 chiều từ server -> client thì dùng SSE Server-Sent Event cho đơn giản. WebSocket handle phức tạp lắm.
 
Hello ae đồng đạo,

Cho mình hỏi xíu, hiện tại mình có đang làm 2 dự án web nhỏ (Python - Django - Flask). Dự án này có 1 phần chức năng yêu cầu user phải get data real-time từ server liên tục để hiển thị trên UI. Hiện tại mình đang sử dụng call api chay từ phía user, mỗi 1s 1 lần, 10 user là 10 call mỗi giây, 1000 user là 1000 call api mỗi giây để update dữ liệu real time.

Tự nhận thấy cách làm này khá ko hiệu quả cho perfomance lắm, mong ae chỉ giáo hướng dẫn cách làm khác hiệu quả hơn và dễ migrate sang nó nhất.

Mình cảm ơn ạ !
Bác thử đặt 1 con caching như redis ở giữa xem. Còn update thì có thể update ở redis trc rồi sau đó update db chính sau.
 
Thank các thím nhìu
app mình xây trên nền Django, đọc qua cái docs này thấy có đoạn

Performance considerations
Django is designed for short-lived requests.
Streaming responses will tie a worker processfor the entire duration of the response. This may result in poor performance.

Chắc mình sẽ nghiên cứu option redis như các bác đề xuất
 
Thím đang xài short polling rồi, thử chuyển qua long polling, websocket hoặc server-sent event xem sao.

Edit: Websocket cá nhân em thấy hơi dư thừa trong tình huống này nha thím, do mình chỉ cần truyền dữ liệu 1 chiều.
Bác chia sẻ kỹ hơn use case cho từng technique đc ko a? Như realtime noti giống của Facebook noti thì thường mình dùng công nghệ nào vậy bác. Thank you

via theNEXTvoz for iPhone
 
Thank các thím nhìu
app mình xây trên nền Django, đọc qua cái docs này thấy có đoạn



Chắc mình sẽ nghiên cứu option redis như các bác đề xuất
code bot tới đâu rồi fen
 
Bác chia sẻ kỹ hơn use case cho từng technique đc ko a? Như realtime noti giống của Facebook noti thì thường mình dùng công nghệ nào vậy bác. Thank you

via theNEXTvoz for iPhone
Em cũng chỉ biết lý thuyết với code pet project bằng mấy cái này thôi thím ơi chứ chưa có kinh nghiệm production.

Server-Sent Event (SSE) là kiểu thím GET /events xong server cứ có data mới là trả về theo 1 format nào đó, cái request này sẽ không bao giờ kết thúc. SSE là server gửi client, chỉ 1 chiều. SSE nó có chuẩn sẵn rồi, response phải theo format chuẩn quy định. Hạn chế của nó là nếu trước đó thím xài short polling thì giờ phải sửa code để xử lý event từ server. Một hạn chế khác là binary data trong SSE cần encode mới truyền đi được, nên nếu use case của thím có liên quan truyền binary nhiều thì nó không phù hợp.

Long polling cũng là polling như thím thớt làm thôi, nhưng thay vì server respond liền thì nó sẽ giữ cái request đó lại một hồi nếu không có gì mới. Ví dụ thím GET /events lần đầu có sẵn record mới để trả về thì short polling hay long polling cũng là requets lên response về liền, nhưng mà sau đó thím gửi tiếp 1 cái request thì short polling sẽ trả lời liền là không còn gì, còn với long polling thì server sẽ vẫn giữ cái request đó lại chưa trả lời. Nếu để thời gian chờ đủ dài thì long polling nó có thể tránh được việc client hỏi đi hỏi lại hoài trong khi chưa có record nào mới. Nó cũng như SSE nhưng mà có giới hạn thời gian, request đó hết giờ thì nó gửi request khác để poll tiếp. Long polling thì được cái nó đơn giản, mình vẫn xử lý như HTTP request bình thường, chỉ thêm bước delay thôi, còn SSE phải trả về theo đúng format mà chuẩn quy định. Vậy nên nếu dùng long polling thì thím có thể không cần đổi code bên front-end mà vẫn hạn chế được số request cần xử lý.

Websocket thì thím sẽ gửi 1 GET request tới endpoint nào đó của nó, xong server nó sẽ trả lời. Phần này kêu là handshake, em bỏ qua chi tiết, thím quan tâm thì lên google tìm cái spec của nó mà đọc. Sau handshake thì 2 bên có cái socket để truyền gửi dữ liệu. Có cái kết nối này rồi thì 2 bên muốn gửi gì gửi thôi nên cái này là giao tiếp 2 chiều. Mấy cái như chat hay game thì chắc sẽ dùng cái này thường. Cái này cũng cần sửa code cả 2 phía front-end back-end, bù lại được cái nó giao tiếp 2 chiều, làm được những việc 2 cái trên không làm được.

Facebook chat xài websocket (endpoint nó là /chat), Facebook notifications hình như cũng vậy (nhưng không rõ lắm, endpoint là /realtime). Em đoán vậy vì tắt websocket đi thì không còn nhận noti được nữa.
 
Last edited:
Em cũng chỉ biết lý thuyết với code pet project bằng mấy cái này thôi thím ơi chứ chưa có kinh nghiệm production.

Server-Sent Event (SSE) là kiểu thím GET /events xong server cứ có data mới là trả về theo 1 format nào đó, cái request này sẽ không bao giờ kết thúc. SSE là server gửi client, chỉ 1 chiều. SSE nó có chuẩn sẵn rồi, response phải theo format chuẩn quy định. Hạn chế của nó là nếu trước đó thím xài short polling thì giờ phải sửa code để xử lý event từ server. Một hạn chế khác là binary data trong SSE cần encode mới truyền đi được, nên nếu use case của thím có liên quan truyền binary nhiều thì nó không phù hợp.

Long polling cũng là polling như thím thớt làm thôi, nhưng thay vì server respond liền thì nó sẽ giữ cái request đó lại một hồi nếu không có gì mới. Ví dụ thím GET /events lần đầu có sẵn record mới để trả về thì short polling hay long polling cũng là requets lên response về liền, nhưng mà sau đó thím gửi tiếp 1 cái request thì short polling sẽ trả lời liền là không còn gì, còn với long polling thì server sẽ vẫn giữ cái request đó lại chưa trả lời. Nếu để thời gian chờ đủ dài thì long polling nó có thể tránh được việc client hỏi đi hỏi lại hoài trong khi chưa có record nào mới. Nó cũng như SSE nhưng mà có giới hạn thời gian, request đó hết giờ thì nó gửi request khác để poll tiếp. Long polling thì được cái nó đơn giản, mình vẫn xử lý như HTTP request bình thường, chỉ thêm bước delay thôi, còn SSE phải trả về theo đúng format mà chuẩn quy định. Vậy nên nếu dùng long polling thì thím có thể không cần đổi code bên front-end mà vẫn hạn chế được số request cần xử lý.

Websocket thì thím sẽ gửi 1 GET request tới endpoint nào đó của nó, xong server nó sẽ trả lời. Phần này kêu là handshake, em bỏ qua chi tiết, thím quan tâm thì lên google tìm cái spec của nó mà đọc. Sau handshake thì 2 bên có cái socket để truyền gửi dữ liệu. Có cái kết nối này rồi thì 2 bên muốn gửi gì gửi thôi nên cái này là giao tiếp 2 chiều. Mấy cái như chat hay game thì chắc sẽ dùng cái này thường. Cái này cũng cần sửa code cả 2 phía front-end back-end, bù lại được cái nó giao tiếp 2 chiều, làm được những việc 2 cái trên không làm được.

Facebook chat xài websocket (endpoint nó là /chat), Facebook notifications hình như cũng vậy (nhưng không rõ lắm, endpoint là /realtime). Em đoán vậy vì tắt websocket đi thì không còn nhận noti được nữa.
Cảm ơn bác nhiều đã chia sẻ

via theNEXTvoz for iPhone
 
Webhook thì sao các bác?
Ý tưởng là server chỉ gửi dữ liều về khi và chỉ khi có sự thay đổi nào đó trên hệ thống.
 
Webhook thì sao các bác?
Ý tưởng là server chỉ gửi dữ liều về khi và chỉ khi có sự thay đổi nào đó trên hệ thống.
Webhook để server gọi client thì server cần có địa chỉ của client mới gọi được, nhưng client đâu có địa chỉ cố định đâu thím.
 
Back
Top