Convex چیست؟ پایگاه داده بلادرنگ برای اپلیکیشن‌های مدرن

امیر رضایی ۱۰ دقیقه مطالعه

Convex چیست؟ پایگاه داده بلادرنگ برای اپلیکیشن‌های مدرن

مدل واکنشی به چه معناست، چرا کد همگام‌سازی حذف می‌شود و چه زمانی Convex انتخاب درستی است — و چه زمانی نیست.

در معماری‌های سنتی، هر تغییر در سرور نیاز به یک مسیر دستی برای رسیدن به مرورگر دارد: یک API بسازید، در کلاینت آن را صدا بزنید، کش را بی‌اعتبار کنید، دوباره fetch کنید. Convex این مسیر را حذف می‌کند.

مدل ذهنی ساده

سه نوع تابع در Convex دارید و تفاوت‌شان مهم است:

  • Query: داده را می‌خواند و به‌صورت خودکار به‌روز می‌ماند. نمی‌تواند چیزی بنویسد.
  • Mutation: داده را تغییر می‌دهد و به‌صورت تراکنشی اجرا می‌شود؛ یا کل تغییرات اعمال می‌شود یا هیچ‌کدام.
  • Action: برای کارهای بیرونی مثل فراخوانی API دیگر یا ارسال ایمیل. تراکنشی نیست و می‌تواند زمان‌بر باشد.

وقتی یک mutation داده را تغییر می‌دهد، همه query هایی که آن داده را خوانده‌اند خودشان دوباره اجرا می‌شوند. شما هیچ‌کد همگام‌سازی نمی‌نویسید.

export const list = query({
  args: {},
  handler: async (ctx) => {
    return await ctx.db.query("products").take(20);
  },
});

export const add = mutation({
  args: { name: v.string() },
  handler: async (ctx, args) => {
    return await ctx.db.insert("products", { name: args.name });
  },
});

در سمت کلاینت فقط useQuery را صدا می‌زنید. بعد از اجرای add، فهرست محصولات بدون هیچ کد اضافه‌ای به‌روز می‌شود.

چرا این مهم است

در یک فروشگاه، سبد خرید، موجودی و وضعیت سفارش همیشه به‌روز است؛ بدون کد همگام‌سازی دستی و بدون مدیریت کش سمت کلاینت. همین موضوع در پنل مدیریت هم به کار می‌آید: وقتی سفارشی ثبت می‌شود، فهرست سفارش‌ها و آمار داشبورد خودشان تازه می‌شوند.

در عمل این یعنی حجم زیادی از کد حذف می‌شود — کدی که در پروژه‌های معمولی بیشترین باگ را تولید می‌کند، چون همان منطق در چند جا تکرار شده است.

امنیت

توابع سرور در محیطی جدا اجرا می‌شوند و کلیدهای حساس هرگز به مرورگر نمی‌روند. دسترسی هر تابع را می‌توانید با بررسی هویت کاربر کنترل کنید. الگوی درست این است که کنترل دسترسی را در خود تابع سرور بگذارید، نه در رابط کاربری:

const user = await getCurrentUser(ctx);
if (!user || user.role !== "admin") throw new Error("دسترسی ندارید");

پنهان‌کردن دکمه در رابط کاربری، امنیت نیست؛ فقط تجربه کاربری است.

چه زمانی انتخاب خوبی است

  • محصولاتی که به به‌روزرسانی زنده نیاز دارند: چت، پنل، داشبورد، فروشگاه
  • تیم‌های کوچکی که می‌خواهند بک‌اند را سریع نگه دارند و زیرساخت را خودشان مدیریت نکنند
  • پروژه‌هایی که می‌خواهند بدون نوشتن لایه API، از تایپ‌های مشترک بین سرور و کلاینت استفاده کنند
  • کارهایی با منطق تجاری حساس به تراکنش، مثل برداشت از کیف پول یا کاهش موجودی

چه زمانی انتخاب مناسبی نیست

  • وقتی داده در جای دیگری زندگی می‌کند و شما فقط پوسته می‌خواهید
  • اگر تیم شما به‌شدت روی پایگاه داده‌های رابطه‌ای و کوئری‌های پیچیده SQL سرمایه‌گذاری کرده است
  • پروژه‌هایی که قوانین سازمانی، میزبانی کاملاً داخلی را اجباری می‌کنند

انتخاب ابزار، انتخاب تعادل است. Convex سرعت توسعه و سادگی همگام‌سازی می‌دهد؛ در عوض شما مدل ذهنی واکنشی آن را می‌پذیرید.

جمع‌بندی

اگر مدل واکنشی را بپذیرید، حجم زیادی کد همگام‌سازی از پروژه‌تان حذف می‌شود و باگ‌هایی که از داده قدیمی می‌آیند از بین می‌روند. برای دیدن یک پیاده‌سازی کامل، پروژه آماده فروشگاهی React + Convex همان معماری را در قالب یک فروشگاه واقعی با سبد خرید و پنل مدیریت نشان می‌دهد.

مقاله‌های بیشتر