国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

kafka常見問題

這篇具有很好參考價值的文章主要介紹了kafka常見問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

1.為什么要用mq(mq的作用)?

2.引入mq會多哪些問題?

3. 如何解決這些問題?

1.1實現(xiàn)異步發(fā)送

有些復(fù)雜的業(yè)務(wù)系統(tǒng),一次用戶請求可能會同步調(diào)用N個系統(tǒng)的接口,需要等待所有的接口都返回了,才能真正的獲取執(zhí)行結(jié)果。這種同步接口調(diào)用的方式總耗時比較長,非常影響用戶的體驗,特別是在網(wǎng)絡(luò)不穩(wěn)定的情況下,極容易出現(xiàn)接口超時問題。

同步接口調(diào)用導(dǎo)致響應(yīng)時間長的問題,使用mq之后,將同步調(diào)用改成異步,能夠顯著減少系統(tǒng)響應(yīng)時間。

1.2解耦

很多復(fù)雜的業(yè)務(wù)系統(tǒng),一般都會拆分成多個子系統(tǒng)。系統(tǒng)之間耦合性太高,如果調(diào)用的任何一個子系統(tǒng)出現(xiàn)異常,整個請求都會異常,對系統(tǒng)的穩(wěn)定性非常不利。

子系統(tǒng)間耦合性太大的問題,使用mq之后,只需要依賴于mq,避免了各個子系統(tǒng)間的強(qiáng)依賴問題。訂單系統(tǒng)作為消息生產(chǎn)者,保證它自己沒有異常即可,不會受到支付系統(tǒng)等業(yè)務(wù)子系統(tǒng)的異常影響,并且各個消費(fèi)者業(yè)務(wù)子系統(tǒng)之間,也互不影響。這樣就把之前復(fù)雜的業(yè)務(wù)子系統(tǒng)的依賴關(guān)系,轉(zhuǎn)換為只依賴于mq的簡單依賴,從而顯著的降低了系統(tǒng)間的耦合度。

kafka常見問題

1.3 ?削峰

某一時間請求量特別大時,消費(fèi)方消費(fèi)能力不足,可能會導(dǎo)致系統(tǒng)響應(yīng)變慢或者直接掛掉。

訂單系統(tǒng)接收到用戶請求之后,將請求直接發(fā)送到mq,然后訂單消費(fèi)者從mq中消費(fèi)消息,做寫庫操作。如果出現(xiàn)請求峰值的情況,由于消費(fèi)者的消費(fèi)能力有限,會按照自己的節(jié)奏來消費(fèi)消息,多的請求不處理,保留在mq的隊列中,不會對系統(tǒng)的穩(wěn)定性造成影響。

2.引入mq會多哪些問題?

引入mq后子系統(tǒng)間耦合性降低了,異步處理機(jī)制減少了系統(tǒng)的響應(yīng)時間,同時能夠有效的應(yīng)對請求峰值問題,提升系統(tǒng)的穩(wěn)定性。

但是,引入mq同時也會帶來一些問題。

2.1 重復(fù)消息問題

重復(fù)消費(fèi)問題可以說是mq中普遍存在的問題,不管你用哪種mq都無法避免。

有哪些場景會出現(xiàn)重復(fù)的消息呢?

  • 消息生產(chǎn)者產(chǎn)生了重復(fù)的消息
  • kafka和rocketmq的offset被回調(diào)了
  • 消息消費(fèi)者確認(rèn)失敗
  • 消息消費(fèi)者確認(rèn)時超時了
  • 業(yè)務(wù)系統(tǒng)主動發(fā)起重試


如果重復(fù)消息不做正確的處理,會對業(yè)務(wù)造成很大的影響,產(chǎn)生重復(fù)的數(shù)據(jù),或者導(dǎo)致數(shù)據(jù)異常,比如會員系統(tǒng)多開通了一個月的會員。

2.2 數(shù)據(jù)一致性問題

