PACELC คือ กรอบคิดในการออกแบบระบบกระจาย ที่บอกว่า

ถ้าเกิดการแบ่งส่วน (P: Partition) เราต้องเลือกระหว่างความพร้อมให้บริการ (A: Availability) กับ ความสอดคล้อง (C: Consistency)

แต่ถ้า "ไม่" เกิดการแบ่งส่วน (E: Else) เราต้องเลือกระหว่างเวลาแฝง (L: Latency) กับความสอดคล้อง (C: Consistency) ในการทำงานปกติของระบบ

PACELC Theorem

คุ้นๆ กันมั้ย มันคล้ายๆ กับ 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 เป็นต้น