亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Netty的消息推送服務(wù)器集群設(shè)計(jì)與實(shí)現(xiàn)

        2018-05-15 08:31:14徐龍光何頂新
        軟件導(dǎo)刊 2018年4期

        徐龍光 何頂新

        摘 要:消息推送是當(dāng)前移動(dòng)應(yīng)用中十分必要的一項(xiàng)技術(shù),服務(wù)者需要使用消息推送以保持用戶活躍度,提高應(yīng)用存留率。為了滿足消息推送的需求和增強(qiáng)推送系統(tǒng)的性能,采用Netty網(wǎng)絡(luò)編程框架并搭建消息推送服務(wù)器集群,使用TCP鏈接發(fā)送心跳包,以保持和維護(hù)連接狀態(tài)進(jìn)行消息推送。通過(guò)性能測(cè)試,結(jié)果表明服務(wù)器集群可以分散鏈接壓力,有效提高服務(wù)性能。

        關(guān)鍵詞:消息推送;Netty;長(zhǎng)連接;服務(wù)器集群

        DOI:10.11907/rjdk.172207

        中圖分類號(hào):TP319

        文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2018)004-0118-02

        Abstract:Information pushing system is a necessary technology in current mobile applications. The server needs to use information pushing to keep the user's liveness and increase the retention rate of the application. In order to meet the needs of information pushing and enhance the performance of pushing system, Using Netty network programming framework building a information pushing service cluster, and using TCP toit is proposed to employ Neety network programming framework to build an information pushing service cluster and use TCP to send heartbeat package to send heartbeat package to maintain the connection status. Through the performance test, the results show that the service cluster can distribute link pressure and improve the service performance effectively.

        Key Words:information pushing; Netty; long polling; server cluster

        0 引言

        消息推送是當(dāng)前移動(dòng)應(yīng)用和網(wǎng)頁(yè)應(yīng)用中常用的一種服務(wù)和技術(shù),目的在于從服務(wù)器端主動(dòng)向客戶發(fā)送消息。常用的推送技術(shù)包括客戶端輪詢、長(zhǎng)連接、APNS、C2DM[1]等,本文采用TCP/IP長(zhǎng)連接方式。消息推送有時(shí)面臨百萬(wàn)級(jí)甚至更多鏈接數(shù),需要由服務(wù)器集群提供足夠的硬件性能和鏈接穩(wěn)定性。

        1 Netty簡(jiǎn)介

        Netty[2]是一個(gè)致力于快速開(kāi)發(fā)的事件驅(qū)動(dòng)的異步網(wǎng)絡(luò)編程框架和工具,它基于JAVA NIO開(kāi)發(fā),開(kāi)發(fā)者可采用Netty基于Channel對(duì)網(wǎng)絡(luò)通信進(jìn)行開(kāi)發(fā)。Netty在提供很好性能的同時(shí),極大地簡(jiǎn)化了網(wǎng)絡(luò)編程,可進(jìn)行如TCP、UDP套接字服務(wù)器的開(kāi)發(fā)。由于Netty的易用性和高性能,其被眾多大型項(xiàng)目采用為網(wǎng)絡(luò)通信模塊的編寫(xiě)框架。

        1.1 Netty優(yōu)化選項(xiàng)

        Netty封裝了JAVA NIO的ByteBuffer為ByteBuf,簡(jiǎn)化了對(duì)緩沖區(qū)的操作。在高性能場(chǎng)景中,可以直接分配堆外內(nèi)存池作為緩沖區(qū),從而減少內(nèi)存拷貝和上下文切換,以此提升性能。Netty下有兩種NIO實(shí)現(xiàn)方式,一種基于Select,另一種基于Epoll[3]。相較于Select,Epoll針對(duì)有大量鏈接時(shí)的情況進(jìn)行了改進(jìn),采用EpollEventLoopGroup替代NioEventLoopGroup作為線程組,在鏈接數(shù)增多時(shí)可以顯著提升性能。

        2 系統(tǒng)設(shè)計(jì)

        2.1 協(xié)議設(shè)計(jì)

        當(dāng)前有一些基于XMPP協(xié)議的推送服務(wù)方案[4],并且有一些方案是代碼開(kāi)源的,但是對(duì)于單純的推送功能,XMPP協(xié)議有相當(dāng)程度的冗余。基于消息推送的目的,重新設(shè)計(jì)一個(gè)通信協(xié)議,并且定義消息模型是十分必要的。如圖1所示為傳輸協(xié)議的設(shè)計(jì)。2個(gè)字節(jié)的消息類型標(biāo)志位用來(lái)表示消息類型,還有2個(gè)字節(jié)代表消息體長(zhǎng)度,之后是消息體。

        消息體設(shè)計(jì)代碼如下:

        public class Message implements Serializable {

        private static final long serialVersionUID = 1L;

        private String type;

        private String content;

        private String sender;

        private String receiver;

        private String format;

        private TimeStamp timestamp;

        ……

        }

        type 為自定義的消息類型,sender表示消息發(fā)送者賬號(hào),reciver表示消息接受者,content表示消息內(nèi)容,與fortmat結(jié)合可以組成任何消息類型,如text、json、xml等。timestamp為時(shí)間戳,用于心跳機(jī)制的斷線重連和傳遞消息傳輸時(shí)間。

        2.2 心跳機(jī)制設(shè)計(jì)

        通常情況下,TCP[5]鏈接一旦連接上,就一直保持開(kāi)啟狀態(tài),但服務(wù)器和客戶端只是保存了鏈接開(kāi)啟狀態(tài),并沒(méi)有實(shí)際的物理通路。并且由于網(wǎng)絡(luò)情況十分復(fù)雜,如果不是正常關(guān)閉TCP鏈接,而是由于網(wǎng)絡(luò)或程序異常導(dǎo)致一方TCP鏈接關(guān)閉,另一方則無(wú)法得知鏈接失效,使客戶端不能自動(dòng)重連,服務(wù)器端也無(wú)法得知對(duì)方已不在線,不能釋放無(wú)效鏈接。雖然現(xiàn)在大多數(shù)TCP協(xié)議的實(shí)現(xiàn)中都有?;疃〞r(shí)器機(jī)制保障鏈接存活,但是其默認(rèn)超時(shí)時(shí)間2h過(guò)長(zhǎng)。不同系統(tǒng)更改超時(shí)時(shí)間方法不一,沒(méi)有通用的API接口,并且在一些特殊的網(wǎng)絡(luò)環(huán)境中還會(huì)使?;顧C(jī)制失效,所以在應(yīng)用層中實(shí)現(xiàn)心跳包是十分必要的。Netty中可以通過(guò)將IdleStateHandler類添加進(jìn)Channel的PipeLine中,實(shí)現(xiàn)指定時(shí)間內(nèi)沒(méi)有讀或?qū)憰r(shí)向?qū)Ψ桨l(fā)送心跳包。系統(tǒng)中,設(shè)計(jì)鏈接失效時(shí)間為100s,每30s如果客戶端沒(méi)有寫(xiě)消息,則向服務(wù)器發(fā)送心跳包;若服務(wù)器沒(méi)有回應(yīng),則利用上次服務(wù)器回應(yīng)的消息體中的Timestamp與當(dāng)前系統(tǒng)時(shí)間進(jìn)行比較;若超過(guò)100s則鏈接失效重連。服務(wù)器接到心跳包則給予回應(yīng)。

        2.3 服務(wù)器集群設(shè)計(jì)

        服務(wù)器集群的搭建[6]主要包括一個(gè)鏈接調(diào)度服務(wù)器,若干數(shù)據(jù)邏輯服和數(shù)據(jù)庫(kù)服務(wù)器,其中,鏈接調(diào)度服務(wù)器也可以使用數(shù)據(jù)邏輯服務(wù)器充當(dāng)。數(shù)據(jù)邏輯服務(wù)器是客戶端真正連接的服務(wù)器,處理各種業(yè)務(wù)邏輯與推送消息,數(shù)據(jù)庫(kù)服務(wù)器基于MysQL[7]構(gòu)建,在本系統(tǒng)中主要負(fù)責(zé)存放各個(gè)鏈接的信息,使各個(gè)獨(dú)立的數(shù)據(jù)邏輯服務(wù)器和鏈接調(diào)度服務(wù)器能夠安全地共享數(shù)據(jù)。服務(wù)器集群框架如圖2所示。

        不同于只使用單臺(tái)服務(wù)器時(shí),客戶端直接向固定服務(wù)器IP發(fā)起登錄請(qǐng)求、建立鏈接,在集群環(huán)境下,客戶端先向鏈接調(diào)度服務(wù)器發(fā)起HTTP請(qǐng)求,獲取相對(duì)空閑機(jī)器的IP,然后再向該空閑機(jī)器發(fā)起登錄請(qǐng)求,建立鏈接。本文自定義一個(gè)Session數(shù)據(jù)模型,主要字段包括綁定的Netty Channel名稱,鏈接綁定的服務(wù)器IP、綁定賬戶的ID等,用來(lái)管理和操作鏈接。用戶在登錄時(shí)將該Session信息存入數(shù)據(jù)庫(kù),可以統(tǒng)計(jì)各服務(wù)器的鏈接數(shù),以及尋找到Session存在于哪臺(tái)服務(wù)器上。鏈接調(diào)度服務(wù)器采用最少鏈接法[8]對(duì)長(zhǎng)連接進(jìn)行調(diào)度,該服務(wù)器利用用戶登錄時(shí)存儲(chǔ)在數(shù)據(jù)庫(kù)里的鏈接信息,統(tǒng)計(jì)各個(gè)數(shù)據(jù)邏輯服務(wù)器的鏈接數(shù)量,使新鏈接總是連上最少鏈接數(shù)的數(shù)據(jù)邏輯服務(wù)器。在一臺(tái)數(shù)據(jù)邏輯服務(wù)器推送消息時(shí),先判斷當(dāng)前Session的鏈接是否存在于當(dāng)前服務(wù)器,若存在,則直接利用該鏈接進(jìn)行消息推送;若不存在,則需要查找數(shù)據(jù)庫(kù),找到該鏈接存在的服務(wù)器,并向該服務(wù)器轉(zhuǎn)發(fā)消息,并由其進(jìn)行消息推送。

        3 性能測(cè)試

        通常的性能測(cè)試需結(jié)合具體應(yīng)用場(chǎng)景,在生產(chǎn)環(huán)境相同的硬件配置下,估計(jì)用戶的實(shí)際操作行為,采用一定策略進(jìn)行模擬,以產(chǎn)生對(duì)服務(wù)器的大量請(qǐng)求。而為了與單機(jī)時(shí)的并發(fā)數(shù)作對(duì)比,以測(cè)試服務(wù)器集群分散請(qǐng)求的能力,考慮平臺(tái)搭建的簡(jiǎn)易型,可以使用VMware虛擬來(lái)搭建服務(wù)集群進(jìn)行測(cè)試。測(cè)試使用的宿主機(jī)配置為CPU: Intel E3-1231 v3 3.4GHz,內(nèi)存32GB,硬盤(pán)為1T機(jī)械硬盤(pán),操作系統(tǒng)為Windows 7。每臺(tái)邏輯服務(wù)器設(shè)定虛擬機(jī)的CPU數(shù)為4,4GB內(nèi)存,20GB硬盤(pán)。測(cè)試采用的策略是,采用Apache JMeter設(shè)定TCP并發(fā)鏈接數(shù),并無(wú)限循環(huán)給服務(wù)器發(fā)送test字符串,服務(wù)器回應(yīng)received字符串。單臺(tái)服務(wù)器測(cè)試數(shù)據(jù)如表1所示,兩臺(tái)服務(wù)器測(cè)試數(shù)據(jù)如表2所示。通過(guò)測(cè)試可以看出,通過(guò)將鏈接壓力分散到不同服務(wù)器上,可以提高并發(fā)鏈接數(shù)。

        4 結(jié)語(yǔ)

        針對(duì)移動(dòng)端APP中消息推送的需求,本文提出一種基于Netty網(wǎng)絡(luò)編程框架的服務(wù)器集群設(shè)計(jì),介紹了Netty框架的原理及優(yōu)勢(shì),并針對(duì)業(yè)務(wù)需求提出了一些優(yōu)化手段,闡述了設(shè)計(jì)中的協(xié)議設(shè)計(jì)、消息模型、心跳機(jī)制以及服務(wù)器集群架構(gòu)。通過(guò)性能測(cè)試,證明可以通過(guò)服務(wù)器集群分散鏈接壓力,提高并發(fā)數(shù),具有一定實(shí)用性。

        參考文獻(xiàn):

        [1] 張長(zhǎng)學(xué),張偉,董智明.移動(dòng)推送技術(shù)面面觀[J].移動(dòng)通信,2011(5):21-27.

        [2] 李林鋒.Netty權(quán)威指南[M].北京:電子工業(yè)出版社,2014.

        [3] 余光遠(yuǎn).基于Epoll的消息推送系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2011.

        [4] 代超.基于Netty的面向移動(dòng)終端的推送服務(wù)設(shè)計(jì)[J].軟件,2015,36(12):1-4.

        [5] 羅亞非.基于TCP 的Socket 多線程通信[J]. 電腦知識(shí)與技術(shù):學(xué)術(shù)交流,2009,5(3):563-565,598.

        [6] 胡曉燕.基于服務(wù)器集群的推送技術(shù)的研究與應(yīng)用[D].南京:南京理工大學(xué),2014.

        [7] 劉鑫.MySQL 和PostgreSQL 的對(duì)比選擇[J]. 沈陽(yáng)工程學(xué)院學(xué)報(bào),2011,7(2):171-173,177.

        [8] 任亨.基于MQTT協(xié)議的消息推送集群系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].沈陽(yáng):中國(guó)科學(xué)院沈陽(yáng)計(jì)算技術(shù)研究所,2014.

        (責(zé)任編輯:黃 ?。?/p>

        手机免费日韩中文字幕| 丰满熟妇人妻av无码区| 精品精品国产自在97香蕉| 亚洲精品第一国产综合亚av| 成年女人永久免费看片| 嗯啊 不要 啊啊在线日韩a| 人妻秘书被社长浓厚接吻| 极品一区二区在线视频观看| 国产片精品av在线观看夜色| 丰满熟女人妻中文字幕免费 | 日韩欧美在线播放视频| 久久精品中文字幕亚洲| 亚洲av专区一区二区| 男人国产av天堂www麻豆| 成人免费777777被爆出| 无码电影在线观看一区二区三区| 区一区一日本高清视频在线观看| 日本办公室三级在线观看| 欧美亅性猛交内射| 国产精品毛片一区二区| 无码 制服 丝袜 国产 另类| 蜜桃视频中文字幕一区二区三区 | 国语对白做受xxxxx在| 性欧美大战久久久久久久久| 无码熟妇人妻AV不卡| 亚洲精品大全中文字幕| 无码毛片内射白浆视频| av一区二区三区人妻少妇| 加勒比黑人在线| 亚洲中字永久一区二区三区| 亚洲国产高清精品在线| 亚洲午夜福利在线视频| 国产亚洲女在线线精品| 亚洲国产综合精品中文| 精品人妖一区二区三区四区| 成l人在线观看线路1| 亚洲欧洲久久久精品| 亚洲av综合色区久久精品| 国产av无码专区亚洲av男同| 久久露脸国产精品| 国产精品中文第一字幕|