Load-balancing
De volgende macro doet load-balancing en failover naar meerdere bestemmingen. De bestemmingen bestaan uit volledige dialstrings, zoals die ook aan Dial meegegeven worden. De macro selecteert telkens een random bestemming uit de lijst en probeert die te bereiken. Indien dit mislukt wordt de volgende bestemming (random) uit de lijst gekozen gekozen, etc.
De macro wordt aangeroepen met als eerste argument alle dialstrings gescheiden door '#'. Eventuele extra argumenten worden doorgegeven aan de Dial applicatie.
Voorbeeld:
[to-speakup]
exten = _X.,1,Verbose(1,Outbound call from [${CALLERID(num)}] to [${EXTEN}] via SpeakUp)
exten = _X.,n,Macro(load-balancer,SIP/speakup01/${EXTEN}#SIP/speakup02/${EXTEN},,,)
Asterisk 1.4
Load-balancer macro voor Asterisk 1.4 (gebruikt func_rand.so)
; Voorbeeld
exten = _X.,n,Macro(load-balancer,SIP/speakup01/${EXTEN}#SIP/speakup02/${EXTEN},,)
[macro-load-balancer]
; Route the call using load balancing, tries all routes in random order
; ARG1 : list of dialstrings separated by '#'
; ARG2-4: Dial arguments 2-4
exten = s,1,Verbose(2,Routing call using load-balancing)
exten = s,n,Set(list=${ARG1})
exten = s,n(trynext),Set(current=${RAND(1,${FIELDQTY(list,#)})})
exten = s,n,Set(route=${CUT(list,#,${current})})
exten = s,n,Verbose(0,Routing call from [${CALLERID(num)}] to [${route}] (${current}) on channel [${CHANNEL}])
exten = s,n,Dial(${route},${ARG2},${ARG3},${ARG4})
exten = s,n,Set(list=${CUT(list,#,-$[ ${current} - 1]&$[ ${current} + 1]-)})
exten = s,n,GotoIf(${list}?trynext)
Variant voor aanroep met opgesplitste dialstring. Belt altijd met hetzelfde protocol naar dezelfde extensie naar verschillende hosts.
; Voorbeeld
exten = _X.,n,Macro(load-balancer,SIP,${EXTEN},speakup01#speakup02,,,)
[macro-load-balancer]
; Route the call using load balancing, tries all routes in random order
; ARG1 : proto
; ARG2 : exten
; ARG3 ; list of destinations separated by '#'
; ARG4-6: Dial arguments 2-4
exten = s,1,Verbose(2,Routing call using load-balancing)
exten = s,n,Set(list=${ARG3})
exten = s,n(trynext),Set(current=${RAND(1,${FIELDQTY(list,#)})})
exten = s,n,Set(route=${CUT(list,#,${current})})
exten = s,n,Verbose(0,Routing ${ARG1} call from [${CALLERID(num)}] to [${ARG2}] via [${route}] on channel [${CHANNEL}])
exten = s,n,Dial(${ARG1}/${route}/${ARG2},${ARG4},${ARG5},${ARG6})
exten = s,n,Set(list=${CUT(list,#,-$[ ${current} - 1]&$[ ${current} + 1]-)})
exten = s,n,GotoIf(${list}?trynext)
Asterisk 1.2
Asterisk 1.2 heeft geen RAND(). Deze emuleren we door ${EPOCH} te gebruiken.
Vervang in bovenstaande macro's de volgende regel:
exten = s,n(trynext),Set(current=${RAND(1,${FIELDQTY(list,#)})})
door onderstaande:
exten = s,n(trynext),Set(current=$[((${EPOCH} + ${CALLERID(num)}) % ${FIELDQTY(list,#)}) + 1])
en zorg dat de functie FIELDQTY geladen is (show function FIELDQTY).

