İçeriğe geç
Blog

Asterisk + WebRTC ile modern çağrı merkezi mimarisi

Asterisk PBX, FreeSWITCH media gateway ve Kamailio SBC kullanarak ölçeklenebilir, WebRTC tabanlı çağrı merkezi tasarımı.

Tarih
Yazar Murat Haktanır
Okuma süresi 2 dk

Cisco veya Avaya gibi tescilli IP santral altyapılarından açık kaynağa geçiş, son 18 ayda maliyetin yanı sıra özelleştirme ihtiyaçları nedeniyle hızlandı. WhatsApp Business, video çağrı, AI temelli IVR gibi modern senaryolar; tescilli platformlarda ya yok ya çok pahalı.

Bileşenleri ayır

Tek bir yazılıma her işi yüklemek (her şeyi Asterisk’te yapmak) ölçeklenmez. Mimariyi 3 katmana ayırıyoruz:

  1. Edge / SBC — Kamailio. SIP trunk + WebRTC sticky load balancing.
  2. PBX / dialplan — Asterisk. Agent yönlendirme, IVR, queue yönetimi.
  3. Media gateway — FreeSWITCH. Konferans, müzik, transcoding, kayıt.

Bu ayrımın faydası: her bileşen bağımsız ölçeklenir; bir hata diğerini sürüklemez.

Kamailio dispatcher

Kamailio, gelen SIP/WebRTC trafiğini Asterisk havuzuna yönlendirir; aktif-pasif failover sağlar:

loadmodule "dispatcher.so"

modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list")
modparam("dispatcher", "flags", 2)  # ping ile dead detection
modparam("dispatcher", "ds_ping_method", "OPTIONS")
modparam("dispatcher", "ds_ping_interval", 8)

route[DISPATCH] {
  if (!ds_select_dst("1", "4")) {  # 1: setid, 4: round-robin with ping
    sl_send_reply("503","All Asterisk nodes down");
    exit;
  }
  t_on_failure("DISPATCH_FAILOVER");
  route(RELAY);
}

dispatcher.list:

1 sip:asterisk-01.internal:5060 0
1 sip:asterisk-02.internal:5060 0

8 saniyede bir OPTIONS pinglenir; cevap gelmeyen node havuzdan çıkarılır.

Asterisk dialplan

Asterisk 20’de chan_pjsip standartlaştı. Queue örneği:

[from-internal]
exten => 100,1,Answer()
 same => n,Queue(support_queue,t,,,300)
 same => n,Voicemail(default@support)
 same => n,Hangup()

Queue agent’ları AOR olarak chan_pjsip üzerinden bağlanır:

[agent-tpl](!)
type=endpoint
context=from-internal
disallow=all
allow=opus,g722,ulaw
webrtc=yes
dtls_auto_generate_cert=yes
media_use_received_transport=yes
ice_support=yes

[agent-101](agent-tpl)
auth=auth-101
aors=agent-101

WebRTC için webrtc=yes + dtls_auto_generate_cert=yes ile self-signed sertifika; üretimde proper CA ile değiştirilir.

FreeSWITCH konferans

Konferans/IVR için FreeSWITCH’in mod_conference modülü; Asterisk’in MeetMe‘sine göre çok daha az kaynak kullanır:

<conference name="kampanya-1234" rate="48000" channels="2"/>

Asterisk’ten FreeSWITCH’e SIP Dial(SIP/freeswitch/...) ile yönlendirme.

WebRTC client

sip.js veya JsSIP ile tarayıcıdan Kamailio’ya WSS bağlantısı:

const ua = new SIP.UA({
  uri: "sip:agent-101@mono.local",
  transportOptions: { wsServers: ["wss://sip.mono.local:8089/ws"] },
  authorizationUser: "agent-101",
  password: process.env.SIP_PASS,
  sessionDescriptionHandlerFactoryOptions: {
    constraints: { audio: true, video: false }
  }
});
ua.start();

Kayıt + kalite

  • Kayıt Asterisk MixMonitor veya FreeSWITCH record ile; S3 uyumlu Garage’a otomatik upload.
  • Kalite OpenSIPs RTPproxy istatistikleri + Grafana MOS dashboard.
  • CDR PostgreSQL Patroni cluster’da; KVKK retention.

Mono’nun pratiği

Üretim kurulumlarımızda:

  • 1200 agent eşzamanlı bağlantıyı 2 Asterisk + 2 FreeSWITCH + 2 Kamailio node ile karşılıyoruz.
  • Medyan WebRTC latency 80-100 ms (Türkiye içi).
  • Recording ortalama 4 dk gecikmeyle Garage S3’te.
  • MOS skoru ortalama 4.2 (üretim trafiği).

Yaygın hatalar

  • Asterisk’i her şey için kullanma çabası. Konferansı FreeSWITCH’e ver.
  • NAT traversal eksikliği. WebRTC için ice_support=yes ve TURN sunucu (coturn) şart.
  • Tek node deployment. Aktif-pasif minimum; aktif-aktif daha iyi.
  • Codec savaşı. Opus tercih; ulaw fallback. G.729 lisans gerektirir.

Sıradaki adımlar

Çağrı merkezi modernizasyonu düşünüyorsanız, Çağrı Merkezi Çözümleri sayfamıza bakabilir; ya da Mono Asterisk vaka çalışması örneğini inceleyebilirsiniz.

telekomses-sistemleri