การสร้างความจำเชิงพื้นที่

ผมใช้เวลาสามเดือนในการสร้าง 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) จำเป็นต้องได้รับความใส่ใจอย่างต่อเนื่อง

การสร้างสิ่งนี้สอนให้ผมรู้ว่า ตำแหน่งที่ตั้งทางกายภาพเป็นมิติที่มักถูกมองข้ามสำหรับแอปโซเชียล เนื้อหาดิจิทัลจะให้ความรู้สึกที่มีความหมายมากขึ้นเมื่อมันเชื่อมโยงกับสถานที่จริง

Source: https://dev.to/kevinten10/building-spatial-memory-why-i-built-a-pinterest-for-the-physical-world-and-what-i-learned-bpm

Optional learning community: https://t.me/GyaanSetuAi