Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

3 กลยุทธ์ที่พิสูจน์แล้ว สำหรับการטיח Cache Consistency ในระบบระดับองค์กร

หากคุณเชื่อ Ralph Waldo Emerson ความสอดคล้องที่โง่เขลาอาจเป็น Hobgoblin ของจิตใจเล็กๆ แต่เมื่อพูดถึงการนำกลยุทธ์ Caching ระดับองค์กรที่ขยายได้และประสบความสำเร็จ ไม่มีอะไรโง่เขลาเกี่ยวกับ Consistency เลย จริงๆ แล้ว หนึ่งในความท้าทายที่ยิ่งใหญ่ที่สุดในการจัดการการทำงานของฐานข้อมูลระดับองค์กรคือการรักษา Cache Consistency

เราใช้ Caches ทำไม? ข้อได้เปรียบหลักของ Enterprise Cache คือความเร็วและประสิทธิภาพในการเข้าถึงข้อมูล ในขณะที่แต่ละการเรียก Primary Database อาจมีค่าใช้จ่ายสูงทั้งเวลาและกำลังประมวลผล การเรียก Cache สามารถเร็ว如闪电 และไม่กระทบ Primary Database

สามอุปสรรคต่อ Cache Consistency

ข้อได้เปรียบเหล่านี้พึ่งพาสมมติฐานพื้นฐานว่า ข้อมูลใน Cache หรือ Caches ต้องมีค่าเท่ากับ Source Data เสมอ แม้จะดูเป็นเป้าหมายที่ตรงไปตรงมา แต่จริงๆ แล้ว ทฤษฎีง่ายกว่าปฏิบัติ มี 3 หลุมลึกที่ทำให้พัง:

1. เมื่อการเปลี่ยนแปลงใน Primary Database ไม่สะท้อนใน Cache

เนื่องจากการเข้าถึงข้อมูลผ่าน Cache เร็วกว่าผ่าน Primary Database โดยนิยาม หากมีการขอ Item เฉพาะเจาะจง Cache จะถูกตรวจสอบก่อน สมมติ Item มีอยู่ใน Cache จะถูกส่งคืนเร็วกว่าจาก Primary Database มาก กลยุทธ์นี้รู้จักว่า Cache-aside Pattern Cache ถูกตรวจสอบก่อนโดยค่าเริ่มต้น หากข้อมูลไม่อยู่ใน Cache แอปพลิเคชันจะสอบถาม Primary Database และนำผลลัพธ์ฝากใน Cache ระหว่างทางกลับไปยังผู้ใช้

ปัญหาเกิดขึ้นในช่องว่างระหว่างที่ข้อมูลใน Primary Database เปลี่ยน และ Cache ปรับตัวเพื่อสะท้อนการเปลี่ยนแปลงนั้น ซึ่งได้รับอิทธิพลจากความถี่ที่แอปพลิเคชันตรวจสอบ Cache อย่างไรก็ตาม แต่ละการตรวจสอบมีค่าใช้จ่ายเป็น Processor Resources Processor เดียวกันอาจจัดการฟังก์ชันหรือ Transaction อื่นๆ พร้อมกัน บางอย่างสำคัญเท่าหรือมากกว่าการอัปเดต Cache

ความท้าทายอยู่ที่การหาจุดที่เหมาะสม (Sweet Spot) พื้นที่ Goldilocks ที่อยู่ระหว่างตรวจสอบอัปเดตบ่อยเกินไปหรือไม่พอ ทieten אם ผู้ใช้พยายามเข้าถึงข้อมูลล้าสมัยในช่องว่างนี้ การเดิมพันก็แพ้

2. เมื่อมีความล่าช้าในการอัปเดตผลลัพธ์ที่แคชไว้

ปัญหานี้ทับซ้อนกับปัญหาก่อนหน้านี้เล็กน้อย ทุกครั้งที่ Value ถูกอัปเดตใน Primary Database จะส่งข้อความไปยัง Cache สั่งให้อัปเดตค่าที่เปลี่ยนหรือลบทิ้งทั้งหมด (ในกรณีหลังครั้งหน้าที่ขอ Value จะเข้าถึงจาก Primary Database แล้วจาก Cache ต่อไป) ภายใต้สภาพปกติ การสื่อสารนี้เกิดขึ้นค่อนข้างเร็ว และ Cached item จะถูกอัปเดตหรือลบเพื่อรักษา Cache Consistency

