CRDTها: موتور پنهان اپلیکیشنهای همکاری بلادرنگ

از بومهای طراحی چندنفره Figma تا اسناد همزمان Notion، تقاضا برای اپلیکیشنهایی که امکان همکاری بیدرنگ و روان را فراهم کنند، به یک انتظار پایه تبدیل شده است. یک سند را باز میکنیم، تیم خود را دعوت میکنیم و میبینیم که نشانگرها روی صفحه حرکت میکنند و تغییرات بلافاصله برای همه نمایش داده میشود. اما پشت این تجربه که به نظر جادویی میآید، یک ساختار داده قدرتمند و ظریف نهفته است: نوع دادهٔ تکرارشوندهٔ بدون تعارض یا CRDT. این فناوری کلیدی است که تجربههای بیدرنگ، آفلاین و روان را ممکن میسازد؛ تجربههایی که اکنون آنها را بدیهی میدانیم. برای توسعهدهندگانی که نسل بعدی نرمافزارها را میسازند، درک CRDTها دیگر یک گزینه نیست، بلکه یک ضرورت است.
CRDT دقیقاً چیست؟
CRDT در هستهٔ خود یک ساختار داده است که میتواند در چندین کامپیوتر در یک شبکه تکثیر شود. هر کپی بهطور مستقل و همزمان، بدون نیاز به یک سرور متمرکز برای هماهنگی، بهروزرسانی میشود. جادوی آن در نامش نهفته است: «بدون تعارض». CRDTها با پایهای ریاضی طراحی شدهاند که تضمین میکند همهٔ کپیها در نهایت به یک حالت واحد میرسند، بدون از دست رفتن داده یا نیاز به کدهای پیچیده و خطاپذیر برای حل تعارض. این اصل «سازگاری نهایی قوی» نام دارد. یعنی حتی اگر کاربران آفلاین باشند یا شبکه کند باشد، تغییرات آنها نهایتاً بهطور کامل با بقیه ادغام میشود.
چگونه کار میکند: داستان دو رویکرد
اگرچه علوم کامپیوتر پشت CRDTها عمیق است، پیادهسازی آنها معمولاً از دو الگوی اصلی پیروی میکند. درک این الگوها در سطح بالا نشان میدهد که چرا این ساختارها اینقدر مقاوم هستند.
1. CRDTهای مبتنی بر حالت (CvRDT): این رویکرد را بهعنوان «ارسال کل تصویر» در نظر بگیرید. هر کپی بهطور دورهای کل حالت محلی خود را به کپیهای دیگر میفرستد. کپی دریافتکننده یک تابع ادغام از پیش تعریفشده، انجمنی و وابسته به خود دارد که حالت خود را با حالت دریافتی ترکیب میکند. این روش مقاوم است و حتی اگر برخی پیامها گم شوند، همگرایی تضمین میشود، زیرا همگامسازی بعدی حالت کامل، ناهماهنگیها را اصلاح میکند.
2. CRDTهای مبتنی بر عملیات (CmRDT): این رویکرد «فقط تغییرات را بفرست» است. بهجای حالت کامل، فقط عملیات خاص (مانند درج متن یا حذف یک شیء) به کپیهای دیگر ارسال میشود. این روش از نظر شبکه کارآمدتر است، اما به یک لایه ارتباطی نیاز دارد که تضمین کند همهٔ عملیاتها نهایتاً به همهٔ کپیها تحویل داده میشود، بدون تکرار.
CRDTها در دنیای واقعی: رایجتر از آنچه فکر میکنید
CRDTها که زمانی یک مفهوم آکادمیک بودند، اکنون ستون فقرات بسیاری از اپلیکیشنهایی هستند که روزانه استفاده میکنید:
- Figma و Notion: این پیشگامان نرمافزارهای مشارکتی از CRDTها استفاده میکنند تا چندین کاربر بتوانند همزمان اسناد و طرحهای پیچیده را ویرایش کنند.
- Apple iCloud: سرویسهایی مانند Notes و Reminders احتمالاً از CRDTها برای همگامسازی مطمئن دادهها در آیفون، آیپد و مک کاربر استفاده میکنند، حتی زمانی که برخی دستگاهها آفلاین هستند.
- Redis Enterprise: فروشگاه دادههای درونحافظهای محبوب از CRDTها برای ساخت اپلیکیشنهای توزیعشده جغرافیایی که نیاز به تأخیر کم و دسترسی بالا دارند، پشتیبانی میکند.
- Zed و Atom: ویرایشگر کد Zed از ابتدا با پشتیبانی از همکاری با CRDTها ساخته شده است و پلاگین Teletype برای Atom قابلیت برنامهنویسی دونفره مبتنی بر CRDT را به بسیاری از توسعهدهندگان ارائه داد.
مبادلات: چرا CRDTها همهجا نیستند؟
اگر CRDTها اینقدر قدرتمند هستند، چرا همهٔ اپلیکیشنها با آنها ساخته نمیشوند؟ آنها مبادلات خاصی دارند که آنها را برای برخی موارد استفاده نامناسب میکند.
چالش اصلی این است که CRDTها نمیتوانند بهراحتی ناورداهای سراسری و دقیق را اعمال کنند. بهعنوان مثال، نمیتوان یک سیستم بانکی را صرفاً بر پایهٔ مدل CRDT ساخت، زیرا نمیتوان تضمین کرد که موجودی حساب حتی برای لحظهای در همهٔ کپیها منفی ظاهر نشود. آنها سازگار نهایی هستند، نه سازگار فوری یا دقیق. علاوه بر این، برای مدیریت ادغام بدون تعارض، CRDTها اغلب در طول زمان فرادادههایی جمع میکنند (مانند tombstone برای آیتمهای حذفشده) که در صورت عدم مدیریت دقیق، میتواند به افزایش حافظه و سربار ذخیرهسازی منجر شود.
نکات عملی برای توسعهدهندگان
برای تیمهای مهندسی، تصمیم به استفاده از CRDTها به یک انتخاب معماری مهم تبدیل میشود. در اینجا مواردی است که باید در نظر بگیرید:
- تجربه کاربری را اولویت دهید: اگر اپلیکیشن شما نیاز به همکاری چندکاربرهٔ بلادرنگ و قابلیت آفلاین قوی دارد، CRDTها باید یک کاندیدای اصلی باشند. پیچیدگی توسعه اغلب به خاطر تجربهٔ روان کاربری که ایجاد میکند، ارزش دارد.
- چرخ را دوباره اختراع نکنید: این حوزه بهطور قابل توجهی بالغ شده است. چندین کتابخانهٔ متنباز عالی مانند Yjs (جاوااسکریپت)، Automerge (جاوااسکریپت، راست) و Loro پیادهسازیهایCRDT آزمایششده را ارائه میدهند و به شما اجازه میدهند روی منطق اپلیکیشن خود تمرکز کنید، نه روی ساختارهای دادهٔ اصلی.
- معماری محلی-اول را بپذیرید: CRDTها یکی از ارکان جنبش نرمافزار «محلی-اول» هستند که معتقد است اپلیکیشنها باید به همان خوبی که آنلاین کار میکنند، آفلاین هم کار کنند. با ذخیره و پردازش دادهها ابتدا روی دستگاه کاربر، تجربههای کاربری سریعتر، مقاومتر و خصوصیتری ایجاد میکنید.
CRDTها یک تغییر بنیادین در نحوه ساخت سیستمهای توزیعشده هستند. با انتقال حل تعارض به خود ساختار داده، آنها دستهٔ جدیدی از اپلیکیشنها را باز میکنند که مقاومتر، مقیاسپذیرتر و لذتبخشتر هستند. آنها موتور پنهان هستند و وقت آن رسیده که توسعهدهندگان بیشتری یاد بگیرند چگونه از آن رانندگی کنند.