مسئله: فایل لپتاپ و گوشی کاربر را حتی با اینترنت قطعووصلی همگام نگه داریم. خودِ فایل ممکن است چند گیگابایت باشد، اما نام فایل، نسخه و پوشهها اطلاعات کوچکی هستند؛ این دو نوع داده را نباید یکجور پردازش کنیم.
طراحی
- کلاینت فایل را chunk میکند و hash هر chunk را میفرستد؛ سرور فقط chunkهای نداشته را با upload multipart مستقیم به object storage میگیرد.
- metadata شامل file_id، parent، version، manifest chunkها و ownership در DB تراکنشی است؛ commit نسخه جدید با optimistic concurrency روی revision انجام میشود.
- deduplication با content hash ممکن است، اما حمله confirmation و حریم خصوصی را بررسی کن؛ encryption و domain dedup باید سیاست روشن داشته باشد.
- کلاینتها با change feed/cursor تغییرات را میگیرند؛ push notification فقط خبر بیدارباش است، منبع حقیقت نیست.
تعارض و بازیابی
اگر revision محلی با revision سرور فرق داشت، متنهای قابل merge میتوانند three-way merge شوند؛ برای فایل باینری معمولاً conflict copy امنتر است. حذف را tombstone/versioned delete نگه دار تا sync دیررس فایل را بیدلیل باززنده نکند. GC chunk فقط بعد از اطمینان از نبود reference و گذشت retention انجام میشود.
به زبان ساده
همگامسازی فایل یعنی جدایی متادیتا از محتوا: فایل به قطعات هشدار میشکند، فقط قطعههای نداشته آپلود میشوند و سرور متادیتا با نسخه (revision) حقیقت را نگه میدارد.
مثال واقعی
وقتی یک پاراگراف به فایل ۲گیگی اضافه میکنی، فقط همان یک قطعه تغییرکرده آپلود میشود نه کل فایل — هش هر قطعه مثل اثرانگشتش است.