自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

吃透Kafka底層通信機(jī)制后,我把系統(tǒng)網(wǎng)絡(luò)性能提升了10倍以上

開發(fā) 架構(gòu)
我們本文就以Kafka為例來給大家分析一下,Kafka在客戶端與服務(wù)端通信的時(shí)候,底層的一些網(wǎng)絡(luò)通信相關(guān)的機(jī)制如何設(shè)計(jì)以及如何進(jìn)行優(yōu)化的。

這篇文章,給大家聊一個(gè)消息中間件相關(guān)的技術(shù)話題,對(duì)于一個(gè)優(yōu)秀的消息中間件而言,客戶端與服務(wù)端通信的時(shí)候,對(duì)于這個(gè)網(wǎng)絡(luò)通信的機(jī)制應(yīng)該如何設(shè)計(jì),才能保證性能最優(yōu)呢?甚至通過優(yōu)秀的設(shè)計(jì),讓性能提升10倍以上。

我們本文就以Kafka為例來給大家分析一下,Kafka在客戶端與服務(wù)端通信的時(shí)候,底層的一些網(wǎng)絡(luò)通信相關(guān)的機(jī)制如何設(shè)計(jì)以及如何進(jìn)行優(yōu)化的。

1、客戶端與服務(wù)端的交互

假如我們用kafka作為消息中間件,勢(shì)必會(huì)有客戶端作為生產(chǎn)者向他發(fā)送消息,這個(gè)大家應(yīng)該都可以理解。

對(duì)于Kafka來說,他本身是支持分布式的消息存儲(chǔ)的,什么意思呢?

比如說現(xiàn)在你有一個(gè)“Topic”,一個(gè)“Topic”你就可以理解為一個(gè)消息數(shù)據(jù)的邏輯上的集合。

比如現(xiàn)在你要把所有的訂單數(shù)據(jù)都發(fā)送到一個(gè)“Topic”里去,那么這個(gè)“Topic”就叫做“OrderTopic”,里面都放的是訂單數(shù)據(jù)。

接著這個(gè)“Topic”的數(shù)據(jù)可能量很大很大,不可能放在一臺(tái)機(jī)器上吧?

所以呢,我們就可以分散存儲(chǔ)在多臺(tái)Kafka的機(jī)器上,每臺(tái)機(jī)器存儲(chǔ)一部分的數(shù)據(jù)即可。

這就是Kafka的分布式消息存儲(chǔ)的機(jī)制,每個(gè)Kafka服務(wù)端叫做一個(gè)Broker,負(fù)責(zé)管理一臺(tái)機(jī)器上的數(shù)據(jù)。

一起來看看下面的圖:

一個(gè)“Topic”可以拆分為多個(gè)“Partition”,每個(gè)“Partition”存儲(chǔ)一部分?jǐn)?shù)據(jù),每個(gè)Partition都可以放在不同的Kafka Broker機(jī)器上,這樣就實(shí)現(xiàn)了數(shù)據(jù)分散存儲(chǔ)在多臺(tái)機(jī)器上的效果了。

然后客戶端在發(fā)送消息到Kafka Broker的時(shí)候,比如說你限定了“OrderTopic”的訂單數(shù)據(jù)拆分為3個(gè)“Partition”,那么3個(gè)“Partition”分別放在一個(gè)Kafka Broker上,那么也就是要把所有的訂單數(shù)據(jù)分發(fā)到三個(gè)Kafka Broker上去。

此時(shí)就會(huì)默認(rèn)情況下走一個(gè)負(fù)載均衡的策略,舉個(gè)例子,假設(shè)訂單數(shù)據(jù)一共有3萬條,就會(huì)給每個(gè)Partition分發(fā)1萬條訂單消息,這樣訂單數(shù)據(jù)均勻分散在了3臺(tái)Broker機(jī)器上。

整個(gè)過程,如下圖所示:

2、頻繁網(wǎng)絡(luò)通信帶來的性能低下問題

好了,現(xiàn)在問題來了,客戶端在發(fā)送消息給Kafka Broker的時(shí)候,比如說現(xiàn)在要發(fā)送一個(gè)訂單到Kafka上去,此時(shí)他是怎么發(fā)送過去呢?

是直接一條訂單消息就對(duì)應(yīng)一個(gè)網(wǎng)絡(luò)請(qǐng)求,發(fā)送到一臺(tái)Broker上去嗎?

如果是這樣做的話,那勢(shì)必會(huì)導(dǎo)致頻繁的跟一臺(tái)broker進(jìn)行網(wǎng)絡(luò)通信,頻繁的網(wǎng)絡(luò)通信,每次都涉及到復(fù)雜的網(wǎng)絡(luò)連接、傳輸?shù)牧鞒?,那么進(jìn)而會(huì)導(dǎo)致客戶端性能的低下。

給大家舉個(gè)例子,比如說每次通過一個(gè)網(wǎng)絡(luò)通信發(fā)送一條訂單到broker,需要耗時(shí)10ms。

那么如果一個(gè)訂單就一次網(wǎng)絡(luò)通信發(fā)送到broker,每秒最多就是發(fā)送100個(gè)訂單了,大家想想,是不是這個(gè)道理?

但是假如說你每秒有10000個(gè)訂單要發(fā)送,此時(shí)就會(huì)造成你的發(fā)送性能遠(yuǎn)遠(yuǎn)跟不上你的需求,也就是性能的低下,看起來你的系統(tǒng)發(fā)送訂單到kafka的速度就是特別的慢。

