Round Robin Routing
(Created page with "=== Round-robin routing === Combining the callfork module with the ''rotate'' function from regexroute it is possible to implement rou...") |
(→Scenarios) |
||
(8 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | |||
Combining the [[Call_Forker|callfork]] module with the ''rotate'' function from [[Regular expressions|regexroute]] it is possible to implement round-robin routing, with or without fallback. | Combining the [[Call_Forker|callfork]] module with the ''rotate'' function from [[Regular expressions|regexroute]] it is possible to implement round-robin routing, with or without fallback. | ||
+ | |||
+ | == Round-robin routing cases == | ||
+ | |||
+ | ===Round-robin routing with fallback=== | ||
Let's suppose we route all numbers starting with 031 through two main SIP providers and we have one H.323 provider as fallback. | Let's suppose we route all numbers starting with 031 through two main SIP providers and we have one H.323 provider as fallback. | ||
Line 7: | Line 10: | ||
We set in regexroute.conf an entry like this: | We set in regexroute.conf an entry like this: | ||
− | + | ^031.*$=fork $(rotate,$idx031,| sip/sip:\0@provider1.net,| sip/sip:\0@provider2.net) | h323/1010\0@provider3.net;maxcall=20000 | |
− | + | ||
− | + | ==== How it works==== | |
We defined a list of two SIP call targets inside a rotate function. We also use a global (persistent between calls) variable conveniently named $idx031 so we remember it only rotates calls to the 031 prefix. Any other global variable name could be used. | We defined a list of two SIP call targets inside a rotate function. We also use a global (persistent between calls) variable conveniently named $idx031 so we remember it only rotates calls to the 031 prefix. Any other global variable name could be used. | ||
The H.323 fallback route is placed outside the rotate function so it's always called last. The ''maxcall'' parameter of the message applies to all outgoing calls. There is currently no way of setting separate parameters for each individual call. | The H.323 fallback route is placed outside the rotate function so it's always called last. The ''maxcall'' parameter of the message applies to all outgoing calls. There is currently no way of setting separate parameters for each individual call. | ||
+ | |||
+ | ====Scenarios==== | ||
The first call comes in - let's suppose for 0310123. The initial value of variable $idx031 is undefined so zero will be assumed. | The first call comes in - let's suppose for 0310123. The initial value of variable $idx031 is undefined so zero will be assumed. | ||
The following targets will be tried in sequence, each for 20 seconds (set by the maxcall parameter): | The following targets will be tried in sequence, each for 20 seconds (set by the maxcall parameter): | ||
− | SIP: sip:0310123@provider1.net | + | SIP: sip:0310123@provider1.net |
− | SIP: sip:0310123@provider2.net | + | SIP: sip:0310123@provider2.net |
− | H.323: 10100310123@provider3.net | + | H.323: 10100310123@provider3.net |
The first that answers will continue the call. If any of them fails the call will attempt the next target. | The first that answers will continue the call. If any of them fails the call will attempt the next target. | ||
Line 27: | Line 32: | ||
Now a call comes in for 0319876. Since the previous call has changed $idx031 to 1 the attempted targets will be: | Now a call comes in for 0319876. Since the previous call has changed $idx031 to 1 the attempted targets will be: | ||
− | SIP: sip:0319876@provider2.net | + | SIP: sip:0319876@provider2.net |
− | SIP: sip:0319876@provider1.net | + | SIP: sip:0319876@provider1.net |
− | H.323: 10100319876@provider3.net | + | H.323: 10100319876@provider3.net |
− | + | ===Round-robin routing without fallback=== | |
− | + | If instead of ''rotate'' we use the ''index'' function we will get round-robin routing without fallback between the two SIP providers, only with H.323 fallback route. Suppose we route: | |
− | + | ||
− | + | ^031.*$=fork $(index,$idx031,| sip/sip:\0@provider1.net,| sip/sip:\0@provider2.net) | h323/1010\0@provider3.net;maxcall=20000 | |
+ | |||
+ | ====Scenarios==== | ||
The same incoming calls will generate outgoing calls to: | The same incoming calls will generate outgoing calls to: | ||
− | SIP: sip:0310123@provider1.net | + | SIP: sip:0310123@provider1.net |
− | H.323: 10100310123@provider3.net | + | H.323: 10100310123@provider3.net |
and respectively: | and respectively: | ||
− | SIP: sip:0319876@provider2.net | + | SIP: sip:0319876@provider2.net |
− | H.323: 10100319876@provider3.net | + | H.323: 10100319876@provider3.net |
+ | |||
+ | |||
+ | '''See also''' | ||
+ | |||
+ | * [[Call Forker]] | ||
+ | * [[Regular expressions]] | ||
+ | * [[Routing]] | ||
+ | |||
+ | [[Category:Routing]] [[Category:Fallback routing]] |
Latest revision as of 16:01, 31 October 2013
Combining the callfork module with the rotate function from regexroute it is possible to implement round-robin routing, with or without fallback.
Contents |
[edit] Round-robin routing cases
[edit] Round-robin routing with fallback
Let's suppose we route all numbers starting with 031 through two main SIP providers and we have one H.323 provider as fallback.
We set in regexroute.conf an entry like this:
^031.*$=fork $(rotate,$idx031,| sip/sip:\0@provider1.net,| sip/sip:\0@provider2.net) | h323/1010\0@provider3.net;maxcall=20000
[edit] How it works
We defined a list of two SIP call targets inside a rotate function. We also use a global (persistent between calls) variable conveniently named $idx031 so we remember it only rotates calls to the 031 prefix. Any other global variable name could be used.
The H.323 fallback route is placed outside the rotate function so it's always called last. The maxcall parameter of the message applies to all outgoing calls. There is currently no way of setting separate parameters for each individual call.
[edit] Scenarios
The first call comes in - let's suppose for 0310123. The initial value of variable $idx031 is undefined so zero will be assumed. The following targets will be tried in sequence, each for 20 seconds (set by the maxcall parameter):
SIP: sip:0310123@provider1.net SIP: sip:0310123@provider2.net H.323: 10100310123@provider3.net
The first that answers will continue the call. If any of them fails the call will attempt the next target. A side effect of the rotate function is to update the value of the global $idx031 variable. Since we defined only two rotation targets the value will cycle between the values 0 and 1.
Now a call comes in for 0319876. Since the previous call has changed $idx031 to 1 the attempted targets will be:
SIP: sip:0319876@provider2.net SIP: sip:0319876@provider1.net H.323: 10100319876@provider3.net
[edit] Round-robin routing without fallback
If instead of rotate we use the index function we will get round-robin routing without fallback between the two SIP providers, only with H.323 fallback route. Suppose we route:
^031.*$=fork $(index,$idx031,| sip/sip:\0@provider1.net,| sip/sip:\0@provider2.net) | h323/1010\0@provider3.net;maxcall=20000
[edit] Scenarios
The same incoming calls will generate outgoing calls to:
SIP: sip:0310123@provider1.net H.323: 10100310123@provider3.net
and respectively:
SIP: sip:0319876@provider2.net H.323: 10100319876@provider3.net
See also