Для своего случая (три равнозначных транка Мультифона) равномерное распределение сделал с использованием внутренней БД Астериска и следующей конструкции в кастомизации:
[SIP-1631797232-outgoing-custom]
exten =>_.!,1,NoOp(--- Outgoing mobile call 1 ---)
same => n,ExecIf($["${DB(mobile/last)}" == "SIP-1631601673-outgoing-custom"]?Set(DB(mobile/last)=${CONTEXT}):Goto(SIP-1631796988-41-outgoing,${EXTEN},1))
same => n,return
[SIP-1631796988-outgoing-custom]
exten =>_.!,1,NoOp(--- Outgoing mobile call 2 ---)
same => n,ExecIf($["${DB(mobile/last)}" == "SIP-1631797232-outgoing-custom"]?Set(DB(mobile/last)=${CONTEXT}):Goto(SIP-1631601673-40-outgoing,${EXTEN},1))
same => n,return
[SIP-1631601673-outgoing-custom]
exten =>_.!,1,NoOp(--- Outgoing mobile call 3 ---)
same => n,ExecIf($["${DB(mobile/last)}" == "SIP-1631796988-outgoing-custom"]?Set(DB(mobile/last)=${CONTEXT}):Goto(SIP-1631797232-21-outgoing,${EXTEN},1))
same => n,return
Каждый раз исходящий вызов фиксирует свой контекст в БД, а последующие вызовы сравнивают сохраненное значение со следующим по списку контекстом исходящих маршрутов и в зависимости от результатов проверки либо выполняют вызов либо "передают" эстафету следующему маршруту .
ПС Конечно получилось не универсально и может быть не шибко красиво - опыта немного. Очень напрягли индексы в маршрутах (вот эти числа 21, 40 и 41) - видимо это какие то индексы присваемые при создании записи в таблице маршрутов.