การสร้างความจำเชิงพื้นที่
ผมใช้เวลาสามเดือนในการสร้าง Pinterest สำหรับโลกแห่งความเป็นจริง
แนวคิดนั้นเรียบง่าย คุณสามารถทิ้งโน้ตดิจิทัล รูปภาพ หรือเรื่องราวไว้ที่พิกัด GPS เฉพาะเจาะจง ผู้คนจะเห็นสิ่งเหล่านี้ได้ก็ต่อเมื่อพวกเขาไปยืนอยู่ในจุดนั้นจริงๆ เท่านั้น มันเปลี่ยนโลกแห่งความเป็นจริงให้กลายเป็นคอลเลกชันของแคปซูลกาลเวลาดิจิทัล
การสร้างแอปพลิเคชันที่อิงตามตำแหน่ง (location-based app) นั้นยากกว่าที่คิด นี่คือสิ่งที่ผมได้เรียนรู้เกี่ยวกับเทคโนโลยีที่ใช้ (tech stack)
ฐานข้อมูลเชิงพื้นที่ (The Spatial Database)
หากคุณต้องการขยายระบบ (scale) คุณไม่สามารถเก็บค่าละติจูดและลองจิจูดเป็นเพียงตัวเลขธรรมดาได้ คุณจำเป็นต้องมีดัชนีเชิงพื้นที่ (spatial indexes) ผมเลือกใช้ PostGIS ร่วมกับ PostgreSQL
มันจัดการเรื่อง:
- การทำดัชนีเชิงพื้นที่ด้วย R-tree
- การคำนวณระยะทางในตัว
- การคิวรีข้อมูลตามความใกล้เคียงที่รวดเร็ว
หากคุณต้องการค้นหาความทรงจำภายในระยะ 50 เมตรจากผู้ใช้ PostGIS จะเป็นตัวจัดการงานหนักทั้งหมดนี้
กลยุทธ์การทำแคช (The Caching Strategy)
สถานที่ท่องเที่ยวที่เป็นที่นิยมมักจะมีการเรียกใช้งาน (requests) จำนวนมาก การเรียกใช้งานฐานข้อมูลทุกๆ สองวินาทีจะส่งผลเสียต่อประสิทธิภาพ ผมจึงใช้คำสั่ง Redis GEO เพื่อทำแคช ID ของความทรงจำในพื้นที่ที่มีการใช้งานหนาแน่น
เคล็ดลับระดับโปร: อย่าทำแคชทั้งออบเจกต์ (object) ใน Redis ให้แคชเฉพาะ ID เท่านั้น วิธีนี้จะช่วยให้การใช้หน่วยความจำต่ำลงและลดเวลาในการคิวรีจาก 20ms เหลือเพียง 2ms
รูปแบบการอัปโหลด (The Upload Pattern)
หากเซิร์ฟเวอร์ของคุณต้องจัดการการอัปโหลดรูปภาพทุกครั้ง มันจะล่มเมื่อมีโหลดเข้ามาจำนวนมาก ผมจึงใช้รูปแบบการอัปโหลดแบบสองขั้นตอน (two-phase upload pattern):
- ไคลเอนต์ขอ pre-signed URL จากเซิร์ฟเวอร์
- ไคลเอนต์อัปโหลดไฟล์ไปยัง Cloudflare R2 โดยตรง
- ไคลเอนต์แจ้งเซิร์ฟเวอร์เมื่อการอัปโหลดเสร็จสิ้น
ผมเลือกใช้ R2 แทน S3 เพราะไม่มีค่าธรรมเนียมการถ่ายโอนข้อมูลออก (egress fees) ซึ่งช่วยประหยัดค่าใช้จ่ายเมื่อผู้ใช้ดาวน์โหลดสื่อต่างๆ
สิ่งที่ได้ผล
- PostGIS และ Redis GEO ช่วยให้การคิวรีเชิงพื้นที่รวดเร็ว
- การอัปโหลดตรงไปยัง R2 ช่วยให้ระบบหลังบ้าน (backend) ขยายตัวได้ง่าย
- Go และ Gin ให้ประสิทธิภาพสูงโดยใช้หน่วยความจำต่ำ
- ระบบความเป็นส่วนตัวแบบเป็นลำดับขั้น (Private, Friends, หรือ Public) ช่วยปกป้องผู้ใช้
สิ่งที่ผิดพลาด
- ความแม่นยำของ GPS ไม่คงที่ในเมืองที่มีตึกสูง
- ปัญหา "cold start" นั้นเป็นเรื่องจริง แอปจำเป็นต้องมีผู้ใช้จำนวนมากเพื่อให้รู้สึกว่ามีการใช้งานอยู่จริง
- การตรวจสอบเนื้อหา (content moderation) จำเป็นต้องได้รับความใส่ใจอย่างต่อเนื่อง
การสร้างสิ่งนี้สอนให้ผมรู้ว่า ตำแหน่งที่ตั้งทางกายภาพเป็นมิติที่มักถูกมองข้ามสำหรับแอปโซเชียล เนื้อหาดิจิทัลจะให้ความรู้สึกที่มีความหมายมากขึ้นเมื่อมันเชื่อมโยงกับสถานที่จริง
Optional learning community: https://t.me/GyaanSetuAi