很多時候,如果mq的消費(fèi)者業(yè)務(wù)處理異常的話,就會出現(xiàn)數(shù)據(jù)一致性問題。比如:一個完整的業(yè)務(wù)流程是,下單成功之后,送100個積分。下單寫庫了,但是消息消費(fèi)者在送積分的時候失敗了,就會造成數(shù)據(jù)不一致的情況,即該業(yè)務(wù)流程的部分?jǐn)?shù)據(jù)寫庫了,另外一部分沒有寫庫。


如果下單和送積分在同一個事務(wù)中,要么同時成功,要么同時失敗,是不會出現(xiàn)數(shù)據(jù)一致性問題的。

但由于跨系統(tǒng)調(diào)用,為了性能考慮,一般不會使用強(qiáng)一致性的方案,而改成達(dá)成最終一致性即可。

2.3 消息丟失問題

同樣消息丟失問題,也是mq中普遍存在的問題,不管你用哪種mq都無法避免。

有哪些場景會出現(xiàn)消息丟失問題呢?

消息生產(chǎn)者發(fā)生消息時,由于網(wǎng)絡(luò)原因,發(fā)生到mq失敗了。

mq服務(wù)器持久化時,磁盤出現(xiàn)異常

kafka和rocketmq的offset被回調(diào)時,略過了很多消息。

消息消費(fèi)者剛讀取消息,已經(jīng)ack確認(rèn)了,但業(yè)務(wù)還沒處理完,服務(wù)就被重啟了。

導(dǎo)致消息丟失問題的原因挺多的,生產(chǎn)者、mq服務(wù)器、消費(fèi)者?都有可能產(chǎn)生問題,我在這里就不一一列舉了。最終的結(jié)果會導(dǎo)致消費(fèi)者無法正確的處理消息,而導(dǎo)致數(shù)據(jù)不一致的情況。

2.4 消息順序問題

有些業(yè)務(wù)數(shù)據(jù)是有狀態(tài)的,比如訂單有:下單、支付、完成、退貨等狀態(tài),如果訂單數(shù)據(jù)作為消息體,就會涉及順序問題了。如果消費(fèi)者收到同一個訂單的兩條消息,第一條消息的狀態(tài)是下單,第二條消息的狀態(tài)是支付,這是沒問題的。但如果第一條消息的狀態(tài)是支付,第二條消息的狀態(tài)是下單就會有問題了,沒有下單就先支付了?消息順序問題是一個非常棘手的問題,比如:

kafka同一個partition中能保證順序,但是不同的partition無法保證順序。

rabbitmq的同一個queue能夠保證順序,但是如果多個消費(fèi)者同一個queue也會有順序問題。

如果消費(fèi)者使用多線程消費(fèi)消息,也無法保證順序。

如果消費(fèi)消息時同一個訂單的多條消息中,中間的一條消息出現(xiàn)異常情況,順序?qū)淮騺y。

還有如果生產(chǎn)者發(fā)送到mq中的路由規(guī)則,跟消費(fèi)者不一樣,也無法保證順序。

2.5 消息堆積

如果消息消費(fèi)者讀取消息的速度,能夠跟上消息生產(chǎn)者的節(jié)奏,那么整套mq機(jī)制就能發(fā)揮最大作用。但是很多時候,由于某些批處理,或者其他原因,導(dǎo)致消息消費(fèi)的速度小于生產(chǎn)的速度。這樣會直接導(dǎo)致消息堆積問題,從而影響業(yè)務(wù)功能。

這里以下單開通會員為例,如果消息出現(xiàn)堆積,會導(dǎo)致用戶下單之后,很久之后才能變成會員,這種情況肯定會引起大量用戶投訴。

2.6 系統(tǒng)復(fù)雜度提升

這里說的系統(tǒng)復(fù)雜度和系統(tǒng)耦合性是不一樣的,比如以前只有:系統(tǒng)A、系統(tǒng)B和系統(tǒng)C 這三個系統(tǒng),現(xiàn)在引入mq之后,你除了需要關(guān)注前面三個系統(tǒng)之外,還需要關(guān)注mq服務(wù),需要關(guān)注的點(diǎn)越多,系統(tǒng)的復(fù)雜度越高。mq的機(jī)制需要:生產(chǎn)者、mq服務(wù)器、消費(fèi)者。

