? 將一些主流程不需要返回的數(shù)據(jù)交給中間件處理,以并行的方式,可以提高系統(tǒng)的并發(fā)量、吞吐量和響應(yīng)時(shí)間。
網(wǎng)站設(shè)計(jì)制作過(guò)程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺(tái)管理系統(tǒng);成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)收費(fèi)合理;免費(fèi)進(jìn)行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).我們是一家持續(xù)穩(wěn)定運(yùn)營(yíng)了十多年的成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司。示例:用戶注冊(cè)后需要發(fā)送短信和郵件? 可以將發(fā)送短信和發(fā)送郵件交給消息中間件去處理。
2.應(yīng)用解耦? 消息中間件在一定程度上符合了應(yīng)用的解耦操作,將不同功能的應(yīng)用分布到不同的系統(tǒng),使用消息中間件來(lái)進(jìn)行互相調(diào)用,可以保證一臺(tái)系統(tǒng)宕機(jī)的情況下,不影響到其他的系統(tǒng)。
示例:訂單系統(tǒng)調(diào)用庫(kù)存系統(tǒng)若訂單系統(tǒng)宕機(jī),庫(kù)存系統(tǒng)也同樣無(wú)法服務(wù)
3.削峰填谷? 在高并發(fā)的情況下,當(dāng)有大批量的請(qǐng)求訪問(wèn)服務(wù),一臺(tái)服務(wù)器無(wú)法承受過(guò)多的請(qǐng)求,可能會(huì)使服務(wù)器宕機(jī),影響服務(wù)的正常運(yùn)行。
? 我們可以引入消息隊(duì)列,將并發(fā)比較高的請(qǐng)求放入消息隊(duì)列,分批次的去處理,這樣可以保證服務(wù)器的正常運(yùn)行,保證服務(wù)器的性能不會(huì)受到影響,緩解服務(wù)器的壓力。
示例:秒殺活動(dòng)? 秒殺活動(dòng)并發(fā)訪問(wèn)量較大,可能會(huì)使服務(wù)器宕機(jī),可以引入消息隊(duì)列,控制活動(dòng)的人數(shù),防止短時(shí)間內(nèi)高訪問(wèn)搞垮服務(wù)器。
二、Kafka的優(yōu)勢(shì) 1.優(yōu)勢(shì)? 消息是kafka的數(shù)據(jù)單元,以字節(jié)數(shù)組(byte[])組成,還可以有鍵(可選元數(shù)據(jù),也是字節(jié)數(shù)組),用來(lái)對(duì)消息選取分區(qū)。
? 為了提高效率,可以分批次寫入kafka,多個(gè)消息組成一個(gè)批次,一個(gè)批次就是一組消息,一組消息屬于一個(gè)主題和分區(qū)。如果每一個(gè)消息都單獨(dú)傳遞,會(huì)占用大量的網(wǎng)絡(luò)開銷,分批次可以減少網(wǎng)絡(luò)開銷。
2.主題和分區(qū)? Kafka的消息選用主題(Topic)進(jìn)行分類(像Mysql的表),一個(gè)主題下可以有多個(gè)分區(qū)(Partition)(像數(shù)據(jù)庫(kù)的分表技術(shù)),當(dāng)有生產(chǎn)者生產(chǎn)新消息時(shí),會(huì)以文件的形式存儲(chǔ)到分區(qū),消費(fèi)者按照順序進(jìn)行消費(fèi)分區(qū)內(nèi)的文件信息。
? 當(dāng)有多個(gè)分區(qū)時(shí),生產(chǎn)者將消息均勻的分布到不同的分區(qū),可以提高kafka的吞吐量,保證多個(gè)消費(fèi)者同時(shí)進(jìn)行消費(fèi),但是這樣就不能保證消費(fèi)者的順序消費(fèi),當(dāng)消費(fèi)者必須要按照順序消費(fèi)時(shí),我們只能在每個(gè)主題下設(shè)置一個(gè)分區(qū)。
3.偏移量和消費(fèi)者群組? 消費(fèi)者訂閱一個(gè)或多個(gè)主題(Topic),按照消息生產(chǎn)的順序進(jìn)行讀取,消費(fèi)者通過(guò)檢查分區(qū)中的偏移量,從而確定該消息有沒有被讀取過(guò),是一個(gè)不斷遞增的整數(shù)值,創(chuàng)建消息的時(shí)候,kafka會(huì)將偏移量加入消息中。在一個(gè)主題的一個(gè)分區(qū)中,消息的偏移量是唯一的,每個(gè)分區(qū)讀取的消息的偏移量最終會(huì)存儲(chǔ)到kafka或zookeeper的文件中,因此當(dāng)服務(wù)重啟后,消息是不會(huì)丟失的。
? 多個(gè)消費(fèi)者可以組成一個(gè)消費(fèi)者群組,共同讀取一個(gè)主題中的消息,可以保證每個(gè)分區(qū)只被一個(gè)消費(fèi)者進(jìn)行讀取。
4.Broke和集群? 一個(gè)獨(dú)立的kafka服務(wù)就是一個(gè)Broke,主要為生產(chǎn)者提供服務(wù),接收生產(chǎn)者的消息,設(shè)置偏移量,將生產(chǎn)者的消息存儲(chǔ)到磁盤中;為消費(fèi)者提供服務(wù),為消費(fèi)者響應(yīng)消息。kafka可以在上千個(gè)分區(qū)中響應(yīng)百萬(wàn)級(jí)的消息量(在合適的硬件配置中和JVM調(diào)優(yōu))。
多個(gè)broker可以組成一個(gè)集群。每個(gè)集群中broker會(huì)選舉出一個(gè)集群控制器??刂破鲿?huì)進(jìn)行管理,包括將分區(qū)分配給broker和監(jiān)控broker。集群里,一個(gè)分區(qū)從屬于一個(gè)broker,這個(gè)broker被稱為首領(lǐng)。但是分區(qū)可以被分配給多個(gè)broker,這個(gè)時(shí)候會(huì)發(fā)生分區(qū)復(fù)制。集群中Kafka內(nèi)部一般使用管道技術(shù)進(jìn)行高效的復(fù)制。
5.保留消息在一定期限內(nèi)保留消息是Kafka的一個(gè)重要特性,Kafka broker默認(rèn)的保留策略是:要么保留一段時(shí)間(7天),要么保留一定大?。ū热?個(gè)G)。到了限制,舊消息過(guò)期并刪除。但是每個(gè)主題可以根據(jù)業(yè)務(wù)需求配置自己的保留策略(開發(fā)時(shí)要注意,Kafka不像Mysql之類的永久存儲(chǔ))。
四、kafka的安裝與配置 1.安裝Kafka需要Zookeeper保存集群的元數(shù)據(jù)信息和消費(fèi)者信息。Kafka一般會(huì)自帶Zookeeper,但是從穩(wěn)定性考慮,應(yīng)該使用單獨(dú)的Zookeeper,而且構(gòu)建Zookeeper集群。
下載解壓wget https://downloads.apache.org/kafka/3.3.1/kafka_2.13-3.3.1.tgz
tar -xf kafka_2.13-3.3.1.tgz
2.依賴zookeeper啟動(dòng)(使用自帶的zookeeper)cd kafka_2.13-3.3.1/bin
./zookeeper-server-start.sh ../config/zookeeper.properties
./kafka-server-start.sh ../config/server.properties
3.單獨(dú)啟動(dòng)(KRaft)
3.1.1.生成集群id./kafka-storage.sh random-uuid
3.1.2.格式化存儲(chǔ)目錄./kafka-storage.sh format -t [生成的uuid]-c ../config/kraft/server.properties
3.1.3.啟動(dòng)服務(wù)./kafka-server-start.sh ../config/kraft/server.properties
4.常規(guī)配置配置文件放在Kafka目錄下的config目錄中,主要是server.properties文件
4.1.1.broker.id在單機(jī)時(shí)無(wú)需修改,但在集群下部署時(shí)往往需要修改。它是個(gè)每一個(gè)broker在集群中的唯一表示,要求是正數(shù)。當(dāng)該服務(wù)器的IP地址發(fā)生改變時(shí),broker.id沒有變化,則不會(huì)影響consumers的消息情況。
4.1.2.listeners監(jiān)聽列表(以逗號(hào)分隔 不同的協(xié)議(如plaintext,trace,ssl、不同的IP和端口)),hostname如果設(shè)置為0.0.0.0則綁定所有的網(wǎng)卡地址;如果hostname為空則綁定默認(rèn)的網(wǎng)卡。如果沒有配置則默認(rèn)為java.net.InetAddress.getCanonicalHostName()。
如:PLAINTEXT://myhost:9092,TRACE://:9091或 PLAINTEXT://0.0.0.0:9092,
4.1.3.zookeeper.connectzookeeper集群的地址,可以是多個(gè),多個(gè)之間用逗號(hào)分割。(一組hostname:port/path列表,hostname是zk的機(jī)器名或IP、port是zk的端口、/path是可選zk的路徑,如果不指定,默認(rèn)使用根路徑)
4.1.4.log.dirsKafka把所有的消息都保存在磁盤上,存放這些數(shù)據(jù)的目錄通過(guò)log.dirs指定??梢允褂枚嗦窂?,使用逗號(hào)分隔。如果是多路徑,Kafka會(huì)根據(jù)“最少使用”原則,把同一個(gè)分區(qū)的日志片段保存到同一路徑下。會(huì)往擁有最少數(shù)據(jù)分區(qū)的路徑新增分區(qū)。
4.1.5.num.recovery.threads.per.data.dir每數(shù)據(jù)目錄用于日志恢復(fù)啟動(dòng)和關(guān)閉時(shí)的線程數(shù)量。因?yàn)檫@些線程只是服務(wù)器啟動(dòng)(正常啟動(dòng)和崩潰后重啟)和關(guān)閉時(shí)會(huì)用到。所以完全可以設(shè)置大量的線程來(lái)達(dá)到并行操作的目的。注意,這個(gè)參數(shù)指的是每個(gè)日志目錄的線程數(shù),比如本參數(shù)設(shè)置為8,而log.dirs設(shè)置為了三個(gè)路徑,則總共會(huì)啟動(dòng)24個(gè)線程。
4.1.6.auto.create.topics.enable是否允許自動(dòng)創(chuàng)建主題。如果設(shè)為true,那么produce(生產(chǎn)者往主題寫消息),consume(消費(fèi)者從主題讀消息)或者fetch metadata(任意客戶端向主題發(fā)送元數(shù)據(jù)請(qǐng)求時(shí))一個(gè)不存在的主題時(shí),就會(huì)自動(dòng)創(chuàng)建。缺省為true。
4.1.7.delete.topic.enable=true刪除主題配置,默認(rèn)未開啟
5.主題配置新建主題的默認(rèn)參數(shù)
5.1.1.num.partitions每個(gè)新建主題的分區(qū)個(gè)數(shù)(分區(qū)個(gè)數(shù)只能增加,不能減少 )。這個(gè)參數(shù)一般要評(píng)估,比如,每秒鐘要寫入和讀取1000M數(shù)據(jù),如果現(xiàn)在每個(gè)消費(fèi)者每秒鐘可以處理50MB的數(shù)據(jù),那么需要20個(gè)分區(qū),這樣就可以讓20個(gè)消費(fèi)者同時(shí)讀取這些分區(qū),從而達(dá)到設(shè)計(jì)目標(biāo)。(一般經(jīng)驗(yàn),把分區(qū)大小限制在25G之內(nèi)比較理想)
5.1.2.log.retention.hours日志保存時(shí)間,默認(rèn)為7天(168小時(shí))。超過(guò)這個(gè)時(shí)間會(huì)清理數(shù)據(jù)。bytes和minutes無(wú)論哪個(gè)先達(dá)到都會(huì)觸發(fā)。與此類似還有l(wèi)og.retention.minutes和log.retention.ms,都設(shè)置的話,優(yōu)先使用具有最小值的那個(gè)。(提示:時(shí)間保留數(shù)據(jù)是通過(guò)檢查磁盤上日志片段文件的最后修改時(shí)間來(lái)實(shí)現(xiàn)的。也就是最后修改時(shí)間是指日志片段的關(guān)閉時(shí)間,也就是文件里最后一個(gè)消息的時(shí)間戳)
5.1.3.log.retention.bytestopic每個(gè)分區(qū)的大文件大小,一個(gè)topic的大小限制 = 分區(qū)數(shù)*log.retention.bytes。-1沒有大小限制。log.retention.bytes和log.retention.minutes任意一個(gè)達(dá)到要求,都會(huì)執(zhí)行刪除。(注意如果是log.retention.bytes先達(dá)到了,則是刪除多出來(lái)的部分?jǐn)?shù)據(jù)),一般不推薦使用大文件刪除策略,而是推薦使用文件過(guò)期刪除策略。
5.1.4.log.segment.bytes分區(qū)的日志存放在某個(gè)目錄下諸多文件中,這些文件將分區(qū)的日志切分成一段一段的,我們稱為日志片段。這個(gè)屬性就是每個(gè)文件的大尺寸;當(dāng)尺寸達(dá)到這個(gè)數(shù)值時(shí),就會(huì)關(guān)閉當(dāng)前文件,并創(chuàng)建新文件。被關(guān)閉的文件就開始等待過(guò)期。默認(rèn)為1G。
如果一個(gè)主題每天只接受100MB的消息,那么根據(jù)默認(rèn)設(shè)置,需要10天才能填滿一個(gè)文件。而且因?yàn)槿罩酒卧陉P(guān)閉之前,消息是不會(huì)過(guò)期的,所以如果log.retention.hours保持默認(rèn)值的話,那么這個(gè)日志片段需要17天才過(guò)期。因?yàn)殛P(guān)閉日志片段需要10天,等待過(guò)期又需要7天。
5.1.5.log.segment.ms作用和log.segment.bytes類似,只不過(guò)判斷依據(jù)是時(shí)間。同樣的,兩個(gè)參數(shù),以先到的為準(zhǔn)。這個(gè)參數(shù)默認(rèn)是不開啟的。
5.1.6.message.max.bytes表示一個(gè)服務(wù)器能夠接收處理的消息的大字節(jié)數(shù),注意這個(gè)值producer和consumer必須設(shè)置一致,且不要大于fetch.message.max.bytes屬性的值(消費(fèi)者能讀取的大消息,這個(gè)值應(yīng)該大于或等于message.max.bytes)。該值默認(rèn)是1000000字節(jié),大概900KB~1MB。如果啟動(dòng)壓縮,判斷壓縮后的值。這個(gè)值的大小對(duì)性能影響很大,值越大,網(wǎng)絡(luò)和IO的時(shí)間越長(zhǎng),還會(huì)增加磁盤寫入的大小。
Kafka設(shè)計(jì)的初衷是迅速處理短小的消息,一般10K大小的消息吞吐性能最好(LinkedIn的kafka性能測(cè)試)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