Sistemas de colas basado en kamailio con redis.

Desde la versión 3.2 deKamailio tiene soporte para Redis. Junto con el módulo memcache, se aproxima al mundo web, algo que favorece a la telefonía en los tiempos que vivimos. :)

Antiguamente para llamar un programa externo y tener información detallada(en tiempo real) en otro sistema te hacía falta usar el modulo de python, xhttp,lua..Todos son muy válidos, pero la velocidad/sencillez que aporta redis no lo aportan los otros sistemas.

Redis es una 'Database' que esta escrita en C que empezó en el 2009, y que esta siendo usada en muchos entornos web. Por otra parte la estructura de datos es orientada en key=>value. Por lo que los que venimos del mundo voip la podemos asociar a la database de Asterisk.

class

Para un sistema de colas es simple. Existe un proceso(o varios) que inserta los datos (Comando RPUSH) y un proceso (worker) que esta a la espera de que el master inserte datos (BLPOP) para poder ejecutar la acción, ahora os dejo un ejemplo:

Inserción de datos (Kamailio):

Para la instalación del módulo de redis, simplemente tenemos que seguir esta guía de la wiki de kamailio cambiando el make FLAVOUR por este:

make FLAVOUR=kamailio include_modules="db_mysql ndb_redis" cfg

Una vez instalado deberemos hacer los siguientes cambios en el kamailio.cfg:

   loadmodule "ndb_redis.so"
modparam("ndb_redis", "server", "name=srvN;addr=127.0.0.1;port=6379;db=0")
route{
  ...
  ...
  ...
  ...
  if(redis_cmd("srvN", "RPUSH calls $ci", "r")) {
    # success
    xlog("===== $redis(r=>type) * $redis(r=>value)\n");
  }
}

Obtención de datos (python):

pip install hiredis
pip install redis

    import redis
    def queue():
        r= redis.StrictRedis(host='127.0.0.1', port=6379, db=1)
        while True:
            (queue, msg) = r.blpop('invites')
            print 'Entrada en la cola %s y con datos %s'%(queue,msg)

    if __name__ == '__main__':
        queue()

Con este módulo se me ocurren varias aplicaciones que realizar:

  • Tener el numero de llamadas que se están cursando.
  • Un sistema de colas para generar los cdrs.
  • Notificación para sistemas de prepago, descontar saldo etc..
  • Notificación de estados de llamadas en un dashboard.

Como veis la aplicación es bastante sencilla, y en sistemas que no sean puramente de voz, viene muy bien para interaccionar con otros programas.

Dentro de poco mostraré la integración de Opensips con Mongodb. Esta database no es que me apasione, pero lo de poder escribir objetos json, es muy rápido para ciertos casos.

kamailio, notifications, python, redis, telefonia, voip,