Esta semana en Peoplecall, hemos puesto en marcha un nuevo sistema de rutas que hemos desarrollado. Hemos puesto los diez años de experiencia en “pegarnos con las rutas” en las especificaciones del diseño y francamente, estamos contentísmos con los resultados.
Y me gustaría compartir aquí un poco de lo que hemos hecho.
Pero primero, vamos a ver en que consiste este sistema.
El sistema de rutas basicamente responde a la pregunta: “El cliente X quiere llamar al número Y, ¿por cual de los puertos de sa lida (ISDN o VoIP) saco la llamada?”. Esta pregunta tiene mas mala leche de la que parece, vamos a ver un ejemplo:
- Una llamada telefónica desde cualquiera de nuestros callshops, por ejemplo, desde uno en Camerún, que está registrado en un servidor de Peoplecall y quiere hacer una llamada a un número de Egipto Móvil.
- El servidor comprueba las credenciales del equipo y realiza una primera comprobación del número, basada en la longitud, por ejemplo si el número tiene dos dígitos solamente, entonces, es claramente erróneo, y rechaza la llamada directamente, evitando asi cargar el resto del sistema ( el 20% de las llamadas vienen así de mal). Si todo está OK, le pregunta al Sistema de Rutas , por donde debe enviar la llamada.
- El Sistema de Rutas decide, en base a una tabla de rutas, el plan de numeración (34 España, 346 España móviles … etc.) y de la carga actual del sistema (qué circuitos están ya ocupados actualmente) por donde se debe enviar la llamada. Una vez decidido el circuto, le responde al servidor de telefonía con la IP, el puerto donde tiene que conectar y algunos datos mas, entre ellos el número que debe marcar.
- El Servidor de telefonía contacta con el equipo de telefonía de terminación, que puede ser una Gateway, un Gatekeeper, etc., con los datos que le ha dado el Sistema de Rutas.
- El equipo de telefonía de terminación pregunta al Sistema de Rutas si la llamada está autorizada
- Si es correcto, el equipo de terminación envía la llamada por el circuito asignado al operador elegido, el que o bien directamente, o bien a traves de uno o mas operadores intermedios, termina la llamada en el operador al que pertenece el móvil de ejemplo (por ejemplo Etisalat).
Ya hemos visto mas o menos lo que tiene que hacer el Sistema de rutas, la parte mas complicada es decidir por donde termina la llamada.
Imaginemos a la persona que decide que el mejor precio y calidad para las llamadas a Egipto Móvil de entre los operadores con los que conectamos es Verizon, en ese caso, escribiríamos:
Egipto Móvil por Verizón
Fácil, bueno, no tanto, porque … ¿Que es Egipto móvil?, aquí entra el plan de numeración, en algún sitio debe estar escrito que Egipto Móvil son todos los números que empiezan por el prefijo 201. Hay algunos mas complicados, por ejemplo Brasil Móvil que tiene casi 100 prefijos.
Por lo tanto necesitamos un plan de numeración que nos traduce de nombre de destino a lista de prefijos, en nuestro actual plan de numeración hay más de 600 destinos diferentes, y no solamente contiene información sobre los prefijos, sino también las longitudes permitidas en cada destino y algunos datos mas.
Y luego … ¿que es Verizón?,
Un carrier de terminación es un conjunto de circuitos, en uno o mas equipos distintos, que tiene una capacidad real y una efectiva por destino, por ejemplo, podemos tener 100 canales con Verizón , pero en el caso de Egipto Móvil solamente nos aseguran 30 llamadas simultáneas.
Por otro lado los carriers fallan o se saturan y debemos tener secuencias de carriers que desborden de unos a otros, tambien es necesario poder repartir llamadas en diferentes proporciones entre una serie de carriers y rutas que se desactivan automaticamente cuando el ASR baja por debajo de un nivel.
Nuestra solucion
Teniendo en cuenta que este sistema debe ser robusto hemos optado por un servidor que lee los datos de un simple fichero de texto, nada de bases de datos, ni webs, ni nada de dependencias que puedan reducir el uptime. El sistema está hecho en C++.
El servidor lee y refresca los datos desde un archivo y tienen un acceso por consola tipo telnet con unos comandos básico como recargar configuración, desactivar un carrier, chequear el estado interno o volcar estado.
El Sistema de Rutas es un intérprete especializado que ejecuta un programa (el fichero de texto) donde se expresa toda la complejidad de las rutas. Este programa tiene variables que conservan el estado del sistema. Y para saber en cada momento como está el sistema, vuelca la lista de variables y sus valores por un puerto.
El programa actual que describe nuestro rutado tiene 2.300 líneas, aquí pongo un trozo para que se vea a que se parece:
154 less_load INTEXT.gw8.load EXT.gw8.calls.tot.capacity 11 INTEXT.gw10.load EXT.gw10.calls.tot.capacity 27
155 str_prepend_save $dst 05# 154 154
156 track carrier.worldcom.load carrier.worldcom.capacity 155 1 0 0 1
157 str_set_save $aux0 worldcom 156 156
158 int_test carrier.worldcom.disabled 2 157 2
159 str_lettersub F 0 1 $dst 158 158
160 less_load INTEXT.gw9.load EXT.gw9.calls.tot.capacity 44 INTEXT.gw13.load EXT.gw13.calls.tot.capacity 110
161 str_prepend_save $dst 06# 160 160
162 track carrier.worldcom_premium.load carrier.worldcom_premium.capacity 161 1 0 0 1
163 str_set_save $aux0 worldcom_premium 162 162
164 int_test carrier.worldcom_premium.disabled 2 163 2
165 str_lettersub F 0 1 $dst 164 164
166 str_lettersub F 0 1 $dst 23 23
167 str_lettersub F 0 1 $dst 64 64
168 str_lettersub F 0 1 $dst 72 72
169 str_lettersub F 0 1 $dst 101 101
Evidentemente esto no lo escribe una persona, porque la posibilidad de equivocarse es enorme, para eso hemos creado un compilador que lee un plan de numeración y la tabla de rutas escritos en un formato mas legible y lo compila en este lenguage.
Lo mas importante de este diseño es que podemos crear nuevas formas de aprovechar nuestras conexiones evolucionando el compilador y el formato de entrada sin tener que tocar para nada el Sistema de Rutas, o en caso necesario, enriqueciendo el lenguaje de rutado con nuevas primitivas.
Lo que hemos visto de en las pruebas en producción es que funciona 100% y que corre que se las pela (a plena carga, el “top” gasta mas CPU que este sistema)… Mi enhorabuena a Patxi, Juce y Sebas …
A ver si otro día escribo un poco sobre el compilador.
Muy interensante.
¿Tenéis implementados códigos de servicio?
Por ejemplo que marcando una numeración precediendo al número oculte el ID de la llamada?
Publicado por: janscas | 05/02/10 en 12:24
Pues tenemos primitivas para modificar el número A, incluso borrarlo, pero para poner el flag de ISDN de privado no.
Es una buena idea, pero tambien ten en cuenta que las llamadas se producen en Callshops (alias Locutorios) y la privacidad del numero A no es tan importante.
Y me alegro que te haya parecido interesante !
Publicado por: Herme García | 05/02/10 en 12:41
Si, la verdad es q es interesante. Gracias!
Publicado por: Janscas | 13/02/10 en 23:11