Ride-Sharing: location search ও driver matching
Ride-Sharing, Geohashes, and Quadtrees
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Location candidate search এবং assignment আলাদা করা
- Geohash/quadtree boundary ও freshness বোঝা
- Driver claim, trip state ও privacy design
সমস্যা দিয়ে শুরু
Passenger ride চান, map-এ কাছের driver দেখায় কিন্তু accept করলে driver আগেই অন্য trip নিয়েছেন। Requirements: live driver availability, nearby candidates, offer/accept, trip state এবং fare/payment workflow। Exact route optimization ও pooling প্রথম scope-এর বাইরে। Location approximate search এবং exclusive assignment আলাদা correctness level চায়। GPS stale বা noisy হতে পারে, তাই nearest মানেই বাস্তবে fastest নয়।
সহজ করে বুঝি
Geospatial index candidate দ্রুত খুঁজে দেয়। Geohash পৃথিবীকে hierarchical cells-এ encode করে; boundary-তে neighboring cells-ও দেখতে হয়। Quadtree area recursively ভাগ করে spatial pruning করে। Redis GEOSEARCH radius/box candidate পেতে পারে; এটি driver reservation নয়। Available driver assignment authoritative conditional transaction দিয়ে করুন। Trip states requested, offered, accepted, started, completed বা cancelled স্পষ্ট transition রাখে।
পরিচিত একটি উপমা
Taxi stand-এ মানচিত্র দেখে কাছের গাড়ি খুঁজে পাওয়া এক কাজ, driver-এর বুকিং খাতায় নিজের নাম নিশ্চিত করা আরেক কাজ। পুরোনো radio খবর শুনে একই গাড়ি দুই যাত্রীকে promise করলে dispute হয়।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart TD D[Driver heartbeat] --> G[Geo candidate index] P[Passenger request] --> M[Candidate matcher] G --> M M --> C[Authoritative driver claim] C --> T[(Trip state database)] T --> O[Offer and acceptance events] O --> A[Driver app] A --> T
Heartbeat location ও freshness update করে। Matcher nearby available-looking candidates খোঁজে। Claim database current availability যাচাই করে exclusive transition করে। Offer timeout হলে release policy চলে। Driver accept race trip state/version দিয়ে সামলান। Location index state stale হলে rejected claim থেকে পরের candidate চেষ্টা করা যায়। Durable trip state live GPS stream-এর থেকে আলাদা।
PHP ও Laravel-এ প্রয়োগ
Assumption: ১০ হাজার online driver প্রতি ৫ সেকেন্ডে heartbeat দিলে প্রায় ২ হাজার location updates/second; GPS payload ও retention বড় হয়। POST /ride-requests, POST /offers/{id}/accept; drivers availability/version, trips rider_id,driver_id,status। নিচের fragment PostgreSQL/MySQL transaction-এ candidate row lock করে; offer expiry, rider authorization এবং full trip workflow আলাদা। Driver model fillable fields configured।
use App\Models\Driver;
use Illuminate\Support\Facades\DB;
$claimed = DB::transaction(function () use ($driverId) {
$driver = Driver::query()->lockForUpdate()->findOrFail($driverId);
if ($driver->status !== 'available') {
return false;
}
$driver->update(['status' => 'offered']);
return true;
});সুবিধা, সীমাবদ্ধতা ও trade-off
Frequent heartbeat freshness বাড়ায়, mobile battery ও network cost বাড়ায়। Strong assignment transaction double-booking কমায়, hot driver contention তৈরি হয়। Nearest geospatial distance সরল কিন্তু road ETA উপেক্ষা করে। Complex matching efficiency বাড়াতে পারে, explainability ও latency কমাতে কঠিন। Precise location privacy-sensitive; access, retention ও operator audit জরুরি।
সাধারণ ভুল
- Geo index result-কে reserved driver ধরা।
- Cell boundary-এর neighboring candidates বাদ দেওয়া।
- Expired offer-এর late acceptance নিঃশর্ত মেনে নেওয়া।
আরও একটু গভীরে
Offer state-এ version/fencing value রেখে stale acceptance reject করুন। Timeout worker এবং accept transaction একই state predicate মানবে। Trip completion payment event idempotent হতে হবে। Quadtree uneven density-তে adaptive partition দেয়, কিন্তু update ও distributed ownership জটিল। Hot city shard-এর capacity rural shard-এর মতো নয়। Location stream retention কমিয়ে aggregated operational metrics রাখুন।
মনে রাখুন
Ride matching-এর search approximate হতে পারে; assignment ও trip transition authoritative, versioned ও exclusive হতে হয়।
নিজে চেষ্টা করুন
একই driver-কে দুই passenger claim করার concurrency test লিখুন। Stale heartbeat, cell boundary এবং late offer acceptance scenario দিন। Map location read permission ও retention policy আলাদা লিখুন।
নিজের বোঝা যাচাই করুন
1. Geo candidate মানেই available?
না। Index stale হতে পারে। Authoritative claim বর্তমান state যাচাই করবে।
2. Geohash boundary সমস্যা?
নিকটবর্তী দুই point আলাদা cell-এ পড়তে পারে। Neighbor search এবং exact distance filtering দরকার।
3. Lock কোথায়?
Assignment invariant-এর authoritative transaction-এ। শুধু matcher-এর local memory lock সব replica সমন্বয় করে না।
4. Late accept কেন reject?
Offer expired বা driver অন্য trip-এ assigned হতে পারে। Version/state predicate stale action ঠেকায়।
5. Heartbeat কমালে কী?
Battery ও bandwidth বাঁচে, freshness কমে। Product tolerance এবং movement pattern দিয়ে interval ঠিক করুন।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।