𝗖𝗥𝗗𝗧𝘀 𝗶𝗻 𝗞𝗼𝘁𝗹𝗶𝗻 𝗠𝘂𝗹𝘁𝗶𝗽𝗹𝗮𝘁𝗳𝗼𝗿𝗺: 𝗞𝗶𝗹𝗹 𝗬𝗼𝘂𝗿 𝗦𝘆𝗻𝗰 𝗦𝗲𝗿𝘃𝗲𝗿

اکثر تیم‌ها یک سرور مرکزی برای مدیریت تداخل‌های داده (data conflicts) می‌سازند. سرور نوشته‌ها را دریافت می‌کند، یکی را به عنوان برنده انتخاب می‌کند و امیدوار است که همه چیز خوب پیش برود. این کار یک نقطه شکست واحد (single point of failure) و کدهای پیچیده‌ای برای نگهداری ایجاد می‌کند.

انواع داده‌های تکثیرشونده بدون تداخل (CRDTs) این وضعیت را تغییر می‌دهند. هر دستگاه بدون نیاز به یک مدیریت مرکزی، به وضعیت یکسانی می‌رسد. این یک تضمین ریاضی است.

شما می‌توانید بک‌اِند همگام‌سازی خود را با یک blob storage ساده جایگزین کنید. سرور شما به یک رله (relay) تبدیل می‌شود که blobهای داده را نگه می‌دارد. سرور نیازی به درک داده‌های شما ندارد.

از این پریمیتیوها (primitives) برای اپلیکیشن‌های موبایل خود استفاده کنید:

• LWW-Register: برای پروفایل‌های کاربری و تنظیمات استفاده کنید. • G-Counter: برای تحلیل‌ها (analytics) یا تعداد بازدیدها استفاده کنید. • PN-Counter: برای موجودی انبار یا مجموع سبد خرید استفاده کنید. • OR-Set: برای تگ‌ها و علاقه‌مندی‌ها استفاده کنید.

برای اکثر اپلیکیشن‌های موبایل، LWW-Registers و OR-Sets تقریباً همه چیز را پوشش می‌دهند.

نکته پیاده‌سازی: وقتی یک LWW-Register می‌سازید، همیشه یک nodeId در نظر بگیرید. اگر دو به‌روزرسانی دقیقاً دارای یک timestamp یکسان باشند، nodeId به عنوان تعیین‌کننده نهایی (tiebreaker) عمل می‌کند. بدون این کار، دستگاه‌های شما به وضعیت یکسانی همگام نخواهند شد.

مبتنی بر وضعیت (State-based) در مقابل مبتنی بر عملیات (Operation-based):

برای موبایل، حالت State-based (CvRDT) را انتخاب کنید. این حالت در شبکه‌های ناپایدار به خوبی کار می‌کند زیرا فرآیند ادغام (merge) آن idempotent است. اگر همگام‌سازی در میانه راه شکست خورد، فقط کافی است دوباره تلاش کنید.

در مراحل اولیه از حالت Operation-based (CmRDT) دوری کنید. این حالت به تحویل دقیقاً یک‌باره (exactly-once delivery) نیاز دارد. ساخت چنین زیرساختی در شبکه‌های موبایل دشوار است و پیچیدگی‌هایی را اضافه می‌کند که می‌خواهید از آن‌ها اجتناب کنید.

معماری:

  1. منطق CRDT خود را در ماژول commonMain پروژه Kotlin Multiplatform خود بسازید.
  2. از SQLDelight برای ذخیره محلی داده‌ها استفاده کنید.
  3. blobهای داده را با سرویسی مانند S3 یا Cloud Storage همگام‌سازی کنید.
  4. بک‌اِند شما ساده و ارزان باقی می‌ماند.

از ساخت موتورهای همگام‌سازی پیچیده دست بردارید. از CRDTs استفاده کنید تا منطق را به سمت کلاینت منتقل کنید. این کار به شما اجازه می‌دهد به جای مدیریت چرخش‌های سرور (server rotations)، بر ساخت ویژگی‌های جدید تمرکز کنید.

Source: https://dev.to/software_mvp-factory/crdts-in-kotlin-multiplatform-kill-your-sync-server-28n8