ثبات احتمالی در عمل
سازگاری نهایی (EC) یک مدل است که در آن نسخه های داده ها ممکن است به طور موقت واگرا شوند، اما در نهایت بدون هماهنگی جهانی همگرا می شوند. این کلید در دسترس بودن بالا (AP by CAP) و تأخیر کم (PACELC) در صورت عدم تغییر، قوانین ادغام و ضمانت مشتری به درستی تعریف شده است.
1) چه زمانی باید EC را انتخاب کنید (و چه زمانی نباید)
مناسب:- feeds, profiles, likes/counters, directories/searches, cached views.
- سیستمهای جهانی با ورودیهای محلی و ناورداهای نرم.
- پیش بینی ها (CQRS)، جایی که منبع حقیقت یک هسته سخت است و خواندن ناهمزمان است.
- ناورداهای سخت: پول، منحصر به فرد بودن، محدودیت ها، موجودی "به منفی نمی روند. "وجود دارد - CP/EC قوی تر، sagas/TSS.
2) طراحی داده های EC: درگیری ها و حل آنها
اصل: هر رکورد متادیتای نسخه و یک تابع ادغام قطعی را حمل می کند.
برچسب های زمان/نسخه: «نسخه»، «ts»، «بازیگر».
ساعت برداری: رفع علیت، اجازه می دهد تا شما را به درک «موازی متضاد».
- LWW (Last-Write-Wins): ساده و سریع، اما می تواند «معنی» را از دست بدهد.
- CRDT: ساختارهای جابجایی/بی نظیر، همگرایی را تضمین می کنند.
- ادغام دامنه: عملکرد کسب و کار (به عنوان مثال، ادغام لیست بدون تکراری، شمارنده مجموع، «جدیدترین ایمیل + ادغام برچسب»).
- G-شمارنده/PN-شمارنده → شمارنده.
- مجموعه ای از OR-Set → (حذف بدون «چسبیده»).
- Registers → LWW-Register (با احتیاط در مورد «زیان»).
- نقشه ها/اسناد → نقشه CRDTs.
- همکاری نوشتن → متن CRDT/OT.
3) تکرار و ضد آنتروپی
Gossip/anti-entropy: تبادل دوره ای حالت ها/هش ها بین گره ها.
handoff اشاره کرد: به طور موقت «واریز» یک ورودی برای گره غیر قابل دسترس.
خواندن تعمیر: هنگام خواندن، آنها یک ناسازگاری پیدا کردند - آنها آخرین نسخه ها را بیرون کشیدند.
بسته های تغییر (deltas): ما دلتاها را رانندگی می کنیم، نه عکس های کامل.
Quorums R/W: تنظیم «R»، «W»، «N» برای به خطر انداختن سرعت و طراوت (به عنوان مثال، «R + W> N» در «آخرین رکورد» به قوی نزدیک تر است).
4) ضمانت مشتری بیش از EC
Read-Your-Writes (RYW): نویسنده پس از ضبط آن را می بیند (sticky-session/version marking).
Monotonic Reads: مشتری را به مقدار قدیمی تر «رول نکنید» (علامت آخرین نسخه را نگه دارید).
سازگاری علیت: حفظ علیت در جریان جلسه/عمل (برچسب های بردار در هدر/نشانه).
Staleness محدود: ضمانت نامه «قدیمی تر از Δ نسخه t/N» برای صفحه نمایش های مهم UX.
5) الگوهای UX برای EC
به روز رسانی خوش بینانه: فورا عمل را منعکس می کند، علامت گذاری «هماهنگ سازی».
علامت تازگی: نشان «به روز رسانی X ثانیه پیش»، دکمه «به روز رسانی».
Conflict-UI: برای برخوردهای نادر - «نمایش هر دو نسخه و انتخاب/ترکیب».
Skeleton/placeholder + refresh soft: با انتظار برای quorums جهانی، UI را مسدود نکنید.
6) قالب های معماری
6. 1 CQRS + پیش بینی
Write-kernel (CP): ثابت های سخت.
خواندن هواپیما (EC): پیش بینی های ناهمزمان، شاخص ها، انبارها ؛ تاخیر قابل قبول است.
6. 2 AP چند منطقه ای
به صورت محلی سریع بنویسید، به صورت ناهمگام تکرار کنید.
Geo-partitioning: داده ها «زندگی» نزدیک به کاربر ؛ متقابل منطقه - مصالح.
CRDT/ادغام توابع تسکین درد درگیری.
6. 3 تنظیم حد نصاب
yaml consistency:
replicas: 3 # N write_quorum: 2 # W read_quorum: 2 # R => R + W> N, closer to freshness on "last record"
read_repair: true hinted_handoff: true
7) نسخه و ادغام سیاست (به عنوان مثال)
yaml entity: "profile"
versioning:
clock: "vector" # или "hybrid_time"
fields:
name: { merge: "lww" }
emails: { merge: "set_union" } # OR-Set tags: { merge: "or_set" }
likes: { merge: "pn_counter" }
conflict_ui:
enabled: true show_diff_for: ["name"]
auto_merge_for: ["emails","tags","likes"]
8) مشاهدات EC: چه چیزی باید اندازه گیری شود
Staleness Age (p50/p95/p99): "در حال حاضر − data_version_ts' یا" تعداد نسخه های تاخیر ".
تکرار تاخیر: تحویل تاخیر بین مناطق/سایت ها.
نرخ درگیری: سهم به روز رسانی موازی، توزیع انواع.
Read-Repair Rate/Latency: چگونه اغلب و چگونه به سرعت ما «درمان» در هنگام خواندن.
زمان همگرایی: زمان همگرایی پس از پشت سر هم از رکورد/شکست گره.
SLO های معنایی: «95٪ از پروفایل ها قدیمی تر از 2s نیستند»، «99٪ از خوراک همگرا <10s».
9) Runbook "و حوادث
سناریو ها:1. رشد تاخیر بین منطقه ای: کاهش «نوشتن طرفداران»، شامل خواندن تهاجمی، نویسندگان سنگین ترول.
2. افزایش درگیری ها: به طور موقت یک قانون «سخت تر» (به عنوان مثال، علت/RYW) را فعال کنید، به روز رسانی های رقابتی را در کلید های داغ محدود کنید.
3. تاخیر طرح ریزی: اولویت بندی صف تکرار، به طور موقت کاهش فرکانس به روز رسانی غیر بحرانی.
4. داده ها «گیر» در برخی از گره: نیروی ضد آنتروپی، حزب توازن مجدد، اشاره حسابرسی handoff.
5. تجزیه دستی: تخلیه کلید های متضاد، ابزار «ادغام پیش نمایش»، رفع نبرد.
10) آزمایش EC
تست های شبیه Jepsen: تقسیم شبکه، تغییر ساعت، بازنویسی.
Property-based: ثابت توابع ادغام (کموتاتیویتی، idempotency، associativity).
تضادهای Fuzz: به روز رسانی موازی برای یک کلید با سفارش تحویل متغیر.
بارگذاری «اره»: انفجار متناوب/لول برای ارزیابی زمان همگرایی.
شبیه سازی UX: دید RYW/monotonic در سناریوهای معمولی.
11) چند مستاجر و برنامه ها
برچسب ها 'tenant _ id/plan/region' in events/records.
عدالت: تکرار/تعمیر در هر مستاجر محدود می کند به طوری که مشتری «پر سر و صدا» خستگی کلی را افزایش نمی دهد.
اقامت: داده ها و نسخه های آن در حوزه قضایی ؛ دیدگاه های بین منطقه ای فقط جمع می شوند.
12) خطاهای معمول
LWW برای همه چیز "تغییرات موازی معنایی را از دست می دهد ؛ استفاده از CRDT/ادغام دامنه.
هیچ تضمینی برای مشتری وجود ندارد. کاربر «نمی بیند» رکورد خود را → از دست دادن اعتماد.
هيچ اثري از منسوخ شدن نيست هیچ معیار پایدار/تاخیری → معیارهای «تخریب پنهان» وجود ندارد.
نوشتن دوگانه به سیستم های مختلف بدون ادغام. فانتوم ها و واگرایی ها بی نهایت هستند.
نظم جهانی به هر قیمتی کوروم های اضافی p95 را می کشند و نظم محلی برای کسب و کار کافی است.
13) دستور العمل های سریع
خوراک/نوار: EC + علت/RYW برای نویسنده، CRDT برای واکنش، stabeness p95 ≤ 2-5c.
پروفایل/تنظیمات: staleness محدود (≤1 -2c), RYW, ادغام دامنه (مجموعه اتحادیه).
کاتالوگ جهانی: geo-partition، تکرار ناهمزمان، خواندن-تعمیر در تقاضا، درگیری از طریق OR-Set.
معیارها/شمارنده: PN-شمارنده، تثبیت در پس زمینه ؛ مقادیر «تقریبی» را با یک برچسب نمایش می دهد.
14) مینی استاندارد (طرح کلامی)
Write-edge: رکورد محلی با نسخه ('vector/hybrid')، event log.
تکرار: очереди + شایعات/ضد آنتروپی، اشاره دست.
ذخیره سازی: پارتیشن بندی توسط کلید، توابع CRDT/ادغام در سطح نوشتن.
Read-plane: کش ها با خواندن-تعمیر، نشانه های RYW/monotonic، staleness محدود برای صفحه نمایش بحرانی.
قابلیت مشاهده: تاخیر/منسوخ/درگیری، هشدار برای بیش از خفا SLO.
15) چک لیست پیش فروش
- ثابت و جایی که EC مجاز است به وضوح شرح داده شده است.
- توابع قطعی بردار/ترکیبی و ادغام/CRDT انتخاب می شوند.
- ضمانت مشتری اجرا (RYW/یکنواخت/علی) برای UXs بحرانی.
- تکرار, خواندن تعمیر, handoff اشاره پیکربندی; کورام های R/W مستند شده اند.
- staleness/lag/convergence metrics and p95/p99 threshold alerts.
- Runbook 'و در رشد درگیری/عقب ماندگی ؛ ابزار دستی ایمن.
- تست برای پارتیشن های شبکه، به روز رسانی موازی و اموال همگرایی.
- محدودیت های چند مستاجر و سیاست های اقامت در نظر گرفته شده است.
- شاخص های طراوت UX و رفتار fallback با محصول سازگار است.
نتیجه گیری
سازگاری نهایی یک «سازش برای سازش» نیست، بلکه یک ابزار مقیاس پذیری و در دسترس بودن است. اگر ثابت ها را رسمی کنید، توابع ادغام صحیح را انتخاب کنید (ترجیحا CRDT در صورت لزوم)، تضمین های مشتری را اندازه گیری کنید و زمان ماندگاری و همگرایی را اندازه گیری کنید، سیستم سریع، پایدار و صادقانه خواهد بود - هم برای کاربران و هم برای کسب و کار.