日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转 Openfire 性能优化

發(fā)布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转 Openfire 性能优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://www.360doc.com/content/12/0601/16/9544_215230754.shtml


Openfire 性能優(yōu)化
2012年05月28日 星期一 15:58

http://blog.csdn.net/smm11230704/article/details/7468010

?

Openfire? 是一個XMPP協(xié)議的IM Server。

基于MINA的java nio服務(wù)器。

一般就是使用mysql來作為數(shù)據(jù)庫,保存配置配置信息、離線信息、用戶數(shù)據(jù)。

官網(wǎng)的數(shù)據(jù)是支持5000人同時在線,使用connectionManager可以實(shí)現(xiàn)支持3.3萬人在線。

這數(shù)據(jù)一點(diǎn)都不漂亮,只能作為一個類似騰訊通的局域網(wǎng)聊天工具使用。

首先說點(diǎn)題外話,我測試用connectionManager。

這是一個openfire提供的連接管理器,作用其實(shí)是數(shù)據(jù)整流。

源碼里是通過阻塞式多線程將信息通過特定端口與openfire提交數(shù)據(jù)。

測試之后的結(jié)果,這玩意嚴(yán)重影響效率,放棄,我們的目標(biāo)不只是3.3萬人。

Openfire使用mysql配合它不知所謂幾乎無效的的Cache機(jī)制就注定無法支撐高并發(fā),

所以第一步,將數(shù)據(jù)庫切換為比較強(qiáng)一點(diǎn)的MongoDB。

但是MongoDB也是有問題的,在高并發(fā)時才會發(fā)現(xiàn),MongoDB的鎖表十分嚴(yán)重,

經(jīng)過調(diào)查發(fā)現(xiàn),MongoDB也比較坑爹,他是使用“全局鎖”的,也就是說,你更新A表的時候,會鎖住B表,數(shù)據(jù)更新后解鎖。

所以作為實(shí)時查詢數(shù)據(jù)庫即使是使用MongoDB的master/slave模式依然不能勝任。

增加解決方案,緩存層,使用redis作為MongoDB的數(shù)據(jù)緩存,在訪問時數(shù)據(jù)時,首先進(jìn)入Cache層訪問redis,如果沒有,再去訪問MongoDB,然后再回頭填充Redis。

OK,數(shù)據(jù)源解決了,接下來確認(rèn)需要在什么地方切入。

1,首先是將用戶信息數(shù)據(jù)切換到MongoDB中。并停止Openfire自己的Roster服務(wù),在管理控制臺設(shè)置 xmpp.client.roster.active = false

2,AuthProvider,這里是登陸模塊,可以繼承接口重寫一個屬于自己的Provider。

重寫authenticate方法,將登陸驗(yàn)證請求交給cache層。

3,離線信息的存儲在之后也會成為負(fù)擔(dān),那么繼承OfflineMessageStore類,重寫屬于自己的離線信息策略,將離線信息保存到Redis中。

4,重寫狀態(tài)更新的廣播:PresenceUpdateHandler中的broadcastUpdate方法。

好了,這時候Openfire已經(jīng)被修改的面目全非,但是效率已經(jīng)不可同日而語了。

這時候還有一個問題,就是Openfire沒有消息保障機(jī)制,也就是說,網(wǎng)絡(luò)不穩(wěn)定的時候,客戶端異常斷線,信息就會發(fā)送到空氣中,

需要再發(fā)送信息的時候?qū)崿F(xiàn)“握手機(jī)制”來保障信息的可靠性。不細(xì)說了,自己百度。

這時候Openfire的在線用戶可以飚到6W無壓力,但是死活上不去了,又被限制了。

在error.log中會發(fā)現(xiàn)類似 “open files too larger” 一類的錯誤,這些是linux系統(tǒng)參數(shù):最大文件打開數(shù)。

在linux下執(zhí)行ulimit -a就能觀察最大的文件打開數(shù),執(zhí)行ulimit -n 350000設(shè)置為35萬,然后kill掉openfire退出控制臺,重新連接控制臺使其生效,重新啟動Openfire。

好吧,這時候用戶量可以飆6W以上了。

XMPP服務(wù)器的測試工具,比較簡單的可以使用tsung來實(shí)現(xiàn),簡單的配置,模擬成千上萬的用戶登陸,并且可以模擬HTTP等其他請求。

接下來就是單臺服務(wù)器容量的問題了,我們服務(wù)器是Dell R710, 64G內(nèi)存 16核CPU,15000轉(zhuǎn)硬盤。

服務(wù)器在這種架構(gòu)下在線用戶數(shù)據(jù)在29W左右,幾乎已經(jīng)是單臺Openfire封頂了。

開始考慮集群,不過Openfire的幾種集群都測試過,效果不理想,有一個神馬war包的插件,弄上去時好時壞,放棄。

還有一個oracle的集群插件,不過在高壓下多臺Openfire直接脫離集群,自己玩自己的了。。。日。

如果到了十萬二十萬左右的在線用戶級別,就放棄掉Openfire,可以嘗試使用tigase試試,盡管我沒試過,不過看過源碼,覺得還是比較可靠。

或者和我們一樣,自己寫通訊服務(wù)器。


轉(zhuǎn)載于:https://my.oschina.net/vdroid/blog/171386

總結(jié)

以上是生活随笔為你收集整理的转 Openfire 性能优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。