ساخت حافظه مکانی

من سه ماه را صرف ساختن یک «پینترست» برای دنیای فیزیکی کردم.

ایده ساده است. شما یادداشت‌ها، عکس‌ها یا داستان‌های دیجیتالی را در مختصات GPS مشخصی باقی می‌گذارید. افراد تنها زمانی می‌توانند آن‌ها را ببینند که شخصاً در همان نقطه ایستاده باشند. این کار دنیای واقعی را به مجموعه‌ای از کپسول‌های زمان دیجیتالی تبدیل می‌کند.

ساخت یک اپلیکیشن مبتنی بر مکان، سخت‌تر از آن چیزی است که به نظر می‌رسد. در اینجا آنچه درباره پشته تکنولوژی (tech stack) آموختم را آورده‌ام.

پایگاه داده مکانی

اگر می‌خواهید برنامه را مقیاس‌پذیر کنید، نمی‌توانید عرض و طول جغرافیایی را صرفاً به عنوان اعداد ساده ذخیره کنید. شما به شاخص‌های مکانی (spatial indexes) نیاز دارید. من از PostGIS همراه با PostgreSQL استفاده کردم.

این ابزار موارد زیر را مدیریت می‌کند:

  • شاخص‌گذاری مکانی با R-tree
  • محاسبات فاصله داخلی (built-in)
  • پرس‌وجوهای (queries) سریع مجاورتی

اگر نیاز باشد خاطرات را در فاصله ۵۰ متری یک کاربر پیدا کنید، PostGIS کارهای سنگین را انجام می‌دهد.

استراتژی کشینگ (Caching)

نقاط گردشگری محبوب درخواست‌های بسیار زیادی دریافت می‌کنند. مراجعه مداوم به پایگاه داده در هر دو ثانیه، برای عملکرد سیستم مضر است. من از دستورات Redis GEO برای ذخیره در حافظه موقت (cache) شناسه‌های خاطرات در مناطق شلوغ استفاده کردم.

یک نکته حرفه‌ای: کل شیء (object) را در Redis کش نکنید. فقط شناسه‌ها (IDs) را کش کنید. این کار مصرف حافظه را پایین نگه می‌دارد و زمان پرس‌وجو را از ۲۰ میلی‌ثانیه به ۲ میلی‌ثانیه کاهش می‌دهد.

الگوی آپلود

اگر سرور شما مسئولیت هر آپلود عکس را بر عهده بگیرد، زیر بار ترافیک از کار می‌افتد. من از یک الگوی آپلود دو مرحله‌ای استفاده کردم:

  • کلاینت از سرور یک pre-signed URL درخواست می‌کند.
  • کلاینت فایل را مستقیماً به Cloudflare R2 آپلود می‌کند.
  • کلاینت به سرور اطلاع می‌دهد که آپلود تمام شده است.

من R2 را به S3 ترجیح دادم چون هزینه‌ی خروج داده (egress fees) ندارد. این کار هنگام دانلود رسانه‌ها توسط کاربران، در هزینه‌ها صرفه‌جویی می‌کند.

آنچه موفقیت‌آمیز بود

  • PostGIS و Redis GEO پرس‌وجوهای مکانی را سریع می‌کنند.
  • آپلود مستقیم به R2 به بک‌اند اجازه مقیاس‌پذیری می‌دهد.
  • 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