宋 昱
(北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院寬帶網(wǎng)研究中心,北京 100876)
一種高性能即時通訊服務(wù)系統(tǒng)的設(shè)計
宋 昱
(北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院寬帶網(wǎng)研究中心,北京 100876)
即時通信軟件隨著互聯(lián)網(wǎng)的發(fā)展已經(jīng)越來越深入人們的日常生活中,QQ、微信等即時通訊軟件已經(jīng)成為人們生活中必不可少的應(yīng)用?,F(xiàn)有的即時通訊軟件已經(jīng)對傳統(tǒng)電信業(yè)務(wù)形成了強烈的沖擊,有著逐漸取代電信行業(yè)中傳統(tǒng)的語音和短信業(yè)務(wù)的趨勢。大規(guī)模的用戶對即時通訊服務(wù)的質(zhì)量和可靠性提出了較高的要求,在消息可靠傳輸?shù)幕拘枨笊?,還提出了低延時傳輸?shù)囊?,已達到通訊的即時性。本文介紹了一種面對大規(guī)模用戶的高性能即時通訊服務(wù)系統(tǒng)的設(shè)計方案,從系統(tǒng)部署和軟件架構(gòu)兩個方面展現(xiàn)了提高服務(wù)器性能,降低延遲的方法,同時還兼顧了服務(wù)的可靠性。
計算機軟件;即時通訊;服務(wù)器;高性能
本文著錄格式:宋昱. 一種高性能即時通訊服務(wù)系統(tǒng)的設(shè)計[J]. 軟件,2016,37(12):180-183
即時通信是一個基于互聯(lián)網(wǎng)的即時消息傳送的服務(wù)。即時通信最鮮明的特點就是它的即時性,類似于手機短信。發(fā)送消息的一個客戶端發(fā)出消息后,接受消息的客戶端在很短的時間內(nèi)就能收到消息。由于是以互聯(lián)網(wǎng)為依托,所以即時通信的成本非常低,大多數(shù)都是免費的?,F(xiàn)在流行的即時通信軟件有:QQ,微信,易信,來往,陌陌,MSN,ICQ,等。
現(xiàn)代的即時通信軟件不僅可以發(fā)送文本消息,還有發(fā)送圖片、語音消息,進行語音聊天、視頻聊天的功能。大部分即時通信軟件還加入了社交功能。比如QQ的微博,和微信的朋友圈。這極大地方便用戶了解好友的動態(tài),增強了用戶體驗。
隨著互聯(lián)網(wǎng)的廣泛普及,即時通信軟件的使用也變得越來越廣泛。對電信運營商的傳統(tǒng)業(yè)務(wù)造成了一定的沖擊。
即時通信服務(wù)器作為即時通信系統(tǒng)的核心,需要滿足為大規(guī)模的用戶提供可靠的即時聊天服務(wù),所以對即時通信服務(wù)器的高性能與可靠性提出了較高的要求。
因此,本文提出了一種高性能的即時通信服務(wù)器的設(shè)計方案,可以滿足較大規(guī)模的即時通信業(yè)余,同時具有一定的可靠性。
1.1 數(shù)據(jù)庫
數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的建立在計算機存儲設(shè)備上的倉庫,是長期儲存在計算機內(nèi)、有組織的、可共享的數(shù)據(jù)集合[1]。數(shù)據(jù)庫中的數(shù)據(jù)指的是以一定的數(shù)據(jù)模型組織、描述和儲存在一起、具有盡可能小的冗余度、較高的數(shù)據(jù)獨立性和易擴展性的特點并可在一定范圍內(nèi)為多個用戶共享。
數(shù)據(jù)庫主要分為關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫,下面做出簡要介紹。
1.1.1 關(guān)系型數(shù)據(jù)庫
關(guān)系數(shù)據(jù)庫,是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)?,F(xiàn)實世界中的各種實體以及實體之間的各種聯(lián)系均用關(guān)系模型來表示。關(guān)系模型就是指二維表格模型,因而一個關(guān)系型數(shù)據(jù)庫就是由二維表及其之間的聯(lián)系組成的一個數(shù)據(jù)組織。
當(dāng)前主流的關(guān)系型數(shù)據(jù)庫有甲骨文公司的Oracle、MySQL,微軟公司的Microsoft SQL Server等。
1.1.2 非關(guān)系型數(shù)據(jù)庫
非關(guān)系型數(shù)據(jù)庫,即NoSQL數(shù)據(jù)庫。NoSQL一詞,用于指代那些非關(guān)系型的,分布式的,且一般不保證遵循ACID原則的數(shù)據(jù)存儲系統(tǒng)。非關(guān)系型數(shù)據(jù)庫提出與關(guān)系型數(shù)據(jù)庫不同的另一種理念,例如,以鍵值對存儲,且結(jié)構(gòu)不固定,每一個元組可以有不一樣的字段,每個元組可以根據(jù)需要增加一些自己的鍵值對,這樣就不會局限于固定的結(jié)構(gòu),可以減少一些時間和空間的開銷。
當(dāng)前主流的非關(guān)系數(shù)據(jù)庫有Mongodb、CouchDB、Redis、Riak、Membase、Neo4j、Memcache等。
1.1.3 數(shù)據(jù)庫的對比與選擇
關(guān)系型數(shù)據(jù)庫的最大特點就是事務(wù)的一致性:傳統(tǒng)的關(guān)系型數(shù)據(jù)庫讀寫操作都是事務(wù)的,具有ACID的特點,即原子性Atomic,一致性Consistency,隔離性Isolation,持久性Durability,這個特性使得關(guān)系型數(shù)據(jù)庫可以用于幾乎所有對一致性有要求的系統(tǒng)中。但是關(guān)系型數(shù)據(jù)庫為了維護一致性所付出的巨大代價就是其讀寫性能比較差,硬盤I/O是一個很大的瓶頸,在一張包含海量數(shù)據(jù)的表中查詢,效率是非常低的。
而對于數(shù)據(jù)模型比較簡單的應(yīng)用場景,非關(guān)系型數(shù)據(jù)庫的優(yōu)勢則非常明顯。例如面向高性能并發(fā)讀寫的key-value數(shù)據(jù)庫,以鍵值對作為數(shù)據(jù)結(jié)構(gòu),同時所有的數(shù)據(jù)操作以及存儲都在內(nèi)存中進行,這就大大提升了數(shù)據(jù)訪問的性能。所以本文選擇了一款基于Key-Value的NoSQL數(shù)據(jù)庫——Redis。
1.2 服務(wù)器集群
服務(wù)器集群是將一組獨立的計算機系統(tǒng)通過某種機制(網(wǎng)絡(luò)連接)有機的連接起來,組成一個松耦合的多處理器系統(tǒng),部署在這些計算機系統(tǒng)中的應(yīng)用程序可以通過網(wǎng)絡(luò)共享內(nèi)存,進行消息傳送,實現(xiàn)進程間通信,從而實現(xiàn)分布式計算。 從外部來看,它們僅僅是一個系統(tǒng),對外提供統(tǒng)一的服務(wù)。
集群的目的是通過負載均衡(load balance)和失敗轉(zhuǎn)移(failover)技術(shù)實現(xiàn)系統(tǒng)的可擴展性(scalability)和高可用性(high availability)。
本文中的即時通訊服務(wù)器和數(shù)據(jù)庫服務(wù)器都采用了集群技術(shù)來保證使即時通訊系統(tǒng)的性能的可靠性。
1.3 數(shù)據(jù)傳輸方式
現(xiàn)有的計算機網(wǎng)絡(luò)提供的傳輸層協(xié)議有UDP和TCP兩種。TCP協(xié)議提供了面相連接的可靠的數(shù)據(jù)傳輸,而UDP提供的是無連接的不可靠的傳輸服務(wù)。即時通信系統(tǒng)應(yīng)該保證消息傳輸?shù)目煽啃裕詰?yīng)該使用TCP作為傳輸層協(xié)議。HTTP協(xié)議為應(yīng)用層提供了一種無狀態(tài)的請求響應(yīng)機制的數(shù)據(jù)傳輸方式,然而HTTP協(xié)議是基于文本的,報文內(nèi)容的生成與解析效率較低。所以本文采用TCP協(xié)議最為數(shù)據(jù)傳輸方式,同時,為了提高數(shù)據(jù)傳輸?shù)男?,本文使用長連接方式,避免數(shù)據(jù)傳輸過程中頻繁的建立連接、斷開連接而造成的性能的損耗。
1.4 I/O多路復(fù)用機制的選擇
I/O多路復(fù)用是指內(nèi)核一旦發(fā)現(xiàn)進程指定的一個或者多個I/O條件準備讀取,它就通知該進程。I/O多路復(fù)用適用于需要處理大量socket描述符的場景中。相比較用多線程的處理方法,I/O多路復(fù)用最大優(yōu)勢是系統(tǒng)開銷小。對于高性能即時通信服務(wù)器來說,I/O多路復(fù)用技術(shù)是必不可少的。
現(xiàn)有的I/O多路復(fù)用的方法主要有select,poll和epoll。Select在幾乎所有平臺上都支持,其良好的跨平臺支持是它的主要的也是為數(shù)不多的優(yōu)點之一。它的缺點有:(1)單個進程能夠監(jiān)視的文件描述符的數(shù)量存在最大限制(2)select需要復(fù)制大量的句柄數(shù)據(jù)結(jié)構(gòu),產(chǎn)生巨大的開銷(3)select返回的是含有整個句柄的列表,應(yīng)用程序需要遍歷整個列表才能發(fā)現(xiàn)哪些句柄發(fā)生了事件。Poll相比較于select,它沒有select的第一個缺點,然而其他的缺點并沒有得到改善。而epoll被認為是性能最好的I/O多路復(fù)用的方法。它沒有select的那些缺點,同時還支持水平觸發(fā)和邊緣觸發(fā)兩種工作模式,使用邊緣觸發(fā)的性能更高。所以本文使用epoll的邊緣觸發(fā)作為I/O復(fù)用的方式。
1.5 內(nèi)存管理
服務(wù)器程序使用內(nèi)存池技術(shù)來主動管理內(nèi)存。服務(wù)器程序會為每個在線用戶維護與其相關(guān)數(shù)據(jù)結(jié)構(gòu)。在用戶登陸或者退出時,不進行內(nèi)存的申請和釋放,而是從內(nèi)存池中分配內(nèi)存。內(nèi)存由內(nèi)存池同意申請和釋放。避免頻繁向系統(tǒng)申請、釋放內(nèi)存而造成性能的損耗。
2.1 網(wǎng)絡(luò)拓撲結(jié)構(gòu)
即時通訊服務(wù)器和數(shù)據(jù)庫服務(wù)器都采用集群模式運行,這兩個集群通過高速局域網(wǎng)互相連接,把即時通訊服務(wù)器訪問數(shù)據(jù)庫的延遲降到最低。
每個即時通訊服務(wù)器都負責(zé)為不同集合的用戶群提供服務(wù),每個數(shù)據(jù)庫服務(wù)器存儲不同集合用戶的數(shù)據(jù)。即時通訊服務(wù)器和數(shù)據(jù)庫服務(wù)器所對應(yīng)的用戶的劃分通過一致性哈希算法進行分配,從而保證在運行動態(tài)添加、刪除某個結(jié)點服務(wù)器不會對整個系統(tǒng)造成影響。
圖1 網(wǎng)絡(luò)拓撲結(jié)構(gòu)Fig.1 Network Topology
當(dāng)有某個服務(wù)器出現(xiàn)錯誤時,其他服務(wù)器其他正常工作的服務(wù)器會接管它的工作,從而保證服務(wù)不會中斷,整個服務(wù)器集群保持一定的冗余性能以應(yīng)對個別服務(wù)器宕機和突發(fā)的大量用戶請求。Redis數(shù)據(jù)庫服務(wù)器通過Redis特有的主從模式保證數(shù)據(jù)的可靠性。同時還可以通過負載均衡服務(wù)器實現(xiàn)各個服務(wù)器結(jié)點的負載均衡,保證服務(wù)的穩(wěn)定性。
2.2 軟件結(jié)構(gòu)
本文的即時通訊服務(wù)程序模仿高性能HTTP反向代理服務(wù)器Nginx的軟件架構(gòu),采用了一個主進程和多個子進程的結(jié)構(gòu),來處理大規(guī)模用戶連接與請求。
子進程,即工作進程,真正負責(zé)進行處理各個用戶的請求。一個用戶的所有服務(wù)都由同一個進程提供,不會有多個進程處理同一個用戶請求的情況發(fā)生。這樣做可以提高每個CPU核心內(nèi)部cache的命中率,從而提高性能。
圖2 服務(wù)器進程關(guān)系Fig.2 Relationship between server processes
圖3 服務(wù)器I/O結(jié)構(gòu)Fig.3 I/O architecture of the server
主進程負責(zé)使用信號機制來控制子進程的行為,同時監(jiān)視所有子進程的運行狀況。當(dāng)子進程發(fā)生錯誤或異常退出后,主進程會自動重新啟動一個新的子進程繼續(xù)工作,從而保證性能不減少。同時,基于信號的控制方式,還可以讓即時通訊服務(wù)在運行時修改服務(wù)配置。當(dāng)需要修改配置時,主進程向舊的子進程發(fā)送信號表示不再處理新的客戶端連接和客戶請求,盡快退出,同時啟動新的子進程,按照新的配置運行。這樣就可以保證在不中斷服務(wù)的情況下更新配置。
子進程的個數(shù)由服務(wù)器的CPU核心個數(shù)決定,一般與CPU核心個數(shù)相等。同時每個進程設(shè)置CPU親緣性,保證每個工作進程都在相同的CPU核心中運行,避免多個工作進程在在不同CPU核心之間的上下文切換,從而減少核心內(nèi)部cache失效的概率,提升cache的命中率,從而獲得最大性能。
每個工作進程的最底層是操作系統(tǒng)提供的socket和epoll接口。Socket使用非阻塞方式,epoll使用邊沿觸發(fā)方式。當(dāng)epoll告知進程某個socket收到消息后,從對應(yīng)的socket中讀出數(shù)據(jù),根據(jù)消息的類型交給制定的消息處理器(Msg Handler)進行處理,生成的相應(yīng)添加到消息隊列(Msg Queue)中,然后再使用對應(yīng)的socket將相應(yīng)消息發(fā)送給客戶端。
本文給出了一種高性能即時通訊服務(wù)系統(tǒng)的設(shè)計方案。使用了Redis數(shù)據(jù)庫保證數(shù)據(jù)庫操作的高性能,同時采用數(shù)據(jù)庫集群保證大規(guī)模數(shù)據(jù)操作的高性能。即時通訊服務(wù)器也采用集群技術(shù)保證系統(tǒng)的穩(wěn)定性,使用TCP長連接、epoll和內(nèi)存池技術(shù)保證即時通信服務(wù)器處理用戶數(shù)據(jù)時的高性能。數(shù)據(jù)庫和即時通訊服務(wù)器在使用集群技術(shù)的基礎(chǔ)上,設(shè)有一定的冗余,保證系統(tǒng)整體的可靠性。
[1] 王軍, 馮鈴, 薛文偉. 服務(wù)器與集群系統(tǒng)節(jié)能技術(shù)研究[J].軟件, 2011, 32(2): 4-8. WANG J, FENG L, XUE W W. A Survey of Energy Efficiency in Computer Servers[J]. Software, 2011, 32(2): 4-8. (in Chinese)
A Design of High Performance Instant Communication System
SONG Yu
(Beijing University of Posts and Telecommunications (Beijing) Broadband Network Research Center, Beijing 100876, China)
Instant communication is more and more necessary for people's lives with the development of the Internet. Some of those instant communication applications have already become a must in the daily life, such as QQ and WeChat. Currently the available instant communication applications are influencing the traditional telecommunications industry more and more strongly, and seem to step by step take the place of those services in traditional telecommunications industry, such as message business and phone call business. There is a big proportion of users who have a higher demand towards the quality of instant communication. They do not only require the basic requirement of message communication reliability, but also demand for low delay transmission, so as to reach the instant of communication. This paper explains the design and implementation of a kind of high-performance instant communication system which has the ability to provide service with a big scale of users. It considers two aspects to improve the performance of server, decrease the delay. One is the deployment of system, the other is the architecture of the software. These two also give the consideration to the reliability of server.
Computer software; Instant communication; Server; High performance
TP393.09
A
10.3969/j.issn.1003-6970.2016.12.038
宋昱(1992-),女,碩士,研究方向:新型智能手機應(yīng)用。