تراکنش درست روی آبجکت استوریج، بدون هماهنگکننده
خلاصهٔ کاملتر
نویسنده اول سراغ همون چند پرایمیتیو سادهای میره که همهٔ آبجکت استوریجهای رایج میدن. سمت نوشتن، PUT معمولی اتمیکه ولی جلوی ریس رو نمیگیره؛ یعنی دو نویسنده میتونن روی یه مسیر بنویسن و معلوم نیست کدوم برنده میشه. برای هماهنگی، PUT If-None-Match (فقط اگه فایل نباشه) و PUT If-Match (فقط اگه هش محتوا با چیزی که فرستادی یکی باشه) هستن که همون compare-and-set روی متادیتای استوریجان.
سمت خوندن، GET یه اسنپشات کامل و سازگار میده و هیچوقت نوشتن نیمهکاره نمیبینی. GET If-None-Match هم اگه دادهٔ کششده تغییر نکرده باشه سریع 304 برمیگردونه، حدود دو تا سه برابر سریعتر و روی S3 نزدیک ۱۰ میلیثانیه p50. نکتهٔ هزینهای مهم اینه که نوشتن شرطی و معمولی یه اندازه خرج دارن، ولی LIST نزدیک ۱۲ برابر GET آب میخوره، پس ارزون نیست که مدام لیست بگیری.
بعد سه پروتکل رو پشت سر هم میسازه. پروتکل «پایه» هر نوشتن رو مستقیم با یه PUT اتمیک میفرسته؛ درسته و بعد از کرش فقط نوشتنهای تأییدشده میمونن، ولی چون لِیتِنسی آبجکت استوریج بالاست کند میشه. پروتکل «شرطی ساده» نوشتنها رو تو یه فایل جمع میکنه و هر بار etag نسخهای که دیده رو شرط میکنه؛ مشکلش اینه که هر کانفلیکت سه رفتوبرگشت خرج میده و ممکنه نویسندهٔ دوم گرسنه بمونه.
پروتکل سوم بهجای محتوا، اسم فایل رو نگهبان میکنه و هر بار شماره رو یکی جلو میبره؛ اگه فایل بعدی از قبل باشه یعنی یکی دیگه نوشته. این هم برای اسنپشات کامل داده جواب میده و هم برای بار append-only مثل WAL، و هزینهٔ کانفلیکت رو از سه رفتوبرگشت به دو تا میرسونه. سیستمهای تکنویسنده مثل SlateDB هم یه فیلد epoch داخل فایل مینویسن تا بفهمن کانفلیکت کار نویسنده بوده یا کامپکتور.
میمونه پاکسازی فایلهای قدیمی. راه سرانگشتی حذف فایلهای قدیمیتر از یه حداقل سنه، ولی امن نیست: نویسندهای که بیشتر از اون مدت استال شده میتونه برگرده و بیخبر یه شاخهٔ موازی تو دیتابیس بسازه. پیشنهاد نویسنده یه «فایل مرزی»ست که قبل از هر پاکسازی آپدیت و بعد از هر نوشتن چک میشه، و با GET If-None-Match معمولاً ارزون درمیاد. نسخهٔ فرمالیوریفایشدهٔ این پروتکلها با Fizzbee تو مخزن SlateDB موجوده.
نکات کلیدی:
- PUT If-None-Match روی نبودن فایل شرط میذاره و PUT If-Match روی هش محتوا (etag)
- روی S3 هزینهٔ LIST حدود ۱۲ برابر GET هست؛ نوشتن شرطی و معمولی هزینهٔ یکسان دارن
- پروتکل شرطی ساده سه رفتوبرگشت در هر کانفلیکت میخواد، پروتکل ترتیبی دو تا
- فیلد epoch داخل فایل مشخص میکنه کانفلیکت از نویسنده بوده یا کامپکتور و garbage collector
- فایل مرزی جلوی شاخهشدن دیتابیس توسط نویسندهٔ استالشده رو موقع پاکسازی میگیره




