Delivery Tracker
Lead Developer
Real-time delivery-dispatch σύστημα που αναθέτει παραγγελίες σε οδηγούς βάσει απόστασης, τρέχοντος φόρτου και ιστορικής απόδοσης. PostGIS spatial queries, Socket.IO driver tracking, scoring-based assignment που iterate-άρισα με την ομάδα του dispatch.
Η κατάσταση
Μια ομάδα dispatch συντονίζει οδηγούς σε όλη την πόλη. Οι παραγγελίες μπαίνουν όλη μέρα, και για την καθεμία κάποιος πρέπει να αποφασίσει ποιος οδηγός θα την πάρει. Έχτισα μόνος μου ένα σύστημα που παίρνει αυτή την απόφαση μόλις μπει η παραγγελία. Είναι εσωτερικό εργαλείο μιας ομάδας, χωρίς δημόσια διεύθυνση.
Ο dispatcher βλέπει τους πάντες
Κάθε οδηγός τρέχει μια εφαρμογή στο κινητό του που στέλνει τη θέση του συνεχώς. Ο dispatcher δεν ρωτάει πια στο τηλέφωνο πού βρίσκεται κανείς: τους βλέπει όλους μαζί πάνω στον χάρτη, να κινούνται.
Πώς λειτουργεί
- Δύο κατευθύνσεις, χωριστά: το Socket.IO κρατά ξεχωριστά κανάλια για τους οδηγούς, που ανεβάζουν θέση, και για τους dispatchers, που κατεβάζουν τον ζωντανό χάρτη.
- Ο χάρτης: React 19 με TanStack Query για τα δεδομένα, Mapbox GL για την απόδοση του χάρτη.
- Ο πυρήνας: Fastify σε Node 22, PostgreSQL με την επέκταση PostGIS, Drizzle ORM από πάνω.
Η ανάθεση γίνεται μόνη της
Όταν μπαίνει νέα παραγγελία, το σύστημα διαλέγει τον οδηγό πριν προλάβει κάποιος να κοιτάξει τον χάρτη. Υπολογίζει ποιοι είναι κοντά, ποιοι είναι ελεύθεροι και ποιοι τα πάνε καλά, και προσφέρει την παραγγελία σε έναν.
Πώς λειτουργεί
- Γιατί PostGIS και όχι κώδικας: haversine για κάθε οδηγό σε κάθε παραγγελία θα φόρτωνε το request path. Η βάση απαντά σε ερωτήματα εντός ακτίνας με ταχύτητα ευρετηρίου, κάτω από 100ms ακόμα και με εκατοντάδες οδηγούς συνδεδεμένους.
- Τι υπολογίζεται χωρικά: ερωτήματα εντός ακτίνας και προσεγγίσεις απόστασης διαδρομής, indexed και τα δύο.
- Η βαθμολογία: σταθμισμένος τύπος που συνδυάζει ευθεία απόσταση, τρέχοντα ενεργό φόρτο, πρόσφατη βαθμολογία και ποσοστό αποδοχής.
Ο κοντινότερος δεν ήταν ο σωστός
Η πρώτη έκδοση του τύπου έδινε μεγάλο βάρος στην απόσταση, όπως θα έκανε ο καθένας. Οι πραγματικές δοκιμές με την ομάδα dispatch έδειξαν ότι ο τρέχων φόρτος μετράει περισσότερο.
Κατέληξα σε ένα σταθμισμένο μείγμα που η ομάδα το πέρασε πάνω σε παλιές μέρες δουλειάς πριν πάμε live, για να δει αν οι επιλογές του συμφωνούν με τις δικές της.
Πώς λειτουργεί
- Πώς επικυρώθηκε: ο τύπος τρέχτηκε έναντι παλιών runs και συγκρίθηκε με τις αναθέσεις που είχε κάνει η ομάδα, πριν βγει σε παραγωγή.
- Τι άλλαξε: το βάρος μετακινήθηκε από την απόσταση προς τον τρέχοντα φόρτο, με την πρόσφατη βαθμολογία και το ποσοστό αποδοχής να λειτουργούν ως διορθώσεις.
Σύνδεσμοι
- Internal-only deployment, no public URL.
Παρόμοια έργα
- TaskFlow: άλλο realtime multi-tenant σύστημα, αλλά task dispatch αντί για delivery dispatch
- Komvos Connect: άλλο Fastify + Drizzle + Socket.IO stack, αλλά κρατήσεις ραντεβού αντί για GIS-based dispatch