PACELC คือ กรอบคิดในการออกแบบระบบกระจาย ที่บอกว่า
ถ้าเกิดการแบ่งส่วน (P: Partition) เราต้องเลือกระหว่างความพร้อมให้บริการ (A: Availability) กับ ความสอดคล้อง (C: Consistency)
แต่ถ้า "ไม่" เกิดการแบ่งส่วน (E: Else) เราต้องเลือกระหว่างเวลาแฝง (L: Latency) กับความสอดคล้อง (C: Consistency) ในการทำงานปกติของระบบ
คุ้นๆ กันมั้ย มันคล้ายๆ กับ CAP Theorem นั่นเอง
- Partition (P): ลิงก์เครือข่ายบางส่วนขาด/ช้า จนโหนดสื่อสารกันไม่ได้
- Availability (A): ความพร้อมใช้งาน ระบบตอบสนองคำขอได้เสมอ แม้จะไม่รับประกันข้อมูลล่าสุด
- Consistency (C): ความสม่ำเสมอของข้อมูล โดยระบบจะเรียกดูข้อมูลแล้วได้ค่าเดียวกับลำดับเขียนล่าสุดตามโมเดลที่กำหนดเสมอ (เช่น linearizability)
- Latency (L): เวลาตอบสนองของการอ่าน/เขียน โดยเฉพาะค่า p99/p999 ที่ผู้ใช้สัมผัส
- Else (E): สภาวะปกติที่ไม่มี partition แต่ยังมี trade-off ระหว่าง L กับ C เสมอ
เพื่อโดยทั่วไปแล้ว เราจะต้อง tradeoff ระหว่าง CP กับ AP อยู่แล้ว ตัว PACELC Theorem จะช่วยให้เราตัดสินใจได้ง่ายขึ้นไปอีก
Disision Tree
เมื่อมี P:
- ถ้าเราอยากคงความสามารถของ Consistency (C) ไว้ เราต้อง "รอ/ปฏิเสธ" เราจะต้องยอมเสีย Availability (A)
- ถ้าเราอยากคงความสามารถของ Availability (A) ไว้ เราต้อง "ยอมรับ divergence" ซึ่งจะเสีย Consistency (C)
ถ้าเป็น E:
- ถ้าเราอยากได้ Consistency (C) ที่แป๊ะ มักต้อง "รอระยะหนึ่ง" เพื่อยืนยันการอัพเดทข้อมูลบน replica มันจึงส่งผลให้ Latency (L) เพิ่ม
- ถ้าเราอยากได้ Latency (L) ที่ต่ำ มักต้อง "ลด Consistency (C) ลง" เช่น ack เร็วขึ้น/อ่าน ยอมอ่านข้อมูลที่ไม่ใช่ข้อมูลล่าสุด (stale read)
คิดว่า เราน่าจะนำเอา theorem นี้มาใช้ในการออกแบบระบบให้เหมาะกับงานได้ โดยเราจะเลือกอะไรนั้น ก็ขึ้นอยู่กับ Non-Functional Requirements และ ปัจจัยต่างๆ ที่เรามี เช่น งบเวลาแฝง ผลกระทบทางธุรกิจ นโยบาย และ SLO เป็นต้น