بناء الذاكرة المكانية
قضيت ثلاثة أشهر في بناء تطبيق يشبه Pinterest للعالم المادي.
الفكرة بسيطة. تترك ملاحظات رقمية أو صورًا أو قصصًا عند إحداثيات GPS محددة. ولا يمكن للناس رؤيتها إلا عندما يقفون فعليًا في ذلك المكان بالضبط. هذا يحول العالم الحقيقي إلى مجموعة من الكبسولات الزمنية الرقمية.
بناء تطبيق يعتمد على الموقع أصعب مما يبدو. إليكم ما تعلمته حول الحزمة التقنية (tech stack).
قاعدة البيانات المكانية
لا يمكنك مجرد تخزين خطوط الطول والعرض كأرقام بسيطة إذا كنت ترغب في التوسع. أنت بحاجة إلى فهارس مكانية (spatial indexes). لقد استخدمت PostGIS مع PostgreSQL.
وهي تتعامل مع:
- الفهرسة المكانية باستخدام R-tree
- حسابات المسافة المدمجة
- استعلامات القرب السريعة
إذا كنت بحاجة إلى العثور على ذكريات ضمن نطاق 50 مترًا من المستخدم، فإن PostGIS يقوم بالعمل الشاق.
استراتيجية التخزين المؤقت (Caching)
تحصل المواقع السياحية الشهيرة على طلبات كثيرة جدًا. والوصول إلى قاعدة البيانات كل ثانيتين أمر سيء للأداء. لقد استخدمت أوامر Redis GEO لتخزين معرفات الذكريات (memory IDs) مؤقتًا في المناطق المزدحمة.
نصيحة للمحترفين: لا تقم بتخزين الكائن (object) بالكامل في Redis. قم بتخزين المعرفات (IDs) فقط. هذا يحافظ على انخفاض استهلاك الذاكرة ويقلل وقت الاستعلام من 20 مللي ثانية إلى 2 مللي ثانية.
نمط الرفع (Upload Pattern)
إذا كان خادمك يتعامل مع كل عملية رفع صور، فسوف ينهار تحت ضغط الأحمال. لقد استخدمت نمط رفع مكونًا من مرحلتين:
- يطلب العميل من الخادم رابطًا موقعًا مسبقًا (pre-signed URL)
- يقوم العميل برفع الملف مباشرة إلى Cloudflare R2
- يخبر العميل الخادم عند انتهاء عملية الرفع
لقد اخترت R2 بدلاً من S3 لأنه لا توجد رسوم خروج بيانات (egress fees). وهذا يوفر المال عندما يقوم المستخدمون بتنزيل الوسائط.
ما نجح
- PostGIS و Redis GEO يجعلان الاستعلامات المكانية سريعة.
- عمليات الرفع المباشرة إلى R2 تسمح للخلفية (backend) بالتوسع.
- يوفر Go و Gin أداءً عاليًا مع استهلاك منخفض للذاكرة.
- الخصوصية التدريجية (خاص، أصدقاء، أو عام) تحمي المستخدمين.
ما لم ينجح
- دقة GPS غير مستقرة في المدن ذات المباني الشاهقة.
- مشكلة "البداية الباردة" (cold start) حقيقية؛ يحتاج التطبيق إلى العديد من المستخدمين ليشعر المرء بأنه حي.
- تتطلب مراقبة المحتوى اهتمامًا مستمرًا.
علمني بناء هذا التطبيق أن الموقع الفعلي هو بُعد لم ينل حقه من التقدير في التطبيقات الاجتماعية. المحتوى الرقمي يبدو أكثر أهمية عندما يكون مرتبطًا بمكان حقيقي.
مجتمع تعليمي اختياري: https://t.me/GyaanSetuAi
