Dans le contexte actuel où les architectures télécom évoluent vers des solutions cloud-native et microservices, la flexibilité du routage SIP devient un enjeu majeur. Kamailio, en tant que serveur SIP puissant et modulaire, propose des modules comme http_async_client et rtjson qui permettent d’intégrer facilement des décisions de routage dynamiques basées sur des réponses de microservices externes.

Présentation des modules Kamailio

http_async_client

Le module http_async_client permet d’effectuer des requêtes HTTP(S) de manière asynchrone, sans bloquer le traitement des messages SIP. Cela signifie que Kamailio peut interroger un service externe (API REST, microservice) pour obtenir des instructions de routage, tout en continuant à gérer d’autres appels.

Parmi ses paramètres clés, on trouve la gestion du nombre de workers, les timeouts, la configuration TLS pour sécuriser les échanges, et la possibilité de définir des callbacks pour traiter les réponses.

rtjson

Le module rtjson est conçu pour interpréter des réponses JSON structurées et piloter le routage SIP en fonction de ces données. Il permet de définir dynamiquement la R-URI, les proxies sortants, les headers SIP, et même de gérer le forking ou la sérialisation des branches d’appel.

Le format JSON attendu est flexible et peut contenir des instructions précises sur la manière de distribuer l’appel.

Architecture et principe de fonctionnement

Le flux typique est le suivant :

  1. Kamailio reçoit un appel SIP.
  2. Il lance une requête HTTP asynchrone vers un microservice externe via http_async_client.
  3. Le microservice répond avec un JSON décrivant la stratégie de routage.
  4. Kamailio utilise rtjson pour parser cette réponse et appliquer le routage dynamique.

Cette approche asynchrone garantit une haute performance et une bonne scalabilité, car Kamailio ne bloque pas en attendant la réponse.

Exemple d’utilisation

Voici un extrait inspiré de la configuration de PyFreeBilling v3 :

# Déclenchement de la requête asynchrone
http_async_query("http://microservice/api/route", "handle_route_response");

# Route pour traiter la réponse
route[handle_route_response] {
    if (!rtjson_route()) {
        xlog("Erreur dans le routage JSON\n");
        exit;
    }
}

Le microservice retourne un JSON qui peut ressembler à :

{
    "version": "1.0",
    "routing": "serial",
    "routes": [
        {
            "uri": "sip:bob@b.example.org:5060",
            "dst_uri": "sip:192.0.2.1:5060",
            "path": "<sip:192.0.2.2:5084>, <sip:192.0.2.2:5086>",
            "socket": "udp:192.0.2.20:5060",
            "headers": {
                "from": {
                    "display": "Alice",
                    "uri": "sip:alice@a.example.org"
                },
                "to": {
                    "display": "Bob",
                    "uri": "sip:bob@b.example.org"
                },
                "extra": "X-Hdr-A: abc\r\nX-Hdr-B: bcd\r\n"
            },
            "branch_flags": 8,
            "fr_timer": 5000,
            "fr_inv_timer": 30000
        },
        {
            "uri": "sip:bob@b.example.org:5060",
            "dst_uri": "sip:192.0.2.10:5060",
            "path": "<sip:192.0.2.2:5084>, <sip:192.0.2.2:5086>",
            "socket": "udp:192.0.2.20:5060",
            "headers": {
                "from": {
                    "display": "Alice",
                        "uri": "sip:alice@a.example.org"
                    },
                    "to": {
                        "display": "Bob",
                        "uri": "sip:bob@b.example.org"
                    },
                    "extra": "P-Asserted-Identity: <sip:alice@a.example.org>\r\n"
            },
            "branch_flags": 8,
            "fr_timer": 5000,
            "fr_inv_timer": 30000
        },
    ]
}

Kamailio, via rtjson, interprète cette structure pour router l’appel selon les instructions.

Cas d’usage et bénéfices

Cette méthode permet de mettre en place des stratégies avancées comme le Least Cost Routing, le load balancing, ou le failover, tout en gardant une grande souplesse pour adapter la logique métier sans redéployer Kamailio.

Elle s’intègre parfaitement dans des architectures modernes basées sur des microservices, facilitant la maintenance et l’évolution.

Bonnes pratiques et points de vigilance

  • Sécuriser les échanges HTTP avec TLS et authentification.
  • Gérer les erreurs et timeouts pour éviter les blocages.
  • Surveiller les performances et la résilience du système.

Conclusion

Les modules http_async_client et rtjson offrent une solution puissante pour dynamiser le routage SIP avec Kamailio, en s’appuyant sur des microservices externes. Cette approche favorise la flexibilité, la scalabilité et l’adaptabilité des infrastructures télécom.


Liens utiles