- Redis เป็นหนึ่งในเทคโนโลยีที่มีชื่อเสียงเชิงบวกมากที่สุดในอุตสาหกรรมเทคโนโลยี
- เป็นเทคโนโลยีที่ยอดเยี่ยม ออกแบบมาอย่างดีมาก และไม่ได้มีข้อบกพร่องในตัวเอง แต่ อาจไม่ได้จำเป็นเสมอไป
- ตลอด 10+ ปีที่ผ่านมา ผู้เขียนเห็นแพตเทิร์นเดียวกันใน 3 บริษัท:
- มีปัญหาเกิดขึ้นและ Redis ดูเหมือนจะเหมาะสม แต่ในความเป็นจริงกลับไม่ได้ช่วยให้สถานการณ์ดีขึ้น หรือไม่ได้แก้ปัญหาที่ต้นตอ
- มันเป็นเพียงการ เพิ่มความซับซ้อนเพื่อความซับซ้อนเท่านั้น
กรณีแรก: ประสบการณ์ที่ Tantan
- Tantan เป็นแอปหาคู่ที่ใหญ่เป็นอันดับ 2 ของจีน และใช้งานเซิร์ฟเวอร์ฐานข้อมูลประสิทธิภาพสูง 50~100 เครื่องบน PostgreSQL
- แต่ละเซิร์ฟเวอร์ถูกชาร์ดตาม user ID ดังนั้นข้อมูลของผู้ใช้แต่ละคนจะถูกเก็บไว้บนเซิร์ฟเวอร์เพียงเครื่องเดียว
- สถานการณ์ปัญหา
- มีความต้องการให้บันทึกจำนวนครั้งของการ "ปัด" และอัปเดตได้อย่างรวดเร็ว
- ในตอนแรกตัดสินใจว่าการเก็บไว้ใน Redis น่าจะเหมาะสม
- คิดว่าเพียงมีเซิร์ฟเวอร์ Redis ประสิทธิภาพสูงไม่กี่เครื่องก็น่าจะเพียงพอ จึงเริ่มตั้งค่า
- ทบทวนและแนวทางแก้ไข
- ภายในทีมมีการพูดคุยถึงแนวทางเก็บข้อมูลลง PostgreSQL โดยตรงแทน Redis
- เนื่องจากโหลดของเซิร์ฟเวอร์ PostgreSQL สูงอยู่แล้ว จึงคาดว่าโหลดที่เพิ่มขึ้นจะมีน้อยมาก
- หลังจากเก็บข้อมูลลง PostgreSQL ก็ไม่พบการลดลงของประสิทธิภาพ ทำให้การนำ Redis มาใช้ไม่จำเป็น
กรณีที่สอง: ประสบการณ์ที่ Bannerflow
- เบื้องหลัง
- Bannerflow เป็นแพลตฟอร์มสำหรับสร้างและเผยแพร่โฆษณา
- มีการตัดสินใจนำ Redis มาใช้ในไมโครเซอร์วิสใหม่ เพื่อรองรับการเผยแพร่โฆษณาไปยังโซเชียลเน็ตเวิร์กอย่าง Facebook
- สถานการณ์ปัญหา
- เมื่อเทียบกับ Tantan แล้ว โหลดต่ำกว่ามาก จึงไม่ชัดเจนว่าจำเป็นต้องใช้ Redis หรือไม่
- หลังจากนักพัฒนาเริ่มต้นออกจากทีมไป ก็ไม่มีใครอธิบายเหตุผลของการนำ Redis มาใช้ได้อย่างชัดเจน
- ผลลัพธ์
- Redis ไม่ได้จำเป็นจริง ๆ เพราะโหลดต่ำ
- ในระยะยาวจึงสรุปว่าทางเลือกที่ดีที่สุดคือการถอด Redis ออก
กรณีที่สาม: ประสบการณ์ที่ MAJORITY
- เบื้องหลัง
- MAJORITY เป็นบริษัทฟินเทคที่นำ Redis มาใช้เพื่อแคชผลลัพธ์จากการเรียก external API
- Redis ถูกนำมาใช้เพื่อแคชข้อมูลการค้นหาตำแหน่ง ช่วยให้ประมวลผลเร็วขึ้นและลดต้นทุน
- สถานการณ์ปัญหา
- ข้อมูลเดียวกันนี้ถูกเก็บอยู่ใน DB (Azure SQL) ด้วย
- คาดว่าแม้จะเปลี่ยนจากการเรียก Redis ไปเป็นการเรียก DB ก็แทบจะไม่เพิ่มโหลด
- เดิมต้องการใช้ Redis ต่อเพราะจำเป็นต้องมีการจัดการ lock แต่พบว่า Azure SQL ก็รองรับได้เพียงพอ
- ผลลัพธ์
- สรุปว่าการนำ Redis มาใช้ไม่จำเป็น
- จัดทำแผนเปลี่ยนไปใช้ Azure SQL แทน Redis
บทสรุป
- ทั้งสามกรณีเกิดขึ้นในโดเมน เทคโนโลยีสแต็ก และเงื่อนไขโหลดที่แตกต่างกัน
- จุดร่วมคือมีการนำ Redis มาใช้โดยไม่จำเป็น
- ก่อนนำ Redis มาใช้ ควรพิจารณาความจำเป็นจริงและประโยชน์ด้านประสิทธิภาพให้รอบคอบ
- แนะนำให้ดูบรรยาย 'Choose Boring Technology' ของ Dan McKinley
5 ความคิดเห็น
ไม่ว่าคุณจะใช้ Redis หรือไม่ การแทรกชั้นแคชไว้ระหว่างโดเมนกับ persistence (โดยให้การทำงานพื้นฐานเป็นแบบ bypass) ไม่ใช่การ overengineering เลยแม้แต่น้อย ใช้ได้กับการทำ logging, ข้อมูลปลอม, debugging, profiling และอาจรวมถึงการแคชจริง ๆ ด้วย…
+1 ผมก็เห็นด้วยครับ แค่เพิ่มอีกหนึ่งเลเยอร์ก็สร้าง
ช่องว่างขึ้นมาได้ และทำให้มีพื้นที่สำหรับแก้ปัญหาสารพัดอย่างได้ด้วยดูเหมือนว่าแทนที่จะมองว่า Redis มีปัญหา ประเด็นคือถ้าแค่ DB อย่างเดียวก็เพียงพอแล้ว ทำไมต้องเพิ่มองค์ประกอบเข้าไปอีกจนภาระในการดูแลจัดการสูงขึ้น
บทความนี้อธิบายค่อนข้างย่อ ๆ ดังนั้นน่าจะรับไว้ในแง่ว่าเป็นอีกมุมมองหนึ่งที่ควรลองคิดดู
ทั้งนี้ก็มีสถานการณ์ที่การนำ Redis cache มาใช้พร้อมกับคงตรรกะของแอปพลิเคชันให้เรียบง่าย อาจเป็นทางเลือกที่ดีกว่าได้เช่นกัน
สุดท้ายก็ควรเลือกให้เหมาะกับสถานการณ์ครับ
โดนพาดหัวหลอกเลยนะครับ 555 เห็นด้วยครับ~~
ความคิดเห็นจาก Hacker News
ตอนทำงานที่ Uber ในปี 2015 มีความพยายามเปลี่ยนการแบ่งพื้นที่เชิงภูมิศาสตร์ตามรหัสไปรษณีย์ไปเป็นวิธีที่อิงกับหกเหลี่ยม
มีการถกเถียงกันเรื่องการใช้ Redis มากเกินไป
วัฒนธรรมการใช้งาน Redis ยังพัฒนาไม่ทันความนิยมของมัน
ประเด็นไม่ได้อยู่ที่ Redis หรือไม่ใช่ Redis แต่เป็นปัญหาของการทำงานกับข้อมูลที่ serialize ได้ไม่ดี
การพัฒนาซอฟต์แวร์มักมีแนวโน้มทำซ้ำวิธีของคนอื่น
Redis คือ "data structure server" เพียงตัวเดียวที่พร้อมใช้ในโปรดักชัน
คุณอาจไม่จำเป็นต้องมีแคช
API ของ Redis ยอดเยี่ยม แต่มีความเสี่ยงด้านการปฏิบัติการ
น่าประหลาดใจกับแนวโน้มที่ไม่ค่อยแนะนำให้ใช้ Redis
Redis ใช้เป็นแคชชั่วคราวได้ดี แต่ยังไม่พอสำหรับทรานแซกชันหรือระบบจัดเก็บแบบกระจายศูนย์