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

אתם רוצים עדכונים בזמן אמת ב-ASP.NET Core. אולי הדבר הראשון שיעלה לכם בראש הוא WebSockets.

יש דרך פשוטה יותר עבור דאשבורדים ופידים. ניתן להשתמש ב-MongoDB Change Streams וב-Server-Sent Events (SSE).

הגדרה זו מספקת סטרימינג חד-כיווני מהשרת שלכם ללקוח (client) עם מעט מאוד קוד.

איך זה עובד:

  • MongoDB Change Streams מזהים שינויים במסד הנתונים באופן מיידי.
  • SSE דוחף את השינויים הללו לדפדפן דרך חיבור HTTP יחיד.
  • אתם נמנעים מ-polling קבוע, מה שחוסך במשאבי שרת.

SSE הוא API מובנה של הדפדפן. הוא עובד באמצעות תגובת HTTP ארוכת טווח ותומך בחיבור מחדש (reconnects) אוטומטי. הוא מושלם עבור:

  • ציר זמן חי (Live timelines)
  • התראות
  • פידים של פעילות
  • דאשבורדים למנהל מערכת

ב-ASP.NET Core Minimal APIs, ניתן לממש זאת באמצעות TypedResults.ServerSentEvents.

זרימת הקוד פועלת לפי השלבים הבאים:

  1. האפליקציה שלכם פותחת cursor של change stream ב-MongoDB.
  2. MongoDB משחררת אירועים (events) כאשר הנתונים משתנים.
  3. האפליקציה שלכם ממפה את השינויים הללו ללקוח.

יתרון מרכזי אחד הוא היכולת להמשיך סטרימים (resume streams). MongoDB מספקת resume token עבור כל שינוי. ניתן להעביר את ה-token הזה דרך ה-header ‏Last-Event-ID. כאשר דפדפן מתחבר מחדש, הוא שולח את ה-ID האחרון שהוא ראה. האפליקציה שלכם קוראת את ה-ID הזה ואומרת ל-MongoDB להתחיל בדיוק מהנקודה שבה היא הפסיקה.

מתי כדאי להשתמש ב-SSE לעומת SignalR?

השתמשו ב-SSE אם:

  • אתם זקוקים רק לעדכונים משרת ללקוח.
  • אתם רוצים הגדרה קלה (lightweight) מבוססת טקסט.
  • אתם רוצים להשתמש ב-APIs מובנים של הדפדפן.

השתמשו ב-SignalR אם:

  • אתם זקוקים לתקשורת דו-כיוונית (bi-directional).
  • אתם זקוקים לתכונות מורכבות כמו קבוצות (groups) או hubs.
  • אתם זקוקים למשא ומתן אוטומטי על אמצעי התקשורת (WebSockets, Long Polling).

התחילו עם SSE עבור פידים חיים פשוטים. עברו ל-SignalR רק כאשר האפליקציה שלכם דורשת אינטראקציה עשירה יותר.

הערה: MongoDB Change Streams דורשים replica set או sharded cluster. הם אינם עובדים על שרת standalone.

מקור: https://dev.to/mongodb/net-server-side-events-with-mongodb-change-streams-5dfb

קהילת למידה אופציונלית: https://t.me/GyaanSetuAi