freeswitch架構(gòu)原理?
FreeSWITCH 使用線程模型來(lái)處理并發(fā)請(qǐng)求,每個(gè)連接都在單獨(dú)的線程中進(jìn)行處理。這不僅能提供最大強(qiáng)度的并發(fā),更重要的是,即使某路電話發(fā)生問(wèn)題,也只影響到它所在的線程,而不會(huì)影響到其它電話。FreeSWITCH 的核心非常短小精悍,這也是保持穩(wěn)定的關(guān)鍵。所有其它功能都在外圍的模塊中。模塊是可以動(dòng)態(tài)加載(以及卸載)的,在實(shí)際應(yīng)用中可以只加載用到的模塊。外圍模塊通過(guò)核心提供的 Public API 與核心進(jìn)行通信,而核心則通過(guò)回調(diào)機(jī)制執(zhí)行外圍模塊中的代碼。
核心
FS Core 是 FreeSWITCH 的核心,它包含了關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)和復(fù)雜的代碼,但這些代碼只出現(xiàn)在核心中,并保持了最大限度的重用。外圍模塊只能通過(guò) API 調(diào)用核心的功能,因而核心運(yùn)行在一個(gè)受保護(hù)的環(huán)境中,核心代碼都經(jīng)過(guò)精心的編碼和嚴(yán)格的測(cè)試,最大限度地保持了系統(tǒng)整體的穩(wěn)定。
核心代碼保持了最高度的抽象,因而它可以調(diào)用不同功能,不同協(xié)議的模塊。同時(shí),良好的 API 也使得編寫不同的外圍模塊非常容易。
數(shù)據(jù)庫(kù)
FreeSWITCH 的核心除了使用內(nèi)部的隊(duì)列、哈希表存儲(chǔ)數(shù)據(jù)外,也使用外部的 SQL 數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)。當(dāng)前,系統(tǒng)的核心數(shù)據(jù)庫(kù)使用 SQLite,默認(rèn)的存儲(chǔ)位置是 db/core.db 。 使用外部數(shù)據(jù)庫(kù)的好處是--查詢數(shù)據(jù)不用鎖定內(nèi)存數(shù)據(jù)結(jié)構(gòu),這不僅能提供性能,而且降低了死鎖的風(fēng)險(xiǎn),保證了系統(tǒng)穩(wěn)定。命令 show calls、show channels 等都是直接從數(shù)據(jù)庫(kù)中讀取內(nèi)容并顯示的。由于 SQLite 會(huì)進(jìn)行讀鎖定,因此不建議直接讀取核心數(shù)據(jù)庫(kù)。
系統(tǒng)對(duì)數(shù)據(jù)庫(kù)操作做了優(yōu)化,在高并發(fā)狀態(tài)時(shí),核心會(huì)盡量將幾百條 SQL 一齊執(zhí)行,這大大提高了性能。但在低并發(fā)的狀態(tài)下執(zhí)行顯得稍微有點(diǎn)慢,如一個(gè) channel 已經(jīng)建立了,但還不能在 show channels 中顯示;或者,一個(gè) channel 已經(jīng) destroy 了,還顯示在 show channels 中。但由于這些數(shù)據(jù)只用于查詢,而不用于決策,所以一般沒(méi)什么問(wèn)題。
除核心數(shù)據(jù)庫(kù)外,系統(tǒng)也支持使用 ODBC 方式連接其它數(shù)據(jù)庫(kù),如 PostgreSQL、MySQL等。某些模塊,如 mod_sofia、mod_fifo等都有自己的數(shù)據(jù)庫(kù)(表)。如果在 *nix 類系統(tǒng)上使用 ODBC,需要安裝 UnixODBC,并進(jìn)行正確的配置,