شیپنو یک پلتفرم لجستیک است که سفارش ارسال را به نزدیکترین رانندهٔ در دسترس متصل میکند. قلب فنی این محصول، موتور تخصیص راننده است؛ سامانه باید در کسری از ثانیه از میان دهها راننده، گزینهای را انتخاب کند که فاصله، ظرفیت خودرو، امتیاز و مسیر فعلیاش بهترین تطبیق را با سفارش دارد. این مسئله یک بهینهسازی چندمعیاره با محدودیت زمانی سخت است.
ردیابی زنده، چالش مقیاس بود. موقعیت هزاران راننده هر چند ثانیه بهروز میشود و باید بدون فشار به پایگاه دادهٔ اصلی مدیریت شود. ما موقعیت لحظهای را در Redis با ساختار geospatial نگه میداریم و کوئری «رانندههای نزدیک» را مستقیم از حافظه پاسخ میدهیم. بهروزرسانی نقشهٔ مشتری هم از طریق WebSocket و بدون فشار polling انجام میشود.
برای بخش پردازش سنگین و همزمان، سرویس تخصیص را با Go نوشتیم چون مدل همروندی آن برای مدیریت هزاران اتصال همزمان بسیار کارآمد است. پنل مدیریت و رابط مشتری روی Nuxt ساخته شد و پایگاه دادهٔ PostgreSQL برای دادههای پایدار مثل سفارشها و تسویه به کار رفت. این جداسازی مسئولیتها، مقیاسپذیری هر بخش را مستقل کرد.
بزرگترین درس، اهمیت سناریوهای شکست بود. اینترنت موبایل راننده قطع میشود، GPS خطا میدهد و سفارش ممکن است لغو شود. ما برای هر حالت یک مسیر بازیابی روشن طراحی کردیم: صفبندی موقعیتها هنگام قطعی، تشخیص موقعیتهای پرت و تخصیص دوباره در صورت بیپاسخ ماندن راننده. این مقاومسازی، تفاوت میان یک نمونهٔ آزمایشی و یک محصول تولیدی قابل اتکاست.