رویدادهای سمت سرور .NET با MongoDB Change Streams

شما به دنبال به‌روزرسانی‌های آنی (real-time) در ASP.NET Core هستید. شاید اولین چیزی که به ذهنتان می‌رسد WebSockets باشد.

برای داشبوردها و فیدها (feeds)، راه ساده‌تری وجود دارد. می‌توانید از MongoDB Change Streams و Server-Sent Events (SSE) استفاده کنید.

این ساختار، استریمینگ یک‌طرفه از سرور به کلاینت را با کدنویسی بسیار کم فراهم می‌کند.

نحوه عملکرد:

  • MongoDB Change Streams تغییرات پایگاه داده را بلافاصله شناسایی می‌کنند.
  • SSE آن تغییرات را از طریق یک اتصال HTTP واحد به مرورگر ارسال (push) می‌کند.
  • شما از Polling مداوم جلوگیری می‌کنید که باعث صرفه‌جویی در منابع سرور می‌شود.

SSE یک API بومی در مرورگر است. این قابلیت از طریق یک پاسخ HTTP طولانی‌مدت کار می‌کند و از اتصال مجدد خودکار (automatic reconnects) پشتیبانی می‌کند. این روش برای موارد زیر عالی است:

  • تایم‌لاین‌های زنده
  • اعلان‌ها (Notifications)
  • فیدهای فعالیت (Activity feeds)
  • داشبوردهای مدیریت

در ASP.NET Core Minimal APIs، می‌توانید این قابلیت را با استفاده از TypedResults.ServerSentEvents پیاده‌سازی کنید.

جریان کد از این مراحل پیروی می‌کند:

  1. اپلیکیشن شما یک کرسر (cursor) برای change stream در MongoDB باز می‌کند.
  2. وقتی داده‌ها تغییر می‌کنند، MongoDB رویدادهایی صادر می‌کند.
  3. اپلیکیشن شما این تغییرات را به کلاینت منتقل می‌کند.

یکی از مزایای اصلی، قابلیت ادامه دادن استریم‌ها (resume streams) است. MongoDB برای هر تغییر، یک resume token ارائه می‌دهد. شما می‌توانید این توکن را از طریق هدر Last-Event-ID ارسال کنید. وقتی مرورگر دوباره متصل می‌شود، آخرین شناسه‌ای (ID) را که دریافت کرده بود ارسال می‌کند. اپلیکیشن شما این ID را می‌خواند و به MongoDB می‌گوید دقیقاً از همان جایی که قطع شده بود، شروع به کار کند.

چه زمانی باید از SSE به جای SignalR استفاده کرد؟

اگر شرایط زیر را دارید از SSE استفاده کنید:

  • فقط به به‌روزرسانی‌های سرور به کلاینت نیاز دارید.
  • به دنبال یک ساختار سبک و متن‌محور هستید.
  • می‌خواهید از APIهای بومی مرورگر استفاده کنید.

اگر شرایط زیر را دارید از SignalR استفاده کنید:

  • به ارتباط دوطرفه (bi-directional) نیاز دارید.
  • به ویژگی‌های پیچیده‌ای مانند گروه‌ها (groups) یا هاب‌ها (hubs) نیاز دارید.
  • به مذاکره خودکار پروتکل انتقال (مانند WebSockets یا Long Polling) نیاز دارید.

برای فیدهای زنده ساده، با SSE شروع کنید. تنها زمانی به سراغ SignalR بروید که اپلیکیشن شما به تعاملات پیچیده‌تری نیاز داشته باشد.

نکته: MongoDB Change Streams به یک replica set یا یک sharded cluster نیاز دارند. این قابلیت روی یک سرور مستقل (standalone) کار نمی‌کند.

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

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