OpenSIPS 邂逅 Kafka:構建高效 VoIP 消息處理架構

  • 使用場景
  • 使用步驟
    • 引入模塊
    • 組裝&發送數據
    • 消費數據
    • 故障轉移

使用場景

在這里插入圖片描述

  1. 異步日志處理:將 OpenSIPS 中的 SIP 信令日志、通話記錄(CDR)等數據發送到 Kafka 隊列中。

  2. 事件通知與監控:利用 OpenSIPS 的 event_interface 模塊將 SIP 事件(如呼叫建立、斷開、注冊等)推送到 Kafka

OpenSIPS中事件接口有以下類型:

  • EVENT_DATAGRAM - Publish JSON-RPC notifications using UDP, stable
  • EVENT_FLATSTORE - Text/File backend for events, stable
  • EVENT_KAFKA - Publish JSON-RPC notifications/generic messages to Apache Kafka , stable
  • EVENT_STREAM - Publish JSON-RPC notifications using TCP, stable
  • EVENT_ROUTE - Route triggering based on events, stable
  • EVENT_ROUTING - Event-based routing, stable
  • EVENT_RABBITMQ - Publish JSON-RPC notifications using AMQP over TCP , stable
  • EVENT_VIRTUAL - Aggregator of event backends (failover & balancing), stable
  • EVENT_XMLRPC - Event XMLRPC client module , stable
  1. 分布式消息隊列集成:在復雜的 VoIP 架構中,OpenSIPS 可以通過 Kafka 與其他服務(如計費系統、CRM 系統)解耦

  2. 計費與數據分析:OpenSIPS 生成的 CDR(Call Detail Records)可以通過 Kafka 推送至后端計費系統

  3. 故障隔離與重試機制:在 OpenSIPS 調用外部服務時(如鑒權、計費接口),如果目標服務不可用,可以將請求暫存到 Kafka

  4. 微服務架構下的通信橋梁:在基于微服務的 VoIP 架構中,OpenSIPS 作為 SIP 邊界網關,可通過 Kafka 與其他微服務(如認證服務、媒體控制服務)進行異步通信

  5. 消息廣播與事件驅動架構:OpenSIPS 可將特定的 SIP 事件廣播到 Kafka 的多個主題,供不同的下游服務消費

  6. 性能優化與流量削峰:在高并發場景下,Kafka 可以作為緩沖層,緩解 OpenSIPS 與后端系統之間的流量壓力

  7. 自定義業務邏輯擴展:通過 Kafka 與外部業務邏輯模塊解耦,可以在不影響 OpenSIPS 核心邏輯的前提下,靈活擴展新的業務功能

使用步驟

在這里插入圖片描述

引入模塊

loadmodule "event_kafka.so"
modparam("event_kafka", "broker_id", "[k1]127.0.0.1:9092/opensips?g.linger.ms=100&t.acks=all")

鏈接語法:'kafka:' brokers '/' topic ['?' properties]
properties語法:'g.'|'t.' property '=' value ['&' 'g.'|'t.' property '=' value] ...
可以設置的proroperty參考官方說明

組裝&發送數據

        $json(sql_obj) := "{}";$json(sql_obj/table) = 'acc';$json(sql_obj/method) = $param(method);$json(sql_obj/fromTag) = $param(from_tag);$json(sql_obj/toTag) = $param(to_tag);$json(sql_obj/callid) = $param(callid);$json(sql_obj/sipCode) = $param(sip_code);$json(sql_obj/sipReason) = $param(sip_reason);$json(sql_obj/time) = $param(time);$json(sql_obj/duration) = $param(duration);$json(sql_obj/msDuration) = $param(ms_duration);$json(sql_obj/setuptime) = $param(setuptime);$json(sql_obj/created) = $param(created);kafka_publish("k1", $json(sql_obj), $ci, "kafka_report");

可異步監聽回執

route[kafka_report] {xlog("[$avp(kafka_id)] status=$avp(kafka_status) key=$avp(kafka_key) msg=$avp(kafka_msg)\n");...
}

消費數據