有一定的學(xué)習(xí)成本,需要額外部署mq服務(wù)器,而且有些mq比如:rocketmq,功能非常強(qiáng)大,用法有點(diǎn)復(fù)雜,如果使用不好,會出現(xiàn)很多問題。有些問題,不像接口調(diào)用那么容易排查,從而導(dǎo)致系統(tǒng)的復(fù)雜度提升了。

3 如何解決這些問題?

mq是一種趨勢,總體來說對我們的系統(tǒng)是利大于弊的,難道因為它會出現(xiàn)一些問題,我們就不用它了?

那么我們要如何解決這些問題呢?

3.1 重復(fù)消息問題

不管是由于生產(chǎn)者產(chǎn)生的重復(fù)消息,還是由于消費(fèi)者導(dǎo)致的重復(fù)消息,我們都可以在消費(fèi)者中通過做冪等設(shè)計來解決。

一種解決方法是增加一張消費(fèi)消息表,來解決mq的這類問題。消費(fèi)消息表中,使用messageId做唯一索引,在處理業(yè)務(wù)邏輯之前,先根據(jù)messageId查詢一下該消息有沒有處理過,如果已經(jīng)處理過了則直接返回成功,如果沒有處理過,則繼續(xù)做業(yè)務(wù)處理。

kafka常見問題

3.2 數(shù)據(jù)一致性問題

數(shù)據(jù)一致性分為:

強(qiáng)一致性

弱一致性

最終一致性

而mq為了性能考慮使用的是最終一致性,那么必定會出現(xiàn)數(shù)據(jù)不一致的問題。這類問題大概率是因為消費(fèi)者讀取消息后,業(yè)務(wù)邏輯處理失敗導(dǎo)致的,這時候可以增加重試機(jī)制。

重試分為:同步重試?和?異步重試。

有些消息量比較小的業(yè)務(wù)場景,可以采用同步重試,在消費(fèi)消息時如果處理失敗,立刻重試3-5次,如何還是失敗,則寫入到記錄表中。但如果消息量比較大,則不建議使用這種方式,因為如果出現(xiàn)網(wǎng)絡(luò)異常,可能會導(dǎo)致大量的消息不斷重試,影響消息讀取速度,造成消息堆積。

而消息量比較大的業(yè)務(wù)場景,建議采用異步重試,在消費(fèi)者處理失敗之后,立刻寫入重試表,有個job專門定時重試。

還有一種做法是,如果消費(fèi)失敗,自己給同一個topic發(fā)一條消息,在后面的某個時間點(diǎn),自己又會消費(fèi)到那條消息,起到了重試的效果。如果對消息順序要求不高的場景,可以使用這種方式。

3.3 消息丟失問題

不管你是否承認(rèn)有時候消息真的會丟,即使這種概率非常小,也會對業(yè)務(wù)有影響。生產(chǎn)者、mq服務(wù)器、消費(fèi)者都有可能會導(dǎo)致消息丟失的問題。

為了解決這個問題,我們可以增加一張消息發(fā)送表,當(dāng)生產(chǎn)者發(fā)完消息之后,會往該表中寫入一條數(shù)據(jù),狀態(tài)status標(biāo)記為待確認(rèn)。如果消費(fèi)者讀取消息之后,調(diào)用生產(chǎn)者的api更新該消息的status為已確認(rèn)。有個job,每隔一段時間檢查一次消息發(fā)送表,如果5分鐘(這個時間可以根據(jù)實際情況來定)后還有狀態(tài)是待確認(rèn)的消息,則認(rèn)為該消息已經(jīng)丟失了,重新發(fā)條消息。

這樣不管是由于生產(chǎn)者、mq服務(wù)器、還是消費(fèi)者導(dǎo)致的消息丟失問題,job都會重新發(fā)消息。

