پادشاهِ کُدنویسا شو!
کینگتو - آموزش برنامه نویسی تخصصصی - دات نت - سی شارپ - بانک اطلاعاتی و امنیت

MongoDB و Azure Cosmos DB چیست؟ تفاوت ها

16 بازدید 0 نظر ۱۴۰۵/۰۶/۲۶
پایگاه‌های داده سندگرا (Document Databases) بخش جدایی‌ناپذیری از معماری نرم‌افزارهای مدرن هستند. برای توسعه‌دهندگان اکوسیستم دات‌نت (.NET)، انتخاب میان MongoDB (پادشاه سنتی NoSQL) و Azure Cosmos DB (داده‌باوندری توزیع‌شده و چندالگویی مایکروسافت) یکی از تصمیمات کلیدی در سطح معماری سیستم (System Architecture) است.

نگاه کلی و فلسفه معماری

MongoDB

مونگو‌دی‌بی یک پایگاه داده NoSQL توزیع‌شده، متن‌باز (با لایسنس SSPL) و Document-oriented است که داده‌ها را در قالب BSON (Binary JSON) ذخیره می‌کند. فلسفه اصلی MongoDB ارائه انعطاف‌پذیری بالای Schema، پرس‌وجوهای پیچیده (Aggregation Pipeline) و قابلیت نصب در هر محیطی (On-Premises، Multi-Cloud یا Cloud Managed via MongoDB Atlas) است.

 

Azure Cosmos DB

کازموس‌دی‌بی پایگاه داده NoSQL ابری، کاملاً مدیریت‌شده (Fully Managed SaaS/PaaS) و بسیار توزیع‌شده مایکروسافت است. Cosmos DB بر پایه معماری چندالگویی (Multi-Model) بنا شده و APIهای مختلفی از جمله Core (SQL) API، MongoDB API، Cassandra، Gremlin و Table API را ارائه می‌دهد. تمام داده‌ها در درون موتور زیرین آن به صورت ARST (Atom-Record-Sequence-Table) ذخیره می‌شوند.

 

یکپارچگی با اکوسیستم .NET

کیفیت SDK و تجربه‌ی توسعه‌دهنده (Developer Experience) در دات‌نت، یکی از معیارهای اصلی انتخاب است.

+-----------------------------------------------------------------------+
|                         .NET Application                              |
+-----------------------------------------------------------------------+
           │                                          │
           ▼ (MongoDB.Driver)                         ▼ (Microsoft.Azure.Cosmos)
+------------------------------------+     +------------------------------------+
|            MongoDB                 |     |          Azure Cosmos DB           |
|  - BSON Mapping Attributes         |     |  - System.Text.Json Native         |
|  - Aggregation Pipeline Fluent API |     |  - LINQ Provider & SQL Syntax      |
|  - LINQ 3 Provider                 |     |  - Change Feed Processor           |
+------------------------------------+     +------------------------------------+

 

MongoDB در .NET

  • درایور رسمی: پکیج MongoDB.Driver بسیار بالغ، با سابقه و قدرتمند است.
  • پشتیبانی از LINQ: با معرفی LINQ 3 Provider در نسخه‌های اخیر درایور، نگاشت LINQ به Aggregation Pipeline بسیار دقیق‌تر و بهینه‌تر شده است.
  • نگاشت BSON: اتریبیوت‌های اختصاصی مانند [BsonId]، [BsonRepresentation] و [BsonElement] کنترل کاملی روی نحوه Serialize/Deserialize شدن Modelهای C# می‌دهند.
  • پشتیبانی از EF Core: مایکروسافت و جامعه متن‌باز پروژه‌هایی برای پشتیبانی EF Core ارائه کرده‌اند، اما استاندارد واقعی استفاده از همان IMongoCollection<T> و IMongoDatabase است.