3、batch機(jī)制:多條消息打包成一個(gè)batch

所以首先針對(duì)這個(gè)問題,kafka做的第一個(gè)優(yōu)化,就是實(shí)現(xiàn)了batch機(jī)制。

這個(gè)意思就是說,他會(huì)在客戶端放一個(gè)內(nèi)存緩沖區(qū),每次你寫一條訂單先放到內(nèi)存緩沖區(qū)里去,然后在內(nèi)存緩沖區(qū)里,會(huì)把多個(gè)訂單給打包起來成為一個(gè)batch。

比如說默認(rèn)kafka規(guī)定的batch的大小是16kb,那么意思就是,你默認(rèn)就是多條訂單湊滿16kb的大小,就會(huì)成為一個(gè)batch,然后他就會(huì)把這個(gè)batch通過網(wǎng)絡(luò)通信發(fā)送到broker上去。

假如說一個(gè)batch發(fā)送到broker,同樣也是耗費(fèi)10ms而已,但是一個(gè)batch里可以放入100條訂單,那么1秒是不是可以發(fā)送100個(gè)batch?

此時(shí),1秒是不是就可以發(fā)送10000條訂單出去了?

而且在打包消息形成batch的時(shí)候,是有講究的,你必須是發(fā)送到同一個(gè)Topic的同一個(gè)Partition的消息,才會(huì)進(jìn)入一個(gè)batch。

這個(gè)batch里就代表要發(fā)送到同一個(gè)Partition的多條消息,這樣后續(xù)才能通過一個(gè)網(wǎng)絡(luò)請(qǐng)求,就把這個(gè)batch發(fā)送到broker,對(duì)應(yīng)寫入一個(gè)Parititon中。

4、request機(jī)制:多個(gè)batch打包成一個(gè)request

事情到這里就結(jié)束了嗎?還沒有!

比如現(xiàn)在我們要是手頭有兩個(gè)Topic,每個(gè)Topic都有3個(gè)Partition,那么每個(gè)Broker是不是就會(huì)存放2個(gè)Partition?其中1個(gè)Partition是Topic01的,1個(gè)Partition是Topic02的。

現(xiàn)在假如說針對(duì)Topic01的Partition02形成了一個(gè)batch,針對(duì)Topic02的Partition02也形成了一個(gè)batch,但是這兩個(gè)batch其實(shí)都是發(fā)往同一個(gè)Broker的,如上圖的第二個(gè)Broker。

此時(shí),還是一個(gè)網(wǎng)絡(luò)請(qǐng)求發(fā)送一個(gè)batch過去嗎?

其實(shí)就完全沒必要了,完全此時(shí)可以把多個(gè)發(fā)往同一個(gè)Broker的batch打包成一個(gè)request,然后一個(gè)request通過一次網(wǎng)絡(luò)通信發(fā)送到 那個(gè)Broker上去。

假設(shè)一次網(wǎng)絡(luò)通信還是10ms,那么這一次網(wǎng)絡(luò)通信就發(fā)送了2個(gè)batch過去。

通過這種多個(gè)batch打包成一個(gè)request一次性發(fā)往Broker的方式,又進(jìn)一步提升了網(wǎng)絡(luò)通信的效率和性能。

其實(shí) batch機(jī)制 + request 機(jī)制,都是想辦法把很多數(shù)據(jù)打包起來,然后一次網(wǎng)絡(luò)通信盡量多發(fā)送一些數(shù)據(jù)出去,這樣可以提升單位時(shí)間內(nèi)發(fā)送數(shù)據(jù)的數(shù)量。

這個(gè)單位時(shí)間內(nèi)發(fā)送數(shù)據(jù)的數(shù)量,也就是所謂的“吞吐量”,也就是單位時(shí)間內(nèi)可以發(fā)送多少數(shù)據(jù)到broker上去。

比如說每秒鐘可以發(fā)送3萬條消息過去,這就是代表了客戶端的“吞吐量”有多大。

因此,通過搞清楚這個(gè)原理,就可以學(xué)習(xí)到這種非常優(yōu)秀的設(shè)計(jì)思想。而且在面試的時(shí)候,如果跟面試官聊到kafka,也可以跟面試官侃侃kafka底層,是如何有效的提升網(wǎng)絡(luò)通信性能的。

最后再來一張圖,作為全文總結(jié)。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2022-04-21 07:51:51

場(chǎng)景JavaSQL

2024-10-29 08:21:05

2022-09-27 18:19:32

Java數(shù)據(jù)結(jié)構(gòu)

2021-09-13 10:25:35

開發(fā)技能代碼

2022-11-01 18:11:16

線上系統(tǒng)性能切割函數(shù)

2024-07-17 08:25:44

2021-02-02 15:38:19

Disruptor緩存Java

2022-11-19 18:18:22

Spring架構(gòu)

2022-09-09 09:33:14

支付寶代碼性能

2021-12-27 06:57:40

Maven工具性能

2023-03-22 13:53:26

芯片英偉達(dá)

2024-09-03 09:08:43

2011-07-01 10:11:39

2021-08-02 10:50:57

性能微服務(wù)數(shù)據(jù)

2019-10-08 14:22:43

分布式HDFS算法

2014-03-26 10:00:06

RailsRails性能

2024-12-13 13:58:53

2021-12-03 13:52:25

AI 數(shù)據(jù)人工智能

2020-07-22 08:30:02

代碼開發(fā)工具

2020-03-26 12:38:15

代碼節(jié)點(diǎn)數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)