3.4 消息順序問題

消息順序問題是我們非常常見的問題,我們以kafka消費(fèi)訂單消息為例。訂單有:下單、支付、完成、退貨等狀態(tài),這些狀態(tài)是有先后順序的,如果順序錯了會導(dǎo)致業(yè)務(wù)異常。

解決這類問題之前,我們先確認(rèn)一下,消費(fèi)者是否真的需要知道中間狀態(tài),只知道最終狀態(tài)行不行?

其實很多時候,我真的需要知道的是最終狀態(tài),這時可以把流程優(yōu)化一下:

這種方式可以解決大部分的消息順序問題。

但如果真的有需要保證消息順序的需求。訂單號路由到不同的partition,同一個訂單號的消息,每次到發(fā)到同一個partition。

kafka常見問題

3.5 消息堆積

如果消費(fèi)者消費(fèi)消息的速度小于生產(chǎn)者生產(chǎn)消息的速度,將會出現(xiàn)消息堆積問題。

那么消息堆積問題該如何解決呢?

這個要看消息是否需要保證順序。

如果不需要保證順序,可以讀取消息之后用多線程處理業(yè)務(wù)邏輯。

kafka常見問題


這樣就能增加業(yè)務(wù)邏輯處理速度,解決消息堆積問題。但是線程池的核心線程數(shù)和最大線程數(shù)需要合理配置,不然可能會浪費(fèi)系統(tǒng)資源。

如果需要保證順序,可以讀取消息之后,將消息按照一定的規(guī)則分發(fā)到多個隊列中,然后在隊列中用單線程處理。

kafka常見問題文章來源地址http://www.zghlxwxcb.cn/news/detail-501673.html

