.NET 𝗦𝗲𝗿𝘃𝗲𝗿 𝗦𝗶𝗱𝗲 𝗘𝘃𝗲𝗻𝘁𝘀 𝘄𝗶𝘁𝗵 𝗠𝗼𝗻𝗴𝗼𝗗𝗕 𝗖𝗵𝗮𝗻𝗴𝗲 𝗦𝘁𝗿𝗲𝗮𝗺𝘀

Bạn muốn có các cập nhật thời gian thực trong ASP.NET Core. Có thể bạn sẽ nghĩ đến WebSockets đầu tiên.

Có một cách đơn giản hơn cho các dashboard và feed. Bạn có thể sử dụng MongoDB Change Streams và Server-Sent Events (SSE).

Thiết lập này cung cấp khả năng truyền dữ liệu một chiều từ máy chủ đến máy khách với rất ít mã nguồn.

Cách thức hoạt động:

  • MongoDB Change Streams phát hiện các thay đổi trong cơ sở dữ liệu ngay lập tức.
  • SSE đẩy các thay đổi đó đến trình duyệt thông qua một kết nối HTTP duy nhất.
  • Bạn tránh được việc phải polling liên tục, giúp tiết kiệm tài nguyên máy chủ.

SSE là một API trình duyệt gốc. Nó hoạt động thông qua một phản hồi HTTP duy trì lâu dài và hỗ trợ tự động kết nối lại. Nó hoàn hảo cho:

  • Dòng thời gian trực tiếp (Live timelines)
  • Thông báo (Notifications)
  • Nguồn cấp hoạt động (Activity feeds)
  • Bảng điều khiển quản trị (Admin dashboards)

Trong ASP.NET Core Minimal APIs, bạn có thể triển khai điều này bằng cách sử dụng TypedResults.ServerSentEvents.

Luồng mã nguồn tuân theo các bước sau:

  1. Ứng dụng của bạn mở một change stream cursor trong MongoDB.
  2. MongoDB phát ra các sự kiện khi dữ liệu thay đổi.
  3. Ứng dụng của bạn ánh xạ các thay đổi này tới máy khách.

Một lợi thế lớn là khả năng tiếp tục (resume) các luồng dữ liệu. MongoDB cung cấp một resume token cho mỗi thay đổi. Bạn có thể truyền token này thông qua header Last-Event-ID. Khi trình duyệt kết nối lại, nó sẽ gửi ID cuối cùng mà nó đã thấy. Ứng dụng của bạn sẽ đọc ID này và yêu cầu MongoDB bắt đầu chính xác tại vị trí nó đã dừng lại.

Khi nào bạn nên sử dụng SSE thay vì SignalR?

Sử dụng SSE nếu:

  • Bạn chỉ cần các cập nhật từ máy chủ đến máy khách.
  • Bạn muốn một thiết lập nhẹ nhàng, dựa trên văn bản.
  • Bạn muốn sử dụng các API trình duyệt gốc.

Sử dụng SignalR nếu:

  • Bạn cần giao tiếp hai chiều (bi-directional).
  • Bạn cần các tính năng phức tạp như groups hoặc hubs.
  • Bạn cần tự động thương lượng phương thức truyền tải (WebSockets, Long Polling).

Hãy bắt đầu với SSE cho các nguồn cấp dữ liệu trực tiếp đơn giản. Chỉ chuyển sang SignalR khi ứng dụng của bạn yêu cầu sự tương tác phong phú hơn.

Lưu ý: MongoDB Change Streams yêu cầu một replica set hoặc một sharded cluster. Chúng không hoạt động trên một máy chủ độc lập (standalone server).

Source: https://dev.to/mongodb/net-server-side-events-with-mongodb-change-streams-5dfb

Optional learning community: https://t.me/GyaanSetuAi