อีกครั้ง การเปลี่ยนแปลงนี้ต้องใช้ Processing Power และใช้เวลา ความล่าช้าอาจได้รับอิทธิพลจาก Processing Speed ที่มีอยู่และ Network Throughput หากผู้ใช้มีความโชคร้ายที่เลือกเข้าถึงข้อมูลล้าสมัยระหว่างที่ Server ส่งข้อความอัปเดต Cache จนกว่า Cache จะรับและดำเนินการ ผลลัพธ์อาจเป็นข้อมูลที่ล้าสมัย ผิด หรือทั้งคู่

3. เมื่อมีความไม่สอดคล้องข้าม Cached Nodes

เว็บไซต์หรือแอปพลิเคชันใหญ่เท่าไหร่ Cache ก็มีโอกาสจัดเก็บบน Multiple Nodes แทนที่จะเป็น Node เดียว นอกจาก Node Primary แล้ว อาจมี Replica Nodes หลายตัวที่ในที่สุดจัดเก็บข้อมูลเหมือนกัน จากมุมมอง Load Balancing และ Performance นี่มักมีเหตุผล

แต่จากมุมมอง Data Integrity นี่เพิ่มแหล่ง Cache Inconsistency อีกทุกครั้งที่ข้อมูลอัปเดตใน Primary Database การเปลี่ยนแปลงนี้ต้องสะท้อนใน Replicas ทั้งหมดด้วย ขึ้นอยู่กับตำแหน่งทางภูมิศาสตร์ของ Nodes และจำนวน Node กระบวนการอัปเดตอาจใช้เวลานาน แม้กระบวนการอัปเดตจะกำลังดำเนินอยู่ ก็ยังเป็นไปได้ที่ผู้ใช้จะเข้าถึง Node ที่ยังไม่มีการเปลี่ยนแปลง ผลลัพธ์ คุณเดาถูกต้อง คือ Cache Inconsistency

ต้นทุนของ Cache Inconsistency

แม้จะมีประโยชน์มากมายของ Cached Database ความเป็นไปได้ของ Cache Inconsistency ก็เป็นข้อบกพร่องที่โดดเด่นที่สุด แต่ปัญหานี้ใหญ่แค่ไหน? ต้นทุนของ Cache Inconsistency ขึ้นอยู่กับบริบท

Cache Inconsistency บางส่วนอาจเกิดขึ้นโดยไม่มีผลกระทบมาก ตัวอย่างเช่น ถ้า Total "Likes" ใน Cache ล้าสมัยชั่วคราวจาก Primary Database ความแตกต่างสั้นๆ น่าจะไม่ก่อให้เกิดปัญหาหรือถูกสังเกต

แต่หาก Cache แสดงว่าสินค้าที่เหลือ 1 ชิ้นยังมีสต็อก ในขณะที่ Primary Database บอกว่าไม่มีเลย ความขัดแย้งที่เกิดขึ้นอาจทำให้ลูกค้งงงงและระงับความเชื่อถือ ความเสียหายต่อชื่อเสียง การทำธุรกรรมและบัญชี และในกรณีสุดสุด อาจนำไปสู่ภัยคุกคามทางกฎหมาย

สามวิธีต้านทาน Inconsistency

โชคดีที่สำหรับแหล่งที่มาของ Cache Inconsistency ที่เป็นไปได้แต่ละอย่าง มีโซลูชันที่ตรงกันจำนวนเท่ากัน

1. Cache Invalidation

ด้วย Cache Invalidation ทุกครั้งที่ Value อัปเดตใน Primary Database Cached item ทุกตัวที่มี Key ตรงกันจะถูกลบออกจาก Cache หรือ Caches อัตโนมัติ แม้ Cache Invalidation อาจดูเป็น "Brute Force Approach" แต่ข้อได้เปรียบคือต้องใช้เพียงหนึ่งการเขียนที่มีค่าใช้จ่ายสูงและมักใช้เวลานาน — ไปที่ Primary Database เอง — แทนที่จะเป็นสองหรือมากกว่า

2. Write-through Caching

