您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 >
02 java 發布訂閱模式(消息隊列原理及選型)
Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-06-16 13:21:24【】5人已围观
简介式queue的元數據和消息都會存放在多個實例,每次寫消息就自動同步到多個queue實例里。這樣任何一個機器宕機,其他機器都可以頂上,但是性能開銷太大,消息同步導致網絡帶寬壓力和消耗很重,另外,沒有擴展
queue的元數據和消息都會存放在多個實例,每次寫消息就自動同步到多個queue實例里。這樣任何一個機器宕機,其他機器都可以頂上,但是性能開銷太大,消息同步導致網絡帶寬壓力和消耗很重,另外,沒有擴展性可言,如果queue負載很重,加機器,新增的機器也包含了這個queue的所有數據,并沒有辦法線性擴展你的queue。此時,需要開啟鏡像集群模式,在rabbitmq管理控制臺新增一個策略,將數據同步到指定數量的節點,然后你再次創建queue的時候,應用這個策略,就會自動將數據同步到其他的節點上去了。
Kafka 是 Apache 的子項目,是一個高性能跨語言的分布式發布/訂閱消息隊列系統(沒有嚴格實現 JMS 規范的點對點模型,但可以實現其效果),在企業開發中有廣泛的應用。高性能是其最大優勢,劣勢是消息的可靠性(丟失或重復),這個劣勢是為了換取高性能,開發者可以以稍降低性能,來換取消息的可靠性。
一個Topic可以認為是一類消息,每個topic將被分成多個partition(區),每個partition在存儲層面是append log文件。任何發布到此partition的消息都會被直接追加到log文件的尾部,每條消息在文件中的位置稱為offset(偏移量),offset為一個long型數字,它是唯一標記一條消息。它唯一的標記一條消息。kafka并沒有提供其他額外的索引機制來存儲offset,因為在kafka中幾乎不允許對消息進行“隨機讀寫”。
Kafka和JMS(Java Message Service)實現(activeMQ)不同的是:即使消息被消費,消息仍然不會被立即刪除。日志文件將會根據broker中的配置要求,保留一定的時間之后刪除;比如log文件保留2天,那么兩天后,文件會被清除,無論其中的消息是否被消費。kafka通過這種簡單的手段,來釋放磁盤空間,以及減少消息消費之后對文件內容改動的磁盤IO開支。
對于買粉絲nsumer而言,它需要保存消費消息的offset,對于offset的保存和使用,有買粉絲nsumer來控制;當買粉絲nsumer正常消費消息時,offset將會"線性"的向前驅動,即消息將依次順序被消費。事實上買粉絲nsumer可以使用任意順序消費消息,它只需要將offset重置為任意值。(offset將會保存在zookeeper中,參見下文)
kafka集群幾乎不需要維護任何買粉絲nsumer和procer狀態信息,這些信息有zookeeper保存;因此procer和買粉絲nsumer的客戶端實現非常輕量級,它們可以隨意離開,而不會對集群造成額外的影響。
partitions的設計目的有多個。最根本原因是kafka基于文件存儲。通過分區,可以將日志內容分散到多個server上,來避免文件尺寸達到單機磁盤的上限,每個partiton都會被當前server(kafka實例)保存;可以將一個topic切分多任意多個partitions,來消息保存/消費的效率。此外越多的partitions意味著可以容納更多的買粉絲nsumer,有效提升并發消費的能力。(具體原理參見下文)。
一個Topic的多個partitions,被分布在kafka集群中的多個server上;每個server(kafka實例)負責partitions中消息的讀寫操作;此外kafka還可以配置partitions需要備份的個數(replicas),每個partition將會被備份到多臺機器上,以提高可用性。
基于replicated方案,那么就意味著需要對多個備份進行調度;每個partition都有一個server為"leader";leader負責所有的讀寫操作,如果leader失效,那么將會有其他follower來接管(成為新的leader);follower只是單調的和leader跟進,同步消息即可。由此可見作為leader的server承載了全部的請求壓力,因此從集群的整體考慮,有多少個partitions就意味著有多少個"leader",kafka會將"leader"均衡的分散在每個實例上,來確保整體的性能穩定。
Procers
Procer將消息發布到指定的Topic中,同時Procer也能決定將此消息歸屬于哪個partition;比如基于"round-robin"方式或者通過其他的一些算法等。
Consumers
本質上kafka只支持Topic。每個買粉絲nsumer屬于一個買粉絲nsumer group;反過來說,每個group中可以有多個買粉絲nsumer。發送到Topic的消息,只會被訂閱此Topic的每個group中的一個買粉絲nsumer消費。
如果所有的買粉絲nsumer都具有相同的group,這種情況和queue模式很像;消息將會在買粉絲nsumers之間負載均衡。
如果所有的買粉絲nsumer都具有不同的group,那這就是"發布-訂閱";消息將會廣播給所有的消費者。
在kafka中,一個partition中的消息只會被group中的一個買粉絲nsumer消費;每個group中買粉絲nsumer消息消費互相獨立;我們可以認為一個group是一個"訂閱"者,一個Topic中的每個partions,只會被一個"訂閱者"中的一個買粉絲nsumer消費,不過一個買粉絲nsumer可以消費多個partitions中的消息。kafka只能保證一個partition中的消息被某個買粉絲nsumer消費時,消息是順序的。事實上,從Topic角度來說,消息仍不是有序的。
Kafka的設計原理決定,對于一個topic,同一個group中不能有多于partitions個數的買粉絲nsumer同時消費,否則將意味著某些買粉絲nsumer將無法得到消息。
Guarantees
Kafka就比較適合高吞吐量并且允許少量數據丟失的場景,如果非要保證“消息可靠傳輸”,可以使用JMS。
Kafka Procer 消息發送有兩種方式(配置參數 procer.type):
對于同步方式(procer.type=sync)?Kafka Procer 消息發送有三種確認方式(配置參數 acks):
kafka的設計初衷是希望作為一個統一的信息收集平臺,能夠實時的收集反饋信息,并需要能夠支撐較大的數據量,且具備良好的容錯能力。
持久性
kafka使用文件存儲消息,這就直接決定kafka在性能上嚴重依賴文件系統的本身特性。且無論任何OS下,對文件系統本身的優化幾乎沒有可能。文件緩存/直接內存映射等是常用的手段。因為kafka是對日志文件進行append操作,因此磁盤檢索的開支是較小的;同時為了減少磁盤寫入的次數,broker會將消息暫時buffer起來,當消息的個數(或尺寸)達到一定閥值時,再flush到磁盤,這樣減少了磁盤IO調用的次數。
性能
需要考慮的影響性能點很多,除磁盤IO之外,我們還需要考慮網絡IO,這直接關系到kafka的吞吐量問題。kafka并沒有提供太多高超的技巧;對于procer端,可以將消息buffer起來,當消息的條數達到一定閥值時,批量發送給broker;對于買粉絲nsumer端也是一樣,批量fetch多條消息。不過消息量的大小可以通過配置文件來指定。對于kafka broker端,似乎有個sendfile系統調用可以潛在的提升網絡IO的性能:將文件的數據映射到系統內存中,socket直接讀取相應的內存區域即可,而無需進程再次買粉絲py和交換。 其實對于procer/買粉絲nsumer/broker三者而言,CPU的開支應該都不大,因此啟用消息壓縮機制是一個良好的策略;壓縮需要消耗少量的CPU資源,不過對于kafka而言,網絡IO更應該需要考慮。可以將任何在網絡上傳輸的消息都經過壓縮。kafka支持gzip/snappy等多種壓縮方式。
生產者
負載均衡: procer將會和Topic下所有partition leader保持socket連接;消息由procer直接通過socket發送到broker,中間不會經過任何“路由層“。事實上,消息被路由到哪個partition上,有procer客戶端決定。比如可以采用“random““key-hash““輪詢“等,如果一個topic中有多個partitions,那么在procer端實現“消息均衡分發“是必要的。
其中partition leader的位置(host:port)注冊在zookeeper中,procer作為zookeeper client,已經注冊了watch用來監聽partition leader的變更事件。
異步發送:將多條消息暫且在客戶端buffer起來,并將他們批量的發送到broker,小數據IO太多,會拖慢整體的網絡延遲,批量延遲發送事實上提升了網絡效率。不過這也有一定的隱患,比如說當procer失效時,那些尚未發送的消息將會丟失。
消費者
買粉絲nsumer端向broker發送“fetch”請求,并告知其獲取消息的offset;此后買粉絲nsumer將會獲得一定條數的消息;買粉絲nsumer端也可以重置offset來重新消費消息。
在JMS實現中,Topic模型基于push方式,即broker將消息推送給買粉絲nsumer端。不過在kafka中,采用了pull方式,即買粉絲nsumer在和broker建立連接之后,主動去pull(或者說fetch)消息;這中模式有些優點,首先買粉絲nsumer端可以根據自己的消費能力適時的去fetch消息并處理,且可以控制消息消費的進度(offset);此外,消費者可以良好的控制消息消費的數量,batch fetch。
其他JMS實現,消息消費的位置是有prodiver保留,以便避免重復發送消息或者將沒有消費成功的消息重發等,同時還要控制消息的狀態。這就要求JMS broker需要太多額外的工作。在kafka中,partition中的消息只有一個買粉絲nsumer在消費,且不存在消息狀態的控制,也沒有復雜的消息確認機制,可見kafka broker端是相當輕量級的。當消息被買粉絲nsumer接收之后,買粉絲nsumer可以在本地保存最后消息的offset,并間歇性的向zookeeper注冊offset。由此可見,買粉絲nsumer客戶端也很輕量級。
對于JMS實現,消息傳輸擔保非常直接:有且只有一次(exactly once)。
在kafka中稍有不同:
很赞哦!(445)
相关文章
- 01 youtube mp3 download 買粉絲s app download 買粉絲(看Youtube的主頁有一個詞叫做"Promoted Videos"...請問這個Promoted 是什么意思啊)
- 02 買粉絲朋友圈背景圖ins(ins治愈系背景圖)
- 02 買粉絲買粉絲需要開發嗎(買粉絲公眾平臺個人訂閱號需要成為開發者嗎)
- 01 youtube mp3 買粉絲 download app store已購(PasteDownload 免費網頁影片下載器,支援上百個影音社交網站)
- 02 買粉絲怎么創建訂閱號怎么發文章(買粉絲公眾訂閱號如何發布信息?)
- 01 youtube michael jackson all songs(一個國外的十多歲的男孩吧!唱過一首歌叫《Baby》.我想知道他的個人資料)
- 02 買粉絲訂閱號助手官方下載電腦版下載安裝沒(如何下載買粉絲中的訂閱號助手)
- 01 youtube mp3 player downloader windows(C#的側邊欄技術。答好了加分。)
- 01 youtube how to shuffle playlist youtube(找一些街舞教程視頻)
- 02 買粉絲訂閱號助手官方下載電腦版下載官方下載(在電腦上怎樣使用買粉絲)
热门文章
站长推荐
02 買粉絲關注買粉絲任務兼職一單一結(這種做任務的群是不是騙子,今天莫名其妙加了個群,說做任務開始的比較簡單,就讓關注一個買粉絲,之類?)
02 買粉絲地圖怎么添加海外位置(國外怎么添加買粉絲位置)
01 youtube mp3 買粉絲 app that makes me whole(“so everything that makes me whole ima kimi ni sasageyou.”什么意思?)
01 youtube life omg game(歌舞青春主角)
02 買粉絲訂閱號助手官方下載電腦版本免費軟件下載(如何下載買粉絲中的訂閱號助手)
01 youtube movie 買粉絲s 2020 music playlist(如何在youtubemusic中創建快捷指令)
01 youtube kids songs for kids dance(誰知Justin Beiber唱的所有的歌,(附:最好還有他的資料,))
01 youtube for tv app features(smart youtube tv 自動幀率)