EQueue 2.3.2版本发布(支持高可用)
前言
前段時(shí)間針對(duì)EQueue的完善終于告一段落了,實(shí)在值得慶祝,自己的付出和堅(jiān)持總算有了成果。這次新版本主要為EQueue實(shí)現(xiàn)了集群功能,基本實(shí)現(xiàn)了Broker的高可用。另外還增加了很多實(shí)用的功能,對(duì)性能也做了很多優(yōu)化。總之,EQueue越來(lái)越成熟了。
EQueue最新版本信息
Nuget:https://www.nuget.org/packages/EQueue
github:https://github.com/tangxuehua/equeue
版本發(fā)布說(shuō)明
為Broker支持集群部署的功能,解決針對(duì)消息生產(chǎn)者的高可用;
支持顯示無(wú)在線消費(fèi)者的消費(fèi)者分組,并支持刪除這些消費(fèi)者分組;
支持刪除消息時(shí)配置是否需要判斷消息已經(jīng)消費(fèi)過(guò);
完善重置消費(fèi)進(jìn)度的功能,重置后可立即看到效果;
采用雙緩沖隊(duì)列,提高Broker的性能;優(yōu)化后單臺(tái)Broker的性能:單發(fā)10W TPS;單收10W TPS;同時(shí)收發(fā) 8.5W TPS;消息大小為1KB;Broker配置:8核16G,虛擬機(jī);
管理控制臺(tái)功能極大的完善;
可配置按時(shí)間刪除消息,滿足用戶希望消息只保存最近1天的需求;
支持Pull模式,允許高級(jí)用戶自己拉取消息,自己消費(fèi),自己提交消費(fèi)進(jìn)度;
為什么要做高可用
經(jīng)過(guò)了一個(gè)多月的業(yè)余時(shí)間的努力,終于為EQueue增加了Broker的集群功能。作為一個(gè)分布式消息中間件,除了性能之外,我們還關(guān)注其高可用,高可用指的是Broker的高可用。要實(shí)現(xiàn)Broker的高可用,最基本的條件是Broker要支持集群部署的能力。假設(shè)一個(gè)集群內(nèi)我們部署了5臺(tái)Broker,然后掛掉幾臺(tái),如果對(duì)Producer, Consumer都應(yīng)有任何影響,則我們可以說(shuō)Broker支持高可用。
這次發(fā)布的EQueue的版本,實(shí)現(xiàn)了Broker的集群部署,但是還沒(méi)有實(shí)現(xiàn)Broker的主備。所以,在架構(gòu)上來(lái)講,支持了對(duì)Producer的高可用,但是對(duì)Consumer來(lái)說(shuō)還沒(méi)有實(shí)現(xiàn)高可用。因?yàn)槿绻幸慌_(tái)Broker掛了,則Producer可以將消息發(fā)送到Broker集群中的其他的Broker,所以對(duì)Producer沒(méi)有影響。但是對(duì)Consumer是有影響的。因?yàn)榇藭r(shí)掛掉的這臺(tái)Broker上的消息在掛掉的這段時(shí)間內(nèi)就無(wú)法被Consumer消費(fèi)了。必須等到Broker重新起來(lái)后才能被消費(fèi)。而如果實(shí)現(xiàn)了Broker的主備功能,則當(dāng)Broker Master掛掉了,則因?yàn)锽roker Slave還在,所以Consumer可以從Broker Slave上消費(fèi)消息。從而可以做到對(duì)Consumer的高可用。Broker的主備功能,還能保證消息的可靠性。因?yàn)榧僭O(shè)Broker Master的硬盤壞掉了,消息也不會(huì)丟失,因?yàn)锽roker Slave上還有消息。
所以,總結(jié)一下就是:
Broker集群功能解決的是針對(duì)Producer發(fā)送消息的高可用;
Broker主備功能解決的是針對(duì)Consumer消費(fèi)消息的高可用,以及消息的可靠性保證;
新版EQueue架構(gòu)說(shuō)明
下一個(gè)版本的EQueue將會(huì)實(shí)現(xiàn)Broker的主備功能。目前EQueue的高可用部署架構(gòu)如下圖所示:
架構(gòu)說(shuō)明:
總共有Producer, Consumer, Broker, Name Server四種服務(wù)器角色;
Name Server的職責(zé)是負(fù)責(zé)管理所有的Broker,并為Producer,Consumer提供Broker信息以及所有Topic的路由信息;
從部署邏輯上看,Broker Master, Broker Slave是屬于一個(gè)邏輯上的單元,一個(gè)Broker Master可以配置多個(gè)Broker Slave;所以,我設(shè)計(jì)了一個(gè)Broker Group的概念。同一個(gè)Broker Group中可以有一個(gè)Broker Master和多個(gè)Broker Slave;
Broker啟動(dòng)時(shí),
與配置的所有的Name Server建立TCP長(zhǎng)連接;
定時(shí)(5s,可配置)向所有的Name Server注冊(cè)自己的所有信息,主要包括:基本信息、隊(duì)列信息、消費(fèi)信息、生成者信息、消費(fèi)者信息;
Name Server之間無(wú)聯(lián)系,數(shù)據(jù)無(wú)同步;Name Server也可以部署多臺(tái),由于每臺(tái)Broker都會(huì)向所有的Name Server注冊(cè)自己的信息,所以,理論上所有的Name Server里維護(hù)的信息最終都是完全一致的;Name Server不持久化任何東西,啟動(dòng)后只在內(nèi)存中維護(hù)所有Broker上報(bào)上來(lái)的信息;Name Server不與其他任何服務(wù)器主動(dòng)通信;
Broker Slave會(huì)從Broker Master通過(guò)拉的方式同步消息,并存儲(chǔ)到本地磁盤,消息同步為異步同步;
Producer啟動(dòng)時(shí),
與配置的所有Name Server服務(wù)器建立TCP長(zhǎng)連接;
隨機(jī)選擇一臺(tái)Name Server獲取所有可用的Broker列表,對(duì)所有的Broker建立TCP長(zhǎng)連接,并定時(shí)(5s,可配置)更新所有可用的Broker列表;
定時(shí)(1s,可配置)向所有當(dāng)前連接的Broker發(fā)送心跳,將自己的信息注冊(cè)到Broker;
定時(shí)(5s,可配置)從Name Server獲取所有當(dāng)前集群的所有Topic的隊(duì)列信息;
發(fā)送Topic時(shí),如果該Topic的隊(duì)列信息在本地存在,則直接從本地獲取隊(duì)列信息;如果不存在,則嘗試從Name Server獲取,如果Name Server上獲取不了,則認(rèn)為該Topic下沒(méi)有隊(duì)列信息;如果沒(méi)有獲取到隊(duì)列信息,則會(huì)重試這個(gè)步驟5次(可配置),以保證盡量能發(fā)送消息成功;
Consumer啟動(dòng)時(shí),
從本地獲取該Topic的所有隊(duì)列信息;
從Broker集群中的第一臺(tái)啟動(dòng)的并且可用的Broker獲取所有當(dāng)前在線的消費(fèi)者;
根據(jù)獲取到的隊(duì)列和消費(fèi)者信息,按隊(duì)列個(gè)數(shù)平均的目的為算法,為消費(fèi)者平均分配隊(duì)列,完成消費(fèi)者負(fù)載均衡的目的;
與配置的所有Name Server服務(wù)器建立TCP長(zhǎng)連接;
隨機(jī)選擇一臺(tái)Name Server獲取所有可用的Broker列表,對(duì)所有的Broker建立TCP長(zhǎng)連接,并定時(shí)(5s,可配置)更新所有可用的Broker列表;
定時(shí)(1s,可配置)向所有當(dāng)前連接的Broker發(fā)送心跳,將自己的信息注冊(cè)到Broker;
定時(shí)(5s,可配置)從Name Server獲取所有當(dāng)前集群的所有Topic的隊(duì)列信息;
定時(shí)(每隔1s,可配置)進(jìn)行消費(fèi)者負(fù)載均衡,消費(fèi)者負(fù)載均衡的邏輯是,針對(duì)當(dāng)前消費(fèi)者訂閱的每個(gè)Topic,執(zhí)行下面的邏輯:
Broker的Producer心跳超時(shí)時(shí)間默認(rèn)為10s;Broker的Consumer心跳超時(shí)時(shí)間默認(rèn)為10s;Name Server的Broker超時(shí)時(shí)間未10s;
EQueue管理控制臺(tái)?
因?yàn)橹С至思汗δ?#xff0c;所以管理控制臺(tái)也需要增加相應(yīng)的管理功能支持。主要是要支持以集群為單位查看集群下的所有Broker列表,以Topic為單位查看每個(gè)Topic在哪些Broker上存在,以Consumer Group為單位查看每個(gè)Consumer Group下有哪些消費(fèi)者,每個(gè)消費(fèi)者分別正在消費(fèi)哪些隊(duì)列等;總結(jié)起來(lái),目前的EQueue管理控制臺(tái)支持以下功能:
查看當(dāng)前有哪些集群;
查看某個(gè)集群下有哪些Broker,每個(gè)Broker的發(fā)送TPS,消費(fèi)TPS,總消息堆積數(shù);
查看單個(gè)Broker的詳細(xì)信息,如監(jiān)聽的端口,消息存儲(chǔ)信息,總的發(fā)送和消費(fèi)TPS,Topic數(shù)、隊(duì)列數(shù)、消費(fèi)者組個(gè)數(shù)、消費(fèi)者個(gè)數(shù)、生產(chǎn)者個(gè)數(shù)、該Broker上的隊(duì)列信息、消費(fèi)信息、生產(chǎn)者列表、消費(fèi)者列表,最近發(fā)送的100條消息,隊(duì)列擴(kuò)容、縮容、重置隊(duì)列消費(fèi)進(jìn)度,etc;
查看某個(gè)集群下的隊(duì)列信息、消費(fèi)信息、生產(chǎn)者列表、消費(fèi)者列表;
查看某個(gè)集群下的所有隊(duì)列的發(fā)送TPS,消費(fèi)TPS;
查看某個(gè)集群下根據(jù)消息ID查看某個(gè)消息的詳情;
單個(gè)集群下支持的操作:
新增一個(gè)Topic,該Topic會(huì)自動(dòng)在該集群下的所有Broker上創(chuàng)建;
刪除一個(gè)Topic,該Topic會(huì)自動(dòng)在該集群下的所有Broker上刪除;
Topic的隊(duì)列擴(kuò)容,自動(dòng)在集群下的所有Broker上擴(kuò)容;
Topic的隊(duì)列縮容,自動(dòng)在集群下的所有Broker上縮容;
重置隊(duì)列消費(fèi)進(jìn)度,自動(dòng)在集群下的所有Broker上的該隊(duì)列重置隊(duì)列消費(fèi)進(jìn)度;
支持消息堆積報(bào)警,發(fā)送郵件;
下圖為管理控制臺(tái)的界面,供大家參考理解:
最后,大家對(duì)新版的EQueue的集群功能有興趣的,可以進(jìn)一步觀看我之前在斗魚上直播的視頻(建議Wifi下看):
class="video_iframe" data-vidtype="1" style=" z-index:1; " height="375" width="500" frameborder="0" data-src="https://v.qq.com/iframe/preview.html?vid=w0334aqm27s&width=500&height=375&auto=0" allowfullscreen>
原文鏈接:http://www.cnblogs.com/netfocus/p/5911179.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的EQueue 2.3.2版本发布(支持高可用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Visual Studio 15 Pre
- 下一篇: 10月15日 2016中国开源年会期待您