ในกรณีนี้ แทนที่จะอัปเดต Primary Database และลบ Cache ด้วยกลยุทธ์ Write-through แอปพลิเคชันจะอัปเดต Cache ก่อน แล้ว Cache จะอัปเดต Primary Database แบบ Synchronous กล่าวคือ แทนที่จะพึ่ง Primary Database เริ่มอัปเดต Cache เป็นผู้ควบคุม Consistency ของตัวเองและส่งการเปลี่ยนแปลงกลับไปยัง Primary Database

3. Write-behind Caching

น่าเสียดายที่บางครั้งการเขียนสองครั้งทำให้ผิดพลาด หนึ่งในข้อบกพร่องของ Write-through คือการอัปเดต Cache และ Primary Database ทั้งคู่ ต้องการการเปลี่ยนแปลงที่ใช้เวลานานและกระทบ Processor สองครั้ง ต่อ Cache ก่อนแล้ว Primary Database

กลยุทธ์อีกอย่างหนึ่ง คือ Write-behind หลีกเลี่ยงปัญหานี้โดยอัปเดตแค่ Cache ก่อน แล้วอัปเดต Primary Database ภายหลัง Primary Database ก็ยังต้องอัปเดต และยิ่งเร็วยิ่งดี แต่ในกรณีนี้ User ไม่ต้องจ่าย "ค่าใช้จ่าย" ของการเขียนสองครั้ง การเขียนครั้งที่สองไป Primary Database เกิดขึ้นแบบ Asynchronous และเบื้องหลัง (ดังนั้นจึงชื่อ Write-behind) ในเวลาที่น่าจะไม่ทำลาย Performance

Redis Enterprise ช่วยชีวิต

นอกจาก Cache Invalidation, Write-through และ Write-behind Caching แล้ว ยังสามารถจัดการหลายสถานการณ์ที่ช่วยบรรลุ Cache Consistency ได้ แต่วิธีแก้ปัญหาไม่ได้หมายความว่านำไปใช้ได้จริง

Active-Active Geo-Duplication ของ Redis Enterprise อนุญาตให้มี Multiple Primaries และจัดการโหลดที่หนักขึ้นได้อย่างชำนาญ ชื่อ Active-Active มาจากข้อเท็จจริงว่าแต่ละอินสแตนซ์ของฐานข้อมูลสามารถรับ Read และ Write Operations บน Key ใดๆ ได้ อินสแตนซ์ฐานข้อมูลแต่ละตัว ไม่ว่าจะอยู่ไกลแค่ไหน ก็เป็น Peer บน Network ของคุณ นั่นหมายความว่าเมื่อมีการเขียนเกิดขึ้นที่อินสแตนซ์ใดๆ Node นั้นจะส่งข้อความไปยังอินสแตนซ์อื่นๆ ทั้งหมดบน Network แจ้งว่าอะไรใน Cache เปลี่ยนแปลงไป และรับรองว่าอินสแตนซ์ทั้งหมดเก็บชุด Cached Data ที่สอดคล้องกัน

Active-Active Geo-Duplication ที่เป็นเอกลักษณ์ของ Redis Enterprise ใช้อัลกอริทึมที่ซับซ้อนซึ่งออกแบบมาเพื่อจัดการ Write Conflicts ที่อาจนำไปสู่ Cache Inconsistency อัลกอริทึมเหล่านี้อิงตาม Conflict-free Replicated Data Types (CRDTs) รับรองว่า Writes จาก Multiple Replicas สามารถรวมกันได้อย่างที่รักษา Consistency ได้อย่างมีประสิทธิภาพ

Hooray สำหรับ Hobgoblins!

เนื่องจากความท้าทายในการรักษา Cache Consistency กลายเป็นซับซ้อนและสำคัญขึ้นเรื่อยๆ เมื่อ Architecture โต คุณต้องการ Enterprise-level Caching Solution ที่ส่งมอบ Consistency ที่ธุรกิจต้องการและลูกค้าคาดหวังอย่างน่าเชื่อถือ

Consistency อาจเป็น Hobgoblin ตามมุมมองของ Emerson แต่เป็นสิ่งจำเป็นอย่างยิ่งเมื่อพูดถึง Enterprise-level Database Caching นั่นเป็นเหตุผลที่การเลือก Redis Enterprise เป็นเรื่องมีปัญญา คุณจะโง่ถ้าไม่เลือก

รับเรื่องราวทั้งหมดของ Caching อ่าน Caching at Scale with Redis โดย Lee Atchison