如何構(gòu)建支持百萬(wàn)并發(fā)量的企業(yè)級(jí)聊天架構(gòu)
譯文【51CTO.com快譯】無(wú)論是在醫(yī)生與患者之間,還是在客戶(hù)與支持代理之間,都需要通過(guò)交流來(lái)交換信息,進(jìn)而解決問(wèn)題。同樣,企業(yè)也需要通過(guò)聊天應(yīng)用來(lái)為用戶(hù)排憂(yōu)解難,并實(shí)現(xiàn)企業(yè)的服務(wù)價(jià)值。下面和我們一起來(lái)探討如何設(shè)計(jì)并構(gòu)建企業(yè)級(jí)的聊天應(yīng)用架構(gòu),以承載數(shù)百萬(wàn)級(jí)的并發(fā)用戶(hù)和消息。
聊天模型的標(biāo)準(zhǔn)架構(gòu)
總的說(shuō)來(lái),標(biāo)準(zhǔn)的聊天體系架構(gòu)包括兩個(gè)主要部分:聊天服務(wù)器引擎和客戶(hù)端聊天部件。
- 聊天服務(wù)器引擎 - 它是負(fù)責(zé)中繼消息操作的多臺(tái)服務(wù)器組合。
- 客戶(hù)端聊天部分 - 它是被安裝在臺(tái)式機(jī)、移動(dòng)設(shè)備上的聊天應(yīng)用程序。
在令牌的協(xié)助下,聊天服務(wù)器引擎掌控著消息從服務(wù)器端發(fā)送、并傳遞到客戶(hù)端設(shè)備上的整個(gè)操作過(guò)程。該引擎通常由如下組件構(gòu)成:
- 聊天WebSocket服務(wù)器
- 聊天WebSocket客戶(hù)端庫(kù)
- 聊天REST API
- 聊天媒體存儲(chǔ)服務(wù)器
對(duì)于一定數(shù)量的用戶(hù)和消息來(lái)說(shuō),標(biāo)準(zhǔn)版本是足以應(yīng)對(duì)的;但是當(dāng)涉及到不同通信信道(如:文本、視頻和語(yǔ)音呼叫),數(shù)百萬(wàn)個(gè)的用戶(hù)連接,以及需要根據(jù)企業(yè)項(xiàng)目進(jìn)行應(yīng)用定制時(shí),該標(biāo)準(zhǔn)架構(gòu)就需要升級(jí)了。
在此,我們引入MirrorFly聊天類(lèi)API架構(gòu),它采用的是基于Erlang的XMPP協(xié)議 + ejabberd服務(wù)器 + Mnesia數(shù)據(jù)庫(kù)。
企業(yè)級(jí)聊天應(yīng)用的架構(gòu)
Ejabberd可以被分為三層:
- 接口層:如上所述,它處理所有與客戶(hù)端往來(lái)的數(shù)據(jù)。
- 邏輯層:這是最為復(fù)雜的一層。它處理所有與XMPP相關(guān)的邏輯、以及諸如:HTTP綁定、訪(fǎng)問(wèn)控制、可擴(kuò)展模塊、以及鉤子(hooks)等其他功能。
- 數(shù)據(jù)層:它處理如何將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中,并確保數(shù)據(jù)的完整性和滿(mǎn)足相應(yīng)的約束。
接口層
該層的主要功能是偵聽(tīng)并等待客戶(hù)端連接到本地端口上,然后按需建立客戶(hù)端與服務(wù)器的連接,交換通信數(shù)據(jù)。由于支持TCP與TLS方式的連接、以及UDP的傳輸形式,因此它充當(dāng)了外部世界與ejabberd服務(wù)器之間的接口。
邏輯層
作為Ejabberd系統(tǒng)中最主要、也是最重要的部分,邏輯層具有如下功能:
- Jabber邏輯(Logics):
客戶(hù)端與服務(wù)器的連接由模塊ejabberd_c2s來(lái)控制,通常走的是TCP的5222號(hào)端口。服務(wù)器與服務(wù)器之間的連接由模塊ejabberd_s2s、ejabberd_s2s_in、以及ejabber_s2s_out來(lái)控制,通常走的是TCP的5269號(hào)端口。而HTTP的綁定,則由模塊ejabberd_http來(lái)控制。
- 路由器(Router):
路由器處理的是各種消息之間的路由,以保證消息能夠最終到達(dá)正確的目的地。例如:當(dāng)Jabber客戶(hù)端向另一個(gè)實(shí)體發(fā)送消息時(shí),第一個(gè)ejabberd通過(guò)查看“to”的屬性,來(lái)判斷該屬性所隱含的主機(jī)是否由自己所托管。如果該消息屬于本地消息,那么應(yīng)當(dāng)交由ejabberd_local來(lái)處理,否則屬于遠(yuǎn)程消息,應(yīng)當(dāng)將其視為s2s消息。
- 模塊(Modules):
除了上述核心的Jabber與路由器邏輯之外,我們將ejabberd的絕大部分稱(chēng)為模塊。由于這些模塊可以隨時(shí)被動(dòng)態(tài)地啟動(dòng)或停止,因此ejabberd服務(wù)器即使在運(yùn)行時(shí)(runtime)也具有高度的可擴(kuò)展性。通常,這些模塊被廣泛地使用在各種擴(kuò)展的場(chǎng)景中(也就是所謂的“XEP”)。
- 鉤子(Hooks):
在某些場(chǎng)景下,您可能需要修改ejabberd服務(wù)器中的核心邏輯。此時(shí)鉤子正好能夠派上用場(chǎng)。鉤子是一種在無(wú)需更改任何現(xiàn)有代碼的基礎(chǔ)上,通過(guò)將新代碼注入目標(biāo)系統(tǒng),進(jìn)而更改ejabberd行為的方法。例如:如果您希望通過(guò)消息過(guò)濾器,以過(guò)濾掉不需要的消息,那么就可以將模塊鉤子添加到“filter_packet/3”鉤子中。而如果您想跟蹤客戶(hù)端發(fā)送的所有消息,則可以編寫(xiě)一個(gè)函數(shù),并鏈接到“user_send_packet/3”中。
- l訪(fǎng)問(wèn)控制(Access Control):
所有用戶(hù)(包括真正的jabber客戶(hù)端用戶(hù)和管理員)信息都是以相同的方式存儲(chǔ)在ejabberd中。他們的所有權(quán)限完全取決于其所屬的組群。因此,ejabberd中的訪(fǎng)問(wèn)控制模塊,使我們能夠按組區(qū)分用戶(hù),從而為不同的用戶(hù)提供不同的服務(wù)。
- 工具與庫(kù)(Utils and Libraries):
出于通用目的,在ejabberd中還存在著其他類(lèi)型的工具與庫(kù),例如:XML處理、SASL身份驗(yàn)證、編碼、日志記錄器等。其中,值得注意的是ejabberd_logger。它是一個(gè)非常實(shí)用的日志模塊,可以被用在各種項(xiàng)目的場(chǎng)景中。
數(shù)據(jù)層
Ejabberd主要使用mnesia作為其“數(shù)據(jù)庫(kù)”。實(shí)際上,mnesia是內(nèi)置在erlang庫(kù)中的一種高性能的鍵值對(duì)(key-value)存儲(chǔ)系統(tǒng)。它具有如下功能:
- 復(fù)制。不同的表可以在多個(gè)節(jié)點(diǎn)間進(jìn)行復(fù)制。
- 交易原子性??梢詫⒁幌盗斜淼牟僮鞣纸M為單個(gè)的原子事務(wù)。
- 位置透明??梢栽谖粗獢?shù)據(jù)真實(shí)位置的情況下,編寫(xiě)各種程序。
- 極快的實(shí)時(shí)數(shù)據(jù)搜索能力。
另外,作為一種可擴(kuò)展的數(shù)據(jù)庫(kù)系統(tǒng),它還提供了復(fù)制和實(shí)時(shí)搜索等功能。當(dāng)然,ejabberd并未強(qiáng)制用戶(hù)使用該數(shù)據(jù)庫(kù)。它也提供了各種ODBC接口,方便用戶(hù)使用其他的數(shù)據(jù)庫(kù)。例如:用戶(hù)可以使用存儲(chǔ)在現(xiàn)有數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù),進(jìn)行身份驗(yàn)證;或者出于某種目的使用其他關(guān)系型數(shù)據(jù)庫(kù)。
通常情況下,mnesia適合于快速的鍵值對(duì)搜索。因此,我們不建議您將其用于“關(guān)系型”數(shù)據(jù)的查找場(chǎng)景中。
使用企業(yè)型聊天架構(gòu)的好處
- 可重用性 - 可以輕松地為其他任何項(xiàng)目重新設(shè)計(jì)聊天組件。
- 可擴(kuò)展性 - 當(dāng)聊天應(yīng)用(或稱(chēng)項(xiàng)目)變得更復(fù)雜、需要服務(wù)于更多的用戶(hù)時(shí),此類(lèi)架構(gòu)能夠應(yīng)對(duì)大量的并發(fā)用戶(hù)數(shù)。
- 定制與集成 - 可以根據(jù)業(yè)務(wù)需求,輕松地將該架構(gòu)進(jìn)行集成與定制。
- 遷移 - 可以輕松地實(shí)現(xiàn)組件之間的遷移,而不會(huì)干擾到其他的服務(wù)器或組件。
總結(jié)
如今,借助微服務(wù)架構(gòu)、Kubernetes、S3 bucket storage、以及XMPP協(xié)議,Ejabberd開(kāi)發(fā)了一整套具有可擴(kuò)展性的企業(yè)級(jí)聊天API架構(gòu)。該架構(gòu)不但簡(jiǎn)單易用,而且能夠支持百萬(wàn)用戶(hù)的并發(fā)規(guī)模。您也去試試吧。
原文標(biāo)題:Key Things to Know: Enterprise Chat Architecture That Connects Millions of Users,作者:Parthiba kumar
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】





























