Как своя система такси раздаёт заказы: очередь, зоны, час пик
Простым языком для владельца таксопарка: как своя система решает, кому отдать заказ. Очередь на стоянке зоны подачи, соседние зоны и ближайшие машины кругами, рассылка нескольким водителям в час пик, атомарное принятие без двойных назначений, снятие заказа только через диспетчера и что остаётся диспетчерской.
Коротко (TL;DR)
- Своя система такси раздаёт заказ по понятным водителям правилам: сначала первый в очереди на стоянке зоны подачи, потом следующий, потом соседние зоны и ближайшие машины, в несколько кругов.
- В час пик заказ уходит сразу нескольким ближайшим водителям, забирает тот, кто нажал первым.
- Принятие заказа должно быть атомарным: двое нажали одновременно, заказ получил один. Без этого парк ловит двойные назначения.
- Снимать заказ водитель сам не может, только просить диспетчера с причиной. Диспетчер разбирает зависшие заказы и исключения, рутину делает система.
- Цены по прайсу: бот для бизнеса от 80 000 ₽, PWA-приложение от 150 000 ₽, поддержка от 20 000 ₽/мес. Полную систему считаю по объёму.
Сделаю под ключ: разберу задачу, назову срок и цену. Чтобы начать, напишите в Telegram одной фразой.
Разработка ботовРаспределение заказов в такси это набор правил, по которым система решает, какому водителю предложить поездку. В своей системе парка правила обычно такие: очередь на стоянке зоны, где ждёт пассажир, затем соседние зоны и ближайшие машины, а в час пик рассылка нескольким водителям сразу. Поверх правил стоят две защиты: заказ не может достаться двоим, и водитель не может молча его бросить. Ниже разбираю каждое правило простым языком, как для владельца таксопарка.
Очередь на стоянке: кто первым встал, тот первым получил
Город делится на зоны, обычно по районам. В каждой зоне есть стоянка, виртуальная очередь водителей, которые свободны и находятся в этой зоне. Водитель встал в очередь, система запомнила время. Пришёл заказ с адресом подачи в этой зоне, система предлагает его первому в очереди.
Если первый не ответил за отведённые секунды или отказался, заказ уходит второму. Отказавшийся при этом может уйти в конец очереди: так водители не перебирают заказы, ожидая выгодный. Сколько секунд давать на ответ и наказывать ли за отказ, решает парк, это настройки.
Водители к такой схеме привыкли, поэтому в проекте своей системы такси для таксопарка района я сделал раздачу именно так. Контуры 17 районов там выгрузили из прежней системы, поэтому зоны у водителей остались те же.
Соседние зоны и круги поиска
Очередь в зоне может быть пустой. Тогда система ищет дальше, кругами:
- очередь стоянки зоны подачи;
- очереди соседних зон;
- ближайшие свободные машины по координатам, даже если они не стоят в очереди;
- повтор кругов, если никто не взял.
Соседство зон задаётся таблицей: какие районы граничат и в каком порядке их смотреть. Расстояние по прямой здесь обманывает: через реку или железную дорогу машина из «близкой» зоны может ехать дольше, чем из дальней. Поэтому порядок соседей лучше настраивать руками вместе с диспетчером, который знает город.
Если после всех кругов заказ так и не взяли, он не должен тихо висеть. Он попадает к диспетчеру в отдельный список, об этом ниже.
Режим часа пик
Утром, вечером и в непогоду заказов больше, чем машин в очередях. Поочерёдное предложение тогда тормозит: пока заказ ждёт ответа первого водителя, второй и третий простаивают, а пассажир смотрит на таймер.
В режиме часа пик заказ уходит сразу нескольким ближайшим водителям. Кто нажал «Принять» первым, тот и забрал, у остальных заказ исчезает с экрана. Включать режим можно по расписанию, вручную из диспетчерской или по правилу «заказов без машины больше N».
В час пик всплывают ошибки, которых не видно в спокойное время. В кейсе парка однажды у одного водителя оказалось три заказа сразу, а предзаказ висел на нём невидимым. После этого правило стало жёстким: у водителя один текущий заказ, следующий встаёт в очередь и запускается сам, когда текущий закрыт.
Атомарное принятие: как не дать заказ двоим
Самая неприятная ошибка раздачи выглядит так: два водителя нажали «Принять» в одну и ту же долю секунды, оба получили подтверждение и оба едут к пассажиру. Один зря потратил время и бензин, и в следующий раз он не поверит системе.
Защита строится на уровне базы данных. Принятие заказа идёт одной транзакцией: сервер блокирует строку заказа, проверяет, что заказ ещё свободен, назначает водителя и только потом снимает блокировку. Второй запрос ждёт и видит, что заказ уже занят. В PostgreSQL для этого есть блокировка строк SELECT FOR UPDATE: по документации другие транзакции, которые пытаются изменить или заблокировать эти строки, ждут окончания текущей.
Важен порядок блокировок. Та же документация советует брать блокировки на несколько объектов всегда в одном порядке, иначе возможна взаимная блокировка. В системе парка я столкнулся именно с этим: при порядке «сначала водитель, потом заказ» две транзакции ловили взаимную блокировку. Теперь сервер всегда блокирует сначала заказ, потом водителя.
Проверять это нужно нагрузкой, ручной тест одним телефоном гонку не поймает. Последний прогон на копии базы в том проекте: 30 водителей и 20 заказов розданы за 14 секунд, двойных назначений нет.
Контроль отмен
Отмена заказа водителем без контроля превращается в лазейку: водитель берёт заказ, видит, что поездка невыгодная, и уговаривает пассажира отменить. В системе парка заказчик поставил правило: снять заказ водитель сам не может, он отправляет диспетчеру запрос с причиной. Диспетчер видит запрос и решает, переназначить заказ или отменить.
Что ещё я записываю по отменам:
- кто отменил: пассажир, водитель через диспетчера, диспетчер, система по таймауту;
- причину из списка плюс комментарий;
- на каком этапе: до подачи, на месте, в пути.
Из этого руководитель видит отчёт по каждому водителю. Отметку «На месте» в той системе водитель может поставить только в радиусе 500 метров от адреса подачи, так что «приехал» без приезда не пройдёт.
Что остаётся диспетчеру
Автоматическая раздача не убирает диспетчера, она снимает с него рутину. Остаются исключения:
- Зависшие заказы. Сторож раз в минуту складывает их в раздел «Требуют внимания». Зависшим можно считать, например, заказ, который никто не взял после всех кругов, или машину, которая слишком долго едет к подаче.
- Запросы на снятие от водителей с причиной.
- Ручное назначение конкретной машины, когда клиент постоянный или нужен особый автомобиль.
- Заморозка заказа, когда клиент попросил подождать.
- Заказы по телефону от тех, кто не пользуется мессенджерами.
Если хотите посмотреть, как выглядит вход пассажира и водителя в мини-приложении и боте, загляните на страницу разработки ботов: там описано, из чего я собираю такие системы.
Что про это говорит закон
Правила раздачи закон не задаёт, это внутреннее дело парка. Но сама система приёма заказов попадает под 580-ФЗ: журнал заказов, сведения для пассажира, требования к службе заказа, если вы передаёте заказы другим перевозчикам. Пересказывать здесь не буду, всё разобрано в статье про сайт таксопарка и службу заказа по 580-ФЗ. Какие ещё системы нужны парку, смотрите в обзоре IT для таксопарка.
Как я это делаю
- Записываю правила, к которым привыкли водители. Зоны, стоянки, порядок соседей, сколько секунд на ответ, что считается отказом. Ломать привычки водителей на старте опасно: они просто перестанут брать заказы.
- Переношу зоны из прежней системы, если это возможно, и даю руководителю править тарифную сетку и соседей в кабинете самому.
- Делаю принятие заказа одной транзакцией с фиксированным порядком блокировок.
- Гоняю нагрузочный прогон на копии базы без ботов и звонков. В том проекте копия однажды всё-таки позвонила клиентам через телефонию, с тех пор у копии нет учётки АТС.
- Слушаю диспетчеров и водителей после запуска. Живая линия показывает то, чего не ловит ни одна проверка: в кейсе парка с 16 по 28 октября в репозитории 111 коммитов, правки шли каждый день по замечаниям заказчика.
Если вы платите подписку за коробочную диспетчерскую и думаете о своей, почитайте, как запустить своё такси без агрегатора, и посмотрите кейс таксопарка района целиком: там видно, что сделано и что ещё не закрыто.
Сколько стоит своя система раздачи заказов
Полная система такси (пассажир, водитель, диспетчер, руководитель) собирается из нескольких частей, и итог я считаю по объёму. Ориентиры из прайса:
| Что | Цена | Срок |
|---|---|---|
| Бот для бизнеса: заказ, оплата, CRM | от 80 000 ₽ | от 2 недель |
| PWA-приложение: кабинет диспетчера или водителя | от 150 000 ₽ | от 1 месяца |
| Простой бот в мессенджере | от 30 000 ₽ | от 1 недели |
| Технический аудит текущей системы | от 50 000 ₽ | от 1 недели |
| Поддержка после запуска | от 20 000 ₽/мес |
Все цены собраны на странице цен. Безналичная оплата через эквайринг парка обычно идёт отдельным этапом.
Частые вопросы
Водители не взбунтуются против автоматической раздачи?
Если правила те же, к которым они привыкли (очередь на стоянке, соседние зоны), переход проходит спокойнее. Больше всего недовольства вызывают непрозрачные правила, поэтому правила стоит показать водителям заранее, вплоть до места каждого в очереди.
Зачем атомарность, если машин всего пара десятков?
Гонка зависит от одновременных нажатий, размер парка тут не спасает. В час пик, когда заказ уходит нескольким водителям сразу, двое почти наверняка нажмут в одну секунду.
Можно ли оставить диспетчеру ручную раздачу?
Да. Ручное назначение остаётся всегда, автоматика работает по умолчанию, и диспетчер может перехватить любой заказ.
Коротко о главном
- Основа раздачи: очередь стоянки зоны подачи, затем соседние зоны и ближайшие машины, кругами.
- Час пик: рассылка нескольким ближайшим, забирает первый нажавший.
- Принятие заказа одной транзакцией с фиксированным порядком блокировок, проверка нагрузочным прогоном.
- Водитель не снимает заказ сам, только через диспетчера с причиной.
- Диспетчер занимается исключениями: зависшие заказы, телефон, ручные назначения.
Если хотите свою раздачу заказов вместо арендованной диспетчерской, напишите мне в Telegram @chimitdorzhi с кодовым словом «СТОЯНКА». Разберём ваши зоны и правила для водителей.
Своя раздача заказов для таксопарка
Напишите одной фразой, что нужно. Отвечу, что подойдёт, сколько займёт и сколько стоит. Сообщение уже подготовлено.
- Очередь на стоянках, зоны и соседи из вашей прежней системы
- Режим часа пик и один текущий заказ у водителя
- Атомарное принятие заказа без двойных назначений
- Кабинет диспетчера: зависшие заказы, запросы на снятие
Разборы, кейсы и практика — без воды. Выходит регулярно, читать 3–5 минут.