$ bin/kafka-console-consumer.sh   --bootstrap-server 127.0.0.1:9092   --topic opensips --from-beginning{ "status": 1, "dlg_id": "17091151056627", "callid": "1-14809@127.0.0.1", "from_uri": "sip:20250610@127.0.0.1:5060", "from_tag": "1", "to_uri": "sip:tt061013776167200@127.0.0.1:5900", "caller_sock": "127.0.0.1:5900", "caller_contact": "sip:20250610@127.0.0.1:5060", "start_time": 0, "timeout": 0, "caller_in": "20250610", "callee_in": "tt061013776167200", "caller_gateway": "46", "callee_gateway": "9", "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1" }
{ "status": 5, "dlg_id": "17091151056627", "to_uri": "sip:tt061013776167200@127.0.0.1:5900", "to_tag": "1", "callee_contact": "sip:127.0.0.1:5080;transport=UDP", "start_time": "1749459233", "timeout": "1749462833", "caller_in": "20250610", "callee_in": "tt061013776167200", "caller_gateway": "46", "callee_gateway": "9", "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1" }
{ "table": "acc", "method": "INVITE", "fromTag": "1", "toTag": "1", "callid": "1-14809@127.0.0.1", "sipCode": "200", "sipReason": "OK", "time": 1749459233, "duration": 4, "msDuration": 3411, "setuptime": 8, "created": 1749459225, "srcIp": "127.0.0.1", "dstIp": "127.0.0.1", "caller": "20250610", "callee": "331213776167200", "callStartTime": "1749459233.433263", "callEndTime": "1749459236.844957", "callerIn": "20250610", "calleeIn": "tt061013776167200", "callerOut": "20241213ob16701", "calleeOut": "calleeout330613776167200", "callergateway": "46", "calleegateway": "9", "calllevel": "0", "routinglevel": "0", "calleraccount": "1", "calleeaccount": "2", "callerCallid": "1-14809@127.0.0.1", "calleeCallid": "", "area": "", "endSide": "1", "endCode": "9201", "endReason": "caller hang up", "realDuration": "3411", "through_jt": "1", "callerproductid": "", "calleeproductid": "", "routing_path": "9-200-0;", "node_addr": "127.0.0.1:5900", "multi_gw": "", "s_timeout": "", "event_time": "1749459236.847516" }
{ "status": 6, "dlg_id": "17091151056627", "callid": "1-14809@127.0.0.1" }

故障轉移

引入event_virtual/event_flatstore,將事件消息通過隊列傳遞,并且支持故障轉移

異常信息 ->> EVENT ->> KAFKA(故障鏈路 ->> EVENT_VIRTUAL ->> EVENT_FLATSTORE)

