Как определить, какому менеджеру отправить сообщение в боте
Что проверяют
Умеете ли вы превратить расплывчатое «отправить нужному менеджеру» в явные правила и хранить назначение так, чтобы оно не разваливалось под нагрузкой. Следом обычно спрашивают, что будет, если два сообщения клиента придут одновременно, а менеджер ушёл с линии.
Как отвечать
Сначала уточните правило выбора. Их обычно несколько, и применяются они по порядку:
- закрепление: если у клиента уже есть открытое обращение, сообщение идёт тому же менеджеру. Это самое частое правило, и о нём забывают первым;
- тема: её лучше спросить кнопками инлайн-клавиатуры, чем угадывать по ключевым словам. Текстовый классификатор имеет смысл, когда тем много и есть размеченная история;
- доступность и нагрузка: из менеджеров нужной группы, которые сейчас на смене и онлайн, выбирается тот, у кого меньше открытых диалогов, или следующий по кругу;
- эскалация: если обращение никто не взял за N минут, оно уходит в общую очередь или старшему.
Технически бот на aiogram 3 держит в PostgreSQL таблицы менеджеров, групп и обращений со статусом и назначенным manager_id. Работа с базой асинхронная, через asyncpg или SQLAlchemy в async-режиме, иначе один медленный запрос тормозит обработку всех апдейтов. Назначение делается атомарно: UPDATE ... RETURNING или выбор через SELECT ... FOR UPDATE SKIP LOCKED, чтобы при параллельных апдейтах клиент не достался двоим.
Ответ менеджера должен вернуться клиенту, поэтому обращение связывают с чатом клиента. Удобный вариант: супергруппа с темами, одна тема на обращение, а бот пересылает сообщения между личным чатом и темой по её message_thread_id. Правила маршрутизации выносятся в отдельный слой, чтобы тестировать их без Telegram.
Где спотыкаются
Используют синхронный sqlite3 или requests внутри асинхронных хендлеров. На десятке одновременных клиентов бот начинает отвечать с задержкой в секунды.
Выбирают менеджера заново на каждое сообщение. Клиент получает ответы от трёх разных людей, и контекст разговора теряется.
Не продумывают случай, когда менеджеров нет: ночью, в выходные или когда все заняты. Сообщение просто пропадает, а клиент ждёт ответа, которого не будет.