到了這里,關(guān)于kafka常見問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 為什么要用線程池?

    線程池是一種管理和復(fù)用線程資源的機(jī)制,它由一個線程池管理器和一組工作線程組成。線程池管理器負(fù)責(zé)創(chuàng)建和銷毀線程池,以及管理線程池中的工作線程。工作線程則負(fù)責(zé)執(zhí)行具體的任務(wù)。 線程池的主要作用是管理和復(fù)用線程資源,避免了線程的頻繁創(chuàng)建和銷毀所帶來的

    2024年02月06日
    瀏覽(22)
  • 為什么要用開源容器?

    說到開源容器,大家首先想起來的應(yīng)該是Docker吧,那么我們就以Docker來從個人角度理解一下為什么要用開源容器。 通常都會說Docker開源容器,但是Docker 實際上是一個開源的應(yīng)用容器引擎。Docker是一個基于輕量級虛擬化技術(shù)的容器,整個項目基于Go語言開發(fā),并采用了Apache 2

    2024年04月16日
    瀏覽(61)
  • 為什么要用虛擬 DOM?

    虛擬DOM(Virtual DOM)是一種將應(yīng)用程序的狀態(tài)(state)與DOM分離的技術(shù)。它是一個JavaScript對象,它的結(jié)構(gòu)類似于實際DOM元素的結(jié)構(gòu)。使用虛擬DOM的目的是在減少DOM操作的數(shù)量的同時,提高應(yīng)用程序的性能和響應(yīng)速度。 當(dāng)應(yīng)用程序的狀態(tài)發(fā)生變化時,使用虛擬DOM可以計算出需要

    2024年02月01日
    瀏覽(23)
  • 低代碼是什么意思?企業(yè)為什么要用低代碼平臺?

    低代碼是什么意思?企業(yè)為什么要用低代碼平臺?

    低代碼是什么意思?企業(yè)為什么要用低代碼平臺? 這兩個問題似乎困擾了很多人,總有粉絲跟小簡抱怨, 一天到晚念叨低代碼,倒是來個人解釋清楚??! 來了,這次一文讓你全明白。 在此之前,先了解什么是云計算。 “云” :指的就是互聯(lián)網(wǎng),因為之前互聯(lián)網(wǎng)(Internet)

    2024年02月07日
    瀏覽(24)
  • 2023-06-03:redis中pipeline有什么好處,為什么要用 pipeline?

    2023-06-03:redis中pipeline有什么好處,為什么要用 pipeline?

    2023-06-03:redis中pipeline有什么好處,為什么要用 pipeline? 答案2023-06-03: Redis客戶端執(zhí)行一條命令通常包括以下四個階段: 1.發(fā)送命令:客戶端將要執(zhí)行的命令發(fā)送到Redis服務(wù)器。 2.命令排隊:Redis服務(wù)器將收到的命令放入隊列中,按照先進(jìn)先出(FIFO)的原則等待執(zhí)行。 3.命令

    2024年02月07日
    瀏覽(17)
  • 在Vue中動態(tài)引入圖片為什么要用require

    在Vue中動態(tài)引入圖片為什么要用require

    靜態(tài)資源和動態(tài)資源 靜態(tài)資源 動態(tài)的添加src 動態(tài)資源 我們通過網(wǎng)絡(luò)請求從后端獲取的資源 動態(tài)的添加src會被當(dāng)成靜態(tài)資源 動態(tài)的添加src最終會被打包成: 動態(tài)的添加圖片最會會被編譯成一個靜態(tài)的字符串,然后再瀏覽器運(yùn)行中會去項目中查找這個資源, 靜態(tài)資源編譯 默

    2024年02月13日
    瀏覽(28)
  • bash腳本if語句比較為什么要用x

    如下進(jìn)行PCIe設(shè)備的檢測和計數(shù),并執(zhí)行重啟操作的例子代碼: 在給定的代碼片段中,使用 x 是為了避免在比較時出現(xiàn)空字符串的問題。這是一種常見的技巧,用于確保比較操作的準(zhǔn)確性。 在這個特定的語句中, x${devIDFunc0} 是用來檢查變量 devIDFunc0 是否為空字符串。通過在變

    2024年02月08日
    瀏覽(20)
  • 為什么爬蟲要用高匿代理IP?高匿代理IP有什么優(yōu)點(diǎn)

    為什么爬蟲要用高匿代理IP?高匿代理IP有什么優(yōu)點(diǎn)

    只要搜代理IP,度娘就能給我們跳出很多品牌的推廣,比如我們青果網(wǎng)路的。 正如你所看到的,我們廠商很多宣傳用詞都會用到高匿這2字。 這是為什么呢?高匿IP有那么重要嗎? 這就需要我們從HTTP代理應(yīng)用最多最廣的:爬蟲數(shù)據(jù)采集來說。 爬蟲數(shù)據(jù)采集的時候,非常容易遇

    2024年02月12日
    瀏覽(22)
  • 模型\視圖一般步驟:為什么經(jīng)常要用“選擇模型”QItemSelectionModel?

    模型\視圖一般步驟:為什么經(jīng)常要用“選擇模型”QItemSelectionModel?

    ???????????????????????? ???????????????????????????????? 一、“使用視圖”一般的步驟: //1. 創(chuàng)建? 模型(這里是數(shù)據(jù)模型!) tabModel = new QSqlTableModel ( this , DB ); // 數(shù)據(jù)表 //2. 設(shè)置? 視圖 的 模型(這里是數(shù)據(jù)模型!) ui - tableView - setModel ( tabModel ); 模

    2024年01月22日
    瀏覽(26)
  • facebook多賬號運(yùn)營為什么要用靜態(tài)住宅ip代理?

    facebook多賬號運(yùn)營為什么要用靜態(tài)住宅ip代理?

    在進(jìn)行Facebook群控時,ip地址的管理是非常重要的,因為Facebook通常會檢測ip地址的使用情況,如果發(fā)現(xiàn)有異常的使用行為,比如從同一個ip地址頻繁進(jìn)行登錄、發(fā)布內(nèi)容或者在短時間內(nèi)進(jìn)行大量的活動等等,就會視為垃圾郵件或者惡意行為,導(dǎo)致賬戶被禁用或者限制。 因此,

    2024年02月21日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包