loadmodule "event_flatstore.so"
loadmodule "event_kafka.so"
loadmodule "event_virtual.so"startup_route {subscribe_event("E_MY_EVENT", "virtual:FAILOVER kafka:127.0.0.1:9092/opensipsfailover flatstore:/var/log/myevents");
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86034.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《AI大模型應用技術開發工程師》學習總結

以下是對你提供的《AI大模型應用技術開發工程師》課程內容的系統梳理,已去除所有廣告、價格、報名、個人信息等內容,并補全了技術要點,最后給出客觀的學習建議和個人感想,適合公開分享或自我學習參考。 AI大模型應用技術開發工程師…

Python爬蟲實戰:研究LOSO相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網數據的爆炸式增長,個性化推薦系統成為提升用戶體驗的關鍵技術。準確捕捉用戶興趣需要大量多維度數據,但獲取高質量標注數據面臨隱私保護、數據分散等挑戰。網絡爬蟲技術為自動采集用戶行為數據提供了解決方案,而如何有效評估模型在個…

stm32萬年歷仿真+keil5程序

stm32萬年歷 本設計是利用單片機實現一個簡易萬年歷系統,能夠準確顯示時、分、秒信息。用戶可通過特定按鍵對時間進行設置調整,具備基本的時間校準功能,可滿足日常簡易計時需求。運用了stm32單片機模塊內部定時器 / 計數器功能來實現精確計時…

操作系統--名稱解釋

第一章: 操作系統:位于硬件層之上,所有軟件層之下的一個系統軟件,是管理系統中各種軟硬件資源,方便用戶使用計算機系統的程序集合 并發:宏觀上是同時發生,但是再微觀是交替發生的(若干事件在同一時間間隔內發生,單CPU) 并行:微觀上同時發生(要求多個CPU) 共享:系統的資源可以…

2025.6.16-實習

2025.6.18--2025.6.23 1.使用Cocos,從0開發老虎棒子雞2D游戲。實現:AI自動選擇,倒計時,對戰邏輯,播放動畫,設置背景音樂等功能。 2.使用Cocos,開發2D手術游戲。實現:視頻、音頻控制播…

構建你的 AI 模塊宇宙:Spring AI MCP Server 深度定制指南

引言:當模塊化遇見 AI 在微服務架構的海洋中,MCP(Module Communication Protocol)就像一艘智能帆船,它讓不同 AI 模塊的通信變得優雅而高效。本文將帶你構建一艘屬于自己的 AI 智能帆船——自定義 Spring AI MCP Serv…

從數據到洞察:UI前端如何利用大數據優化用戶體驗

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在當今數字化時代,數據如同蘊藏著無限價值的寶藏,源源不斷地產生并積累…

SQLite3 在嵌入式C環境中存儲音頻/視頻文件的專業方案

SQLite3 在嵌入式C環境中存儲音頻/視頻文件的專業方案 在嵌入式系統中存儲大型媒體文件需要平衡存儲效率、訪問速度和資源限制。以下是針對嵌入式C環境的優化方案: 一、存儲策略選擇 1. 直接存儲 vs 文件路徑存儲 方法優點缺點適用場景BLOB直接存儲數據一致性高…

區塊鏈技術概述:從比特幣到Web3.0

目錄 區塊鏈技術概述:從比特幣到Web3.0引言:數字革命的下一篇章1. 區塊鏈技術基礎1.1 區塊鏈定義與核心特征1.2 區塊鏈數據結構可視化 2. 比特幣:區塊鏈的開端2.1 比特幣的核心創新2.2 比特幣交易生命周期 3. 以太坊與智能合約革命3.1 以太坊…

Petrel導入well數據

加載井口位置數據:井頭文件應包括name, X, Y, KB, TD這些基本信息,文件格式為txt或prn格式都可。具體步驟:① input面板下?右鍵import file,進入import file界面,選擇文件格式?well heads(*.*&#xff09…

51c嵌入式~電路~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12175265 一、高頻電路布線的十大絕招 1 多層板布線 高頻電路往往集成度較高,布線密度大,采用多層板既是布線所必須,也是降低干擾的有效手段。在PCB Layout階段,合理的…

【LLM學習筆記3】搭建基于chatgpt的問答系統(下)

目錄 一、檢查結果檢查有害內容檢查是否符合產品信息 二、搭建一個簡單的問答系統三、評估輸出1.當存在一個簡單的正確答案2.當不存在一個簡單的正確答案 一、檢查結果 本章將引領你了解如何評估系統生成的輸出。在任何場景中,無論是自動化流程還是其他環境&#x…

多項目資料如何統一歸檔與權限管理

在多項目管理環境中,統一資料歸檔與權限管控的關鍵在于:規范化文件結構、自動化歸檔流程、分級權限控制。其中,規范化文件結構是實現統一歸檔的第一步,它直接決定后續歸類、檢索和審計的效率。通過預設項目模板,明確文…

【RTP】基于mediasoup的RtpPacket的H.264打包、解包和demo 1:不含擴展

目前打包、解包沒有對擴展進行操作 測試結果 === H.264 RTP Packetization and Depacketization Test ===1. Generating simulated H.264 frames... Generated 6 H.264 frames2. Packetizing H.264 frames to RTP packets...Frame #0 (size: 1535 bytes, I-fra

【AI論文】Sekai:面向世界探索的視頻數據集

摘要:視頻生成技術已經取得了顯著進展,有望成為交互式世界探索的基礎。然而,現有的視頻生成數據集并不適合用于世界探索訓練,因為它們存在一些局限性:地理位置有限、視頻時長短、場景靜態,以及缺乏關于探索…

websocket服務端開發

websocket技術在服務端實時消息的推送和im聊天系統中得到了廣泛應用。作為一名后端研發人員,這其中又有哪些需要了解和注意的問題點呢?接下來,我一一進行闡明。 SpringBoot項目中引入依賴 引入依賴 <!--websocket支持包--> <dependency> <…

學歷信息查詢API (IVYZ9A2B) 的對接實戰 | 天遠API

摘要 本文是天遠API學歷信息查詢API&#xff08;接口代碼&#xff1a;IVYZ9A2B&#xff09;的深度技術解析文檔。作為一名開發者&#xff0c;我將從實際應用場景出發&#xff0c;詳細介紹該接口的調用方法、數據結構和最佳實踐。無論您是在開發招聘系統、教育管理平臺&#xf…

2025年- H84-Lc192--75.顏色分類(技巧、三路指針排序)--Java版

1.題目描述 2.思路 3.代碼實現 class Solution {public void sortColors(int[] nums) {int low 0; // 下一個 0 應該放的位置int mid 0; // 當前檢查的位置int high nums.length - 1; // 下一個 2 應該放的位置while (mid < high) {if (nums[mid] …

使用markRaw實例化echarts對象

在Vue 3中&#xff0c;markRaw 函數用于標記一個對象&#xff0c;使其永遠不會轉換為響應式代理。在 this.chart markRaw(echarts.init(chartDom)); 這行代碼中&#xff0c;加與不加 markRaw 的主要區別在于Vue是否會將ECharts實例轉換為響應式對象。以下是詳細分析&#xff1…

硬件-DAY08(中斷)

一、蜂鳴器學習&#xff08;中斷&#xff09; 二、BSP工程管理 利用BSP工程管理&#xff0c;使文檔顯示不雜亂&#xff1b; 將這些文件分為4類&#xff0c;并保存到4個不同的文件夾里。 首先在新的工程文件夾里創建一個之后我們編寫的類似led驅動&#xff0c;clk驅動等等外設驅…