выбор транка
изменение последовательность выбора транков
Сообщений: 147
|
Re: выбор транка
Так и будет ... ) (плюс, к новым вызовам, идет перезапись по диалстатусу ...)
Не будет. Почему - я обяснил постом выше. Про диалстатус - не совсем уловил .. вы про дополнительную нагрузку ?
Ошибка в том, что все вызовы работают с одной, глобальной, переменной. (вместо того, что бы получить из нее значение). А если устранить этот недостаток, то нужно будет отдельно следить, что бы она не вышла за свои пределы. И все равно - не будет гарантии.
Это не ошибка - это изначальная задумка ). Передавать информацию о том, какому следующему оператору нужно звонить, изменяя ее с каждым звонком. Гарантии - это расчет вероятности. Даже если у вас будет 100 звонков в секунду - вероятность изменения переменной менее 1 процента (и чем мощнее сервер - тем меньше вероятность).
Но в корне - он не правильный ...
В чем неправильность ? Приведите пример при какой нагрузке не будет работать мой алгоритм. Только реальность .. мы не берем гипотетический миллион звонков в секунду на одной машине ).
Ваш алгоритм более универсален и в этом его прелесть, но как следствие менее предсказуем и зависит от чужой реализации. Я предпочитаю насколько можно более полно контролировать процесс ).
|
Сообщений: 1573
|
Re: выбор транка
iye: Не будет. Почему - я обяснил постом выше.
Будет, вернее - есть. Проверил ...
Не так сильно, как думал - но выходит (при 4 транках выходил до 8). Начинает выходить уже при 50 вызовах ...
iye: Это не ошибка - это изначальная задумка ).
Я называю ошибкой не планируемые действия системы ... )
Эта "изначальная задумка" приводит к тому, что вызов не обязательно идет через все имеющиеся транки (в случае отказов). Возможна ситуация, когда вызов 4 раза (при 4 имеющихся) стукнется в один и тот же транк! (а он как раз - не пропускает вызов ;) )
Так что - вот так ... !
|
Сообщений: 147
|
Re: выбор транка
Возможна ситуация, когда вызов 4 раза (при 4 имеющихся) стукнется в один и тот же транк!
У вас возникла такая ситуация ? И не совсем понял - пиковая нагрузка была 50 вызовов в секунду ? Есть ли статистика, какой процент составлял повторный вызов того же оператора в рамках 1 звонка ? Слабо верится, что переход между пунктами диалплана настолько медленный.
И что же тогда получается .. либо ровное распределение, либо отказоустойчивость ... точнее перекос в одну из сторон ... разве нет золотой середины ? )
|
Сообщений: 1573
|
Re: выбор транка
iye: У вас возникла такая ситуация ?
Именно такая - не возникла. Возникла, когда 3 раза "стукнулся" в один транк.
Да это видно и так - при анализе этого алгоритма ...
iye: И не совсем понял - пиковая нагрузка была 50 вызовов в секунду ?
Выход за "максимум" начинается уже при 50 ... Чем выше нагрузка, тем дальше (было 8) выход ...
Проблема в том, что все вызовы (абсолютно) активно! работают с одной переменной!
|
Сообщений: 147
|
Re: выбор транка
А насколько ровно распределяются при задании первого входящего рандомом ?
(было 8)
Можете дать статистику или это секрет ?
|
Откуда: Minsk
Сообщений: 55
|
Re: выбор транка
cron333, iye, спасибо вам огромное за такое количество информации и примеров!
Почитав начал пробовать и сразу возник вопрос:
У меня используется TrixBox и мне стало интересно, можно ли как то внедрить эту функцию к уже имеющимся правилам?
Поковырявшись в конфиг файлах, нашел экстеншн outrt-002-outbound, там находятся диалпланы и номера транков, в которые пускать вызов при определенном диалплане.
Т.е. по сути, если я создам экстеншн outrt-002-outbound-custom (к примеру) и опишу в нем те же диалпланы, только с функцией RAND, получиться то что нужно. Не так ли?
Однако есть "но":
1. можно ли "красиво" добавить это правило, что бы к примеру при отключении одного из транков через веб, он бы выпадал из скрипта автоматом.
2. правила с диалпланом у меня выглядят следующим образом:
(отрывок)
[outrt-002-outbound]
include => outrt-002-outbound-custom
exten => _.4xxxxxxxxxx,1,Macro(user-callerid,SKIPTTL,)
exten => _.4xxxxxxxxxx,n,Set(_NODEST=)
exten => _.4xxxxxxxxxx,n,Macro(record-enable,${AMPUSER},OUT,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,7,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,12,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,10,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,8,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,13,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,4,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,6,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,5,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,11,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,2,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(dialout-trunk,9,${EXTEN:1},,)
exten => _.4xxxxxxxxxx,n,Macro(outisbusy,)
Первый аргумент макроса "dialout-trunk"-номер транка (как я понял).
Возможно ли использовать RAND таким образом, что бы он выдавал числа к примеру с 1-5, и с 8-12? Или же тут нужно использовать нечто иное?
Это на случай если отключить транки 6 и 7.
Можно по идее, при каждом новом вызове генерить число и проверять не является ли оно 6 or 7 и если является, то генерить еще раз или добавить/отнять/разделить..
Но тогда время вызова может довольно возрости.
|
Сообщений: 147
|
Re: выбор транка
Первый аргумент макроса "dialout-trunk"-номер транка (как я понял).
Зачем гадать. Возьмите да посмотрите текст макроса macro-dialout-trunk.
Возможно ли использовать RAND таким образом, что бы он выдавал числа к примеру с 1-5, и с 8-12? Или же тут нужно использовать нечто иное?
Это на случай если отключить транки 6 и 7.
Вынесите их из середины диапазона в конец и будет вам счастье. И не нужно будет ничего изобретать.
|
Откуда: Minsk
Сообщений: 55
|
Re: выбор транка
Зачем гадать. Возьмите да посмотрите текст макроса macro-dialout-trunk.
Смотрю :)
Не удобно выносить так транки. Получается копи-пастинг в конфиге. Впринципе если система статична, то это не проблема, а вот если начальство резко решит какой-нибудь транк на другой офис перекинуть, то уже не приятно.
Впринципе это не смертельно, спасибо :)
У меня другой вопрос, вероятно глупый, но все-же:
можно ли макрос (к примеру Macro(dialout-trunk,,,)) использовать как выражение? Т.е. являются ли ответы от него Busy - fals`ом, а Dial - true к примеру?
Спасибо!
|
Сообщений: 147
|
Re: выбор транка
Обрабатывайте переменную DIALSTATUS после вызова диала и будет вам счастье. И я имел ввиду не копирование транков а изменение порядковых номеров так, чтобы неугодные транки находились на окраине диапазона. Тада Когда нада - сужаете границы рандома, когда не нада - раздвигаете. Дешево и сердито )
|
Откуда: Minsk
Сообщений: 55
|
Re: выбор транка
Спасибо за вариант :)
Попробовал что то написать, в деле пока не тестировал - возможности не было.
Выношу на суд вариант с двумя транками при наличии других, но отключенных по каким либо соображениям:
exten => _X.,1,Set(COUNT=2)
exten => _X.,n,Set(RET=${COUNT})
exten => _X.,n,Set(GMIN=1) ;номер первого транка
exten => _X.,n,Set(GMAX=2) ;номер последнего транка
exten => _X.,n(rand),Set(GATE=${RAND(${GMIN}|${GMAX})})
exten => _X.,n(noop),Noop(call trying)
exten => _X.,n,GotoIf($[${RET} > 0]?:busy)
exten => _X.,n,Set(RET=$[${RET} - 1])
exten => _.37[0-2]xxxxxxxx,1,Macro(user-callerid,SKIPTTL,)
exten => _.37[0-2]xxxxxxxx,n,Set(_NODEST=)
exten => _.37[0-2]xxxxxxxx,n,Macro(record-enable,${AMPUSER},OUT,)
exten => _.37[0-2]xxxxxxxx,n,Macro(dialout-trunk,${GATE},${EXTEN:1},,)
exten => _.37[0-2]xxxxxxxx,n,Goto(round)
;
exten => _X.,n(round),GotoIf($[${GATE} < ${GMAX}]?add)
exten => _X.,n,Set(GATE=${GMIN})
exten => _X.,n,Goto(noop)
exten => _X.,n(add),Set(GATE=$[${GATE} + 1])
exten => _X.,n,Goto(noop)
exten => _X.,n(busy),Macro(outisbusy,)
Буду благодарен за любые замечания.
С уважением
P.S. возник вопрос, может кто знает как можно поменять "номер" транка?
P.P.S. вообщем что то не работает конфиг. почему, пока не понял..
|
|