Azure Cosmos DB در .NET

  • درایور رسمی: پکیج Microsoft.Azure.Cosmos توسط تیم Azure بهینه‌سازی شده و از سرعت فوق‌العاده‌ای (به‌ویژه در حالت Direct Mode با اتصالات TCP) برخوردار است.
  • پشتیبانی از LINQ و SQL: توسعه‌دهندگان می‌توانند هم از LINQ عبارات C# استفاده کنند و هم کوئری‌های متنی با نحو آشنای SQL بنویسند.
  • پشتیبانی از EF Core: مایکروسافت Microsoft.EntityFrameworkCore.Cosmos را رسماً توسعه می‌دهد. اگر تیم شما وابسته به الگوهای ORM مانند DbContext و Change Tracker است، Cosmos DB تجربه بسیار روان‌تری نسبت به MongoDB در EF Core ارائه می‌دهد.
  • Change Feed: ابزار Change Feed در SDK دات‌نتِ کازموس‌دی‌بی، پیاده‌سازی معماری‌های Event-Driven و الگوهایی مانند CQRS را بسیار ساده می‌سازد.

 

مقایسه فنی و ویژگی‌های کلیدی

مدل‌های همگرایی (Consistency Levels)

یکی از تفاوت‌های بنیادی این دو پایگاه داده در نحوه مدیریت تئوری CAP و همگرایی داده‌ها است:

 

ویژگی MongoDB Azure Cosmos DB
سطوح همگرایی ۲ سطح اصلی: Read Concern / Write Concern (Eventual یا Strong با Majority) ۵ سطح دقیق: Strong, Bounded Staleness, Session, Consistent Prefix, Eventual
انعطاف‌پذیری تنظیم در سطح کلاینت یا کوئری تنظیم در سطح اکانت با قابلیت اورراید در سطح درخواست
SLA همگرایی بستگی به کانفیگ زیرساخت دارد ۱۰۰٪ تضمین‌شده با SLA مالتی‌ریجن مایکروسافت

در Cosmos DB، سطح Session Consistency (حالت پیش‌فرض) گزینه‌ای عالی برای برنامه‌های دات‌نت است که ضمانت می‌کند کاربری که کدی را اجرا کرده، تغییرات خود را بلافاصله می‌بیند (Read-your-own-writes)، در حالی که برای کل سیستم هزینه Strong Consistency پرداخت نمی‌شود.

 

پارتیشن‌بندی و شاردینگ (Sharding)

  • MongoDB: برای شاردینگ نیاز به راه‌اندازی Config Servers، Mongos Routers و تعریف دقیق Shard Key دارد. نگهداری شاردها در پروژه‌های Self-hosted چالش‌های عملیاتی بالایی دارد (هرچند در MongoDB Atlas شبیه به یک سرویس کاملاً ابری مدیریت می‌شود).
  • Cosmos DB: پارتیشن‌بندی فیزیکی و منطقی کاملاً اتوماتیک است. شما فقط یک Partition Key تعیین می‌کنید؛ باقی امور (جداکننده داده‌ها، تقسیم پارتیشن‌ها با رشد حجم) بدون Downtime توسط موتور زیرین انجام می‌شود.

شاخص‌گذاری (Indexing)

  • MongoDB: شاخص‌ها (Indexes) به صورت دستی تعریف می‌شوند (Default روی _id). برای بهینه‌سازی کوئری‌ها باید Compound Indexها را دقیقاً متناسب با کوئری‌های LINQ/BSON ایجاد کنید.
  • Cosmos DB: به‌صورت پیش‌فرض تمام خصوصیات سندها (Properties) را به‌طور خودکار Automatic Index می‌زند. هرچند می‌توانید برای کاهش هزینه‌های نوشتن (RU)، پات‌های ناخواسته را در Indexing Policy استثنا کنید.

 

مقایسه کدنویسی در #C

نمونه کد MongoDB

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;

public class Order
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; } = default!;

    [BsonElement("customerId")]
    public string CustomerId { get; set; } = default!;

    [BsonElement("totalAmount")]
    public decimal TotalAmount { get; set; }

    [BsonElement("createdAt")]
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

public class OrderRepository
{
    private readonly IMongoCollection<Order> _orders;

    public OrderRepository(IMongoDatabase database)
    {
        _orders = database.GetCollection<Order>("Orders");
    }

    public async Task CreateAsync(Order order) =>
        await _orders.InsertOneAsync(order);

    public async Task<List<Order>> GetHighValueOrdersAsync(decimal threshold)
    {
        return await _orders.Find(o => o.TotalAmount > threshold)
                            .SortByDescending(o => o.CreatedAt)
                            .ToListAsync();
    }
}

نمونه کد Azure Cosmos DB (با استفاده از SDK رسمی)

using Microsoft.Azure.Cosmos;

public class Order
{
    [JsonPropertyName("id")]
    public string Id { get; set; } = Guid.NewGuid().ToString();

    [JsonPropertyName("customerId")]
    public string CustomerId { get; set; } = default!; // Partition Key

    [JsonPropertyName("totalAmount")]
    public decimal TotalAmount { me; set; }

    [JsonPropertyName("createdAt")]
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

public class CosmosOrderRepository
{
    private readonly Container _container;

    public CosmosOrderRepository(CosmosClient client, string dbName, string containerName)
    {
        _container = client.GetContainer(dbName, containerName);
    }

    public async Task CreateAsync(Order order)
    {
        // نیاز به ارسال Partition Key در هنگام نوشتن
        await _container.CreateItemAsync(order, new PartitionKey(order.CustomerId));
    }

    public async Task<List<Order>> GetCustomerOrdersAsync(string customerId)
    {
        var query = new QueryDefinition("SELECT * FROM c WHERE c.customerId = @customerId")
            .WithParameter("@customerId", customerId);

        var requestOptions = new QueryRequestOptions 
        { 
            PartitionKey = new PartitionKey(customerId) // جلوگیری از Cross-Partition Query
        };

        var results = new List<Order>();
        using var feed = _container.GetItemQueryIterator<Order>(query, requestOptions: requestOptions);
        
        while (feed.HasMoreResults)
        {
            var response = await feed.ReadNextAsync();
            results.AddRange(response);
        }

        return results;
    }
}

۵. مقایسه مدل هزینه‌ای و عملیاتی (Pricing & Operations)

یک تفاوت بحرانی برای تصمیم‌گیری معماری، نحوه محاسبه قیمت و گزینه‌های میزبانی است.

 

مدل هزینه MongoDB

  • Self-Hosted: رایگان (Open Source)، اما هزینه سرور، زیرساخت، Backup و تیم DevOps به عهده شماست.
  • MongoDB Atlas (Cloud): براساس منابع سرور (RAM / vCPU / Storage) در ساعت محاسبه می‌شود. مدل پرداخت متناسب با پروژه‌های سنتی (Server-based) است و حدس زدن هزینه‌ها بسیار ساده‌تر است.

مدل هزینه Azure Cosmos DB

  • Request Units (RU/s): کازموس‌دی‌بی هزینه‌ها را بر اساس مفهوم RU محاسبه می‌کند. هر خواندن ۱ کیلوبایت داده برابر با ۱ RU و هر نوشتن ۱ کیلوبایت داده حدود ۵ RU هزینه دارد.
  • تخصیص منابع (Provisioned Throughput vs Serverless):
    • Provisioned: تعیین حداقل RU/s ثابت در ماه (پرداخت دائمی چه استفاده شود چه نشود).
    • Autoscale: مقیاس‌پذیری خودکار RU/s بر اساس ترافیک.
    • Serverless: مناسب برای ترافیک‌های ناپایدار (پرداخت دقیقاً به ازای RU مصرف‌شده).

هشدار معماری: اگر کوئری‌های دات‌نت شما Partition Key را در Cosmos DB رعایت نکنند، کوئری به صورت Cross-Partition اجرا شده و می‌تواند مصرف RU و هزینه ماهانه شما را به شدت و به صورت غیرمنتظره‌ای افزایش دهد!

جدول مقایسه جامع فنی

محور مقایسه

MongoDB

Azure Cosmos DB

نوع میزبانی

On-Premises, Any Cloud, Atlas

اختصاصی Microsoft Azure

قفل‌شدگی به فروشنده (Vendor Lock-in)

پایین (قابلیت جابه‌جایی راحت)

بالا (کاملاً وابسته به اکوسیستم Azure)

پشتیبانی از EF Core

محدود / در حال توسعه

بومی و توسط مایکروسافت پشتیبانی می‌شود

توزیع جهانی (Global Distribution)

نیاز به پیکربندی Multi-Region Replica Sets دارد

با یک کلیک (Turnkey Global Distribution)

تضمین latency و SLA

بستگی به کانفیگ زیرساخت دارد

تضمین Latency زیر ۱۰ میلی‌ثانیه برای Read/Write در سطح 99.999%

محدودیت حجم سند

۱۶ مگابایت

۲ مگابایت

APIهای چندگانه

فقط API بومی MongoDB

SQL (Core)، MongoDB API، Cassandra، Gremlin، Table

 

چه زمانی کدام‌یک را انتخاب کنیم؟

MongoDB را انتخاب کنید اگر:

  • استقلال از ابر (Cloud-Agnostic) اولویت است: پروژه شما باید روی Multi-Cloud، On-Premises یا سرورهای اختصاصی داخلى اجرا شود.
  • پیش‌بینی‌پذیری هزینه: مدل مالی براساس RAM/CPU را به مدل‌های پیچیده RU/s ترجیح می‌دهید.
  • حجم اسناد بزرگتر است: اسنادی دارید که حجم آن‌ها بین ۲ تا ۱۶ مگابایت است.
  • تیم شما مهارت بالایی در MongoDB دارد: الگوی کوئری‌ها، Indexing و Aggregation Pipeline پایگاه داده مونگو در تیم نهادینه شده است.

Azure Cosmos DB را انتخاب کنید اگر:

  • معماری پروژه تماماً مبتنی بر Azure است: استفاده از خدمات مایکروسافت مانند Azure Functions، Azure App Service و Entra ID (Azure AD).
  • نیاز به توزیع جغرافیایی با تأخیر زیر ۱۰ میلی‌ثانیه دارید: سیستم دارای کاربران جهانی است و داده‌ها باید نزدیک به کاربر فچ شوند.
  • استفاده از الگوی EF Core و Change Feed: قصد دارید از قابلیت‌های پیشرفته دات‌نت مانند EF Core و Change Feed Processor برای پیاده‌سازی معماری Event-Driven استفاده کنید.
  • نیاز به SLAهای تزلزل‌ناپذیر دارید: سازمان شما تعهدات سنگینی روی Availability و Latency دارد.

 

هر دو پایگاه داده MongoDB و Azure Cosmos DB گزینه‌هایی فوق‌العاده برای برنامه‌های مدرن دات‌نت هستند. MongoDB انعطاف‌پذیری استقرار و قدرت بالای کوئری را بدون وابستگی به یک پلتفرم ابری خاص فراهم می‌کند. در مقابل، Cosmos DB با ادغام عمیق در اکوسیستم Azure، پشتیبانی بومی از EF Core، پایداری فوق‌العاده و مقایس‌پذیری جهانی بی‌دردسر، انتخاب ایده‌آل پروژه‌های بزرگ سازمان‌یافته در Azure است.

 

لینک استاندارد شده: Qy5W

0 نظر

    هنوز نظری برای این مقاله ثبت نشده است.
جستجوی مقاله و آموزش
دوره‌ها با تخفیفات ویژه