Làm sao để một record trong database thay đổi thì frontend cũng tự update theo

Xin chào mọi người!

Ví dụ em có một trang web với 3 phần cơ bản:

  • A là frontend gồm JS, HTML.
  • B là web server run một ngôn ngữ server side bất kỳ như JS, C#, java, …
  • C là DBMS như mySQL, MSSQL, …

Có cách nào để record trong C thay đổi thì C sẽ trigger cho B biết để:

  • B sẽ execute lại câu lệnh SELECT * FROM ... từ C để update lại data.
  • hoặc khi C có thay đổi dòng nào thì C truyền luôn data vừa thay đổi đó cho B (case này hơi ngược vì trước giờ toàn là B chủ động lấy data từ C nhưng không biết có cách nào để C chủ động gửi data cho B không, nghĩa là C đổi vai trò làm client còn B đổi lại làm server)

Sau khi B có data mới thì B sẽ gửi lại cho A thông qua websocket, A nhận được thì update lại DOM.


Tác nhân làm thay đổi C có thể là:

  • Ngoài B ra thì có thể có có thêm web server D, E, F nào đó cùng dùng chung C. Khi D, E hoặc F tác động làm thay đổi đúng record trong table mà B đang dùng thì B cũng biết được là data của mình đã bị thay đổi nên gửi nó lại cho frontend.
  • Backend có cài cron job nào đó mỗi cuối tuần data từ C’ được auto chuyển sang C, trùng hợp ngay lúc này có user đang online thì data trên browser của họ cũng tự động được update theo luôn (hoặc ít nhất browser phải hiển thị message “có update vui lòng F5”).
  • DevOps mở app SQL Studio lên update record thủ công.

Nếu làm được thì em nghĩ sẽ có một khối stateful liền mạch từ C cho đến A; data được binding đồng nhất ở cả 3 “vị trí” A, B, C cho dù cả 3 ở 3 quốc gia khác nhau. Data sẽ được update realtime và tự động đồng bộ với nhau.

Nếu A, B, C là class thì sẽ có design pattern làm được VD observer nhưng không biết có design pattern nào giống obsever mà ở cấp độ system architecture không vậy mọi người.

thanks :gift_heart: :cupid: :sparkling_heart:

Theo bạn các phần mêm live chat / messenger làm như thế nào? Bạn có thể tải một phần mềm chat trên nền web được phát hành open source về mở ra xem sẽ thấy người ta giải quyết như thế nào. Nếu mình không nhớ nhầm các vấn đề bạn nêu ra đã được giải quyết từ năm 1999 rồi (khi còn dùng ActiveX, Flash, JavaApplet), khi mà khái niệm front-end, back-end như ngày nay đang hiểu chưa tồn tại. Vấn đề ở đây không phải là việc C đẩy về làm sao mà B biết mới quan trọng chứ C có thể gửi cho cả GB :smiley: và B (thực sự là ông viết code) có biết làm gì với cái đó hay không. Còn A thì nếu trình duyệt không hỗ trợ là móm, nếu trình duyệt hỗ trợ sẽ không vấn đề gì.

2 Likes

Cậu có database nào cụ thể không? Hay cậu chỉ cần 1 giải pháp general?

Thường thì cậu có 1 vài giải pháp cho tình huống này:

  • Send event update từ nguồn update.
    Nếu cậu có 1 batch update record trong database C, cậu chỉ cần làm cho batch ấy gửi event update sang web server B là được.
    Kỹ thuật này khá đơn giản để cài đặt, hiệu quả, và không add thêm load vào database. Tất nhiên, cậu cũng nên tránh việc tự update manually vào database (cậu sẽ phải tự gửi event tới web server B trong TH đó).
  • Stream data change event từ database C tới một message broker nào đó.
    Thường, với mỗi loại database, sẽ có một giải pháp đặc thù để làm việc này. Nếu cậu dùng MySQL với Kafka, cậu có thể dùng MySQL Kafka connector để stream data change event.
    Cách này đặc thù với từng loại database, và nhiều khi cậu sẽ không tìm thấy giải pháp theo cách này sẵn có ở DB, nhưng cách này sẽ chỉ cần cài đặt ở 1 nơi duy nhất cho mọi nguồn thay đổi.
    Tớ cũng biết một số RDB support trigger cũng có thể implement cách này.

Từ B tới A thì chắc cậu biết cách làm rồi ha :smile:

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