18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

引入消息隊列會多出哪些問題

Linux愛好者 ? 來源:蘇三說技術 ? 作者:熱愛所以堅持ing ? 2021-09-23 14:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

最近,消息隊列(Message Queue ,簡稱 MQ)越來越火。很多公司在用,很多人在用,其重要性不言而喻。

如果讓你回答下面這些問題,你的心中是否有答案了呢?

為什么要用 MQ?

引入 MQ 會多出哪些問題?

如何解決這些問題?

本文將會一一為你解答,這些看似平常卻很有意義的問題。

1. 傳統(tǒng)模式有哪些痛點

痛點 1

有些復雜的業(yè)務系統(tǒng),一次用戶請求可能會同步調用 N 個系統(tǒng)的接口,需要等待所有的接口都返回才能真正的獲取執(zhí)行結果。

這種同步接口調用的方式總耗時比較長,非常影響用戶體驗。特別是在網(wǎng)絡不穩(wěn)定的情況下,極容易出現(xiàn)接口超時問題。

痛點 2

很多復雜的業(yè)務系統(tǒng),一般都會拆分成多個子系統(tǒng)。以用戶下單為例,請求會先通過訂單系統(tǒng),然后分別調用支付系統(tǒng)、庫存系統(tǒng)、積分系統(tǒng)和物流系統(tǒng)。

系統(tǒng)之間耦合性太高,如果調用的任何一個子系統(tǒng)出現(xiàn)異常,整個請求都會異常。對系統(tǒng)的穩(wěn)定性非常不利。

痛點 3

為了吸引用戶,有時候會搞一些活動,比如秒殺等。

如果用戶少還好,不會影響系統(tǒng)的穩(wěn)定性。但如果用戶突增,一時間所有的請求都到數(shù)據(jù)庫,可能會導致數(shù)據(jù)庫無法承受這么大的壓力,響應變慢或者直接掛掉。

對于這種突然出現(xiàn)的請求峰值,無法保證系統(tǒng)的穩(wěn)定性。

2. 為什么要用 MQ

對于上面?zhèn)鹘y(tǒng)模式的三類問題,使用 MQ 就能輕松解決。

2.1 異步

對于痛點 1 同步接口調用導致響應時間長的問題。使用 MQ 之后,將同步調用改成異步調用,能夠顯著減少系統(tǒng)響應時間。

系統(tǒng) A 作為消息的生產(chǎn)者,在完成本職工作后就能直接返回結果了。無需等待消息消費者的返回,它們最終會獨立完成所有的業(yè)務功能。

這樣能避免總耗時比較長,從而影響用戶的體驗的問題。

2.2 解耦

對于痛點 2 子系統(tǒng)間耦合性太大的問題,使用 MQ 之后,只需要依賴于 MQ。避免了各個子系統(tǒng)間的強依賴問題。

訂單系統(tǒng)作為消息生產(chǎn)者,保證它自己沒有異常即可,不會受到支付系統(tǒng)等業(yè)務子系統(tǒng)的異常影響。并且各個消費者業(yè)務子系統(tǒng)之間,也互不影響。

這樣就把之前復雜的業(yè)務子系統(tǒng)的依賴關系,轉換為只依賴于 MQ 的簡單依賴,從而顯著的降低了系統(tǒng)間的耦合度。

2.3 削峰

對于痛點 3,由于突然出現(xiàn)的請求峰值導致系統(tǒng)不穩(wěn)定的問題。使用 MQ 后,能夠起到削峰的作用。

訂單系統(tǒng)接收到用戶請求之后,將請求直接發(fā)送到 MQ;

然后,訂單消費者從 MQ 中消費消息,做寫庫操作;

當出現(xiàn)請求峰值的情況,由于消費者的消費能力有限,會按照自己的節(jié)奏來消費消息。多余請求不處理,保留在 MQ 的隊列中,不會對系統(tǒng)的穩(wěn)定性造成影響。

3. 引入 MQ 會多出哪些問題

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

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

3.1 重復消費問題

重復消費問題可以說是 MQ 中普遍存在的問題,不管你用哪種 MQ 都無法避免。

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

消息生產(chǎn)者產(chǎn)生了重復的消息;

Kafka 和 RocketMQ 的 offset 被回調了;

消息消費者確認失??;

消息消費者確認時超時;

業(yè)務系統(tǒng)主動發(fā)起重試。

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

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

很多時候,如果 MQ 的消費者業(yè)務處理異常,就會出現(xiàn)數(shù)據(jù)一致性問題。

舉個例子,一個完整的業(yè)務流程是,下單成功之后送 100 個積分。下單寫庫成功了,但是消息消費者在送積分的時候失敗了。這樣就會造成數(shù)據(jù)不一致的情況,即該業(yè)務流程的部分數(shù)據(jù)寫庫了,另外一部分沒有寫庫。

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

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

3.3 消息丟失問題

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

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

生產(chǎn)者產(chǎn)生消息時,由于網(wǎng)絡原因發(fā)送到 MQ 失敗了;

MQ 服務器持久化,存儲磁盤時出現(xiàn)異常;

Kafka 和 RocketMQ 的 offset 被回調時,略過了很多消息;

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

導致消息丟失問題的原因挺多的,生產(chǎn)者、MQ 服務器、消費者都有可能產(chǎn)生問題。我在這里就不一一列舉了。

最終的結果會導致消費者無法正確的處理消息,而導致數(shù)據(jù)不一致的情況。

3.4 消息順序問題

有些業(yè)務數(shù)據(jù)是有狀態(tài)的,比如訂單有下單、支付、完成、退貨等狀態(tài)。如果訂單數(shù)據(jù)作為消息體,就會涉及順序問題了。

例如消費者收到同一個訂單的兩條消息。第一條消息的狀態(tài)是下單,第二條消息的狀態(tài)是支付,這是沒問題的。

但如果第一條消息的狀態(tài)是支付,第二條消息的狀態(tài)是下單就會有問題了。沒有下單就先支付了?

消息順序問題是一個非常棘手的問題,比如:

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

RabbitMQ的同一個 queue 能夠保證順序,但是如果多個消費者同一個 queue 也會有順序問題。

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

如果消費消息時同一個訂單的多條消息中,中間的一條消息出現(xiàn)異常情況,順序將會被打亂。

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

3.5 消息堆積

如果消息消費者讀取消息的速度,能夠跟上消息生產(chǎn)者的節(jié)奏,那么整套 MQ 機制就能發(fā)揮最大作用。

但是很多時候,由于某些批處理或者其他原因,導致消費速度小于生產(chǎn)速度。這樣會直接導致消息堆積問題,從而影響業(yè)務功能。

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

3.6 系統(tǒng)復雜度提升

這里說的系統(tǒng)復雜度和系統(tǒng)耦合性是不一樣的。

假設以前只有系統(tǒng) A、系統(tǒng) B 和系統(tǒng) C 三個系統(tǒng),引入 MQ 之后,除了需要關注前面三個系統(tǒng)之外,還需要關注 MQ 服務。需要關注的點越多,系統(tǒng)的復雜度越高。

MQ 的機制需要生產(chǎn)者、MQ 服務器、消費者。有一定的學習成本,需要額外部署 MQ 服務器。

有些 MQ 功能非常強大、用法有點復雜,例如 RocketMQ。如果使用不好,會出現(xiàn)很多問題。有些問題,不像接口調用那么容易排查,從而導致系統(tǒng)的復雜度提升了。

4. 如何解決這些問題?

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

4.1 重復消息問題

不管是由于生產(chǎn)者產(chǎn)生的重復消息,還是由于消費者導致的重復消息,我們都可以在消費者中解決這個問題。

這就要求消費者在做業(yè)務處理時,要做冪等設計。如果有不知道如何設計的朋友,可以參考“高并發(fā)下如何保證接口的冪等性?”,里面介紹得非常詳細。

在這里我推薦增加一張消費消息表,來解決 MQ 的這類問題。

消費消息表中,使用 messageId 做唯一索引。在處理業(yè)務邏輯之前,先根據(jù) messageId 查詢一下該消息有沒有處理過。如果已經(jīng)處理過了則直接返回成功,如果沒有處理過,則繼續(xù)做業(yè)務處理。

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

我們都知道數(shù)據(jù)一致性分為:

強一致性

弱一致性

最終一致性

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

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

有些消息量比較小的業(yè)務場景,可以采用同步重試。在消費消息時如果處理失敗,立刻重試 3-5 次,如果還是失敗則寫入到記錄表中。

但如果消息量比較大,則不建議使用這種方式。因為如果出現(xiàn)網(wǎng)絡異常,可能會導致大量的消息不斷重試,影響消息讀取速度造成消息堆積。

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

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

4.3 消息丟失問題

不管你是否承認,有時候消息真的會丟。即使這種概率非常小,也會對業(yè)務有影響。生產(chǎn)者、MQ 服務器、消費者都有可能會導致消息丟失的問題。為了解決這個問題,我們可以增加一張消息發(fā)送表。

當生產(chǎn)者發(fā)完消息之后,會往該表中寫入一條數(shù)據(jù),狀態(tài) status 標記為待確認;

如果消費者讀取消息之后,調用生產(chǎn)者的 API 更新該消息的 status 為已確認;

有個 job 每隔一段時間檢查一次消息發(fā)送表,如果5分鐘(這個時間可以根據(jù)實際情況來定)后還有狀態(tài)是待確認的消息,則認為該消息已經(jīng)丟失了,重新發(fā)條消息。

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

4.4 消息順序問題

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

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

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

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

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

4.5 消息堆積

如果消費者消費消息的速度小于生產(chǎn)者生產(chǎn)消息的速度,將會出現(xiàn)消息堆積問題。其實這類問題產(chǎn)生的原因很多。如果想要進一步了解,可以看看“我用kafka兩年踩過的一些非比尋常的坑”。

那么消息堆積問題該如何解決呢?這個要看消息是否需要保證順序。

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

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

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

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    13

    文章

    10013

    瀏覽量

    90391
  • 消息
    +關注

    關注

    0

    文章

    29

    瀏覽量

    13024

原文標題:面霸篇:MQ 的 5 大問題詳解

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    NVMe高速傳輸之擺脫XDMA設計37:隊列管理功能驗證與分析1

    本文主要交流設計思路,在本博客已給出相關博文九十多篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。若有產(chǎn)品或項目需求,請看B站視頻后聯(lián)系 隊列管理功能主要包含創(chuàng)建
    發(fā)表于 10-13 11:17

    mailbox和消息隊列 recv兩次會卡死怎么解決?

    如下面的線程,首先創(chuàng)建一個消息隊列,在循環(huán)內一直接收消息隊列的內的消息,不創(chuàng)建發(fā)送消息線程用于測試rt_mq_recv能否在指定時間內返回超時的錯誤碼,實際測試第一次可以正常超時返回,第二次就直接
    發(fā)表于 09-19 06:26

    LP6274:1進多出/2進多出電平轉換芯片

    面板所需的高低電壓電平信號,為面板驅動提供穩(wěn)定的信號轉換支持。 在功能設計上,LP6274 的 CLK 采用 “少進多出” 架構,用戶可靈活選擇 1 進多出或 2 進多出模式;輸出的 CLK 則能
    發(fā)表于 08-13 10:16

    NVMe IP高速傳輸卻不依賴XDMA設計之九:隊列管理模塊(上)

    這是采用PCIe設計NVMe,并非調用XDMA方式,后者在PCIe4.0時不大方便,故團隊直接采用PCIe設計,結合UVM驗證加快設計速度。 隊列管理模塊采用隊列的存儲與控制分離的設計結構。
    的頭像 發(fā)表于 08-04 09:53 ?520次閱讀
    NVMe IP高速傳輸卻不依賴XDMA設計之九:<b class='flag-5'>隊列</b>管理模塊(上)

    NVMe高速傳輸之擺脫XDMA設計十:隊列管理模塊設計(下)

    ,這些請求經(jīng)過Round Robin仲裁器的仲裁后被發(fā)送給SSD。實際上,隨著仲裁輸入數(shù)量的增加,仲裁的效率和時序也變差[[i]]。假設采用完成隊列和提交隊列一一對應的結構,仲裁的輸入數(shù)量將是提交
    發(fā)表于 07-30 16:27

    NVMe高速傳輸之擺脫XDMA設計九:隊列管理模塊設計(上)

    設計,結合UVM驗證加快設計速度。隊列管理模塊采用隊列的存儲與控制分離的設計結構,如圖1所示為隊列管理模塊的結構框圖。 圖1隊列管理模塊結構圖對于提交
    發(fā)表于 07-27 17:41

    RabbitMQ消息隊列解決方案

    在現(xiàn)代分布式系統(tǒng)架構中,消息隊列作為核心組件,承擔著系統(tǒng)解耦、異步處理、流量削峰等重要職責。RabbitMQ作為一款成熟的消息隊列中間件,以其高可用性、高可靠性和豐富的特性,成為眾多企業(yè)的首選方案。本文將從運維工程師的角度,詳細闡述RabbitMQ從單機部署到集群搭建的完
    的頭像 發(fā)表于 07-08 15:55 ?364次閱讀

    RDMA簡介5之RoCE V2隊列分析

    種操作中,只有RECEIVE操作會被添加到接收隊列。SEND/RECEIVE操作的完整流程,如圖1所示,首先由應用程序創(chuàng)建一個工作請求(WR),并將其提交到相應的工作隊列。接著,工作隊列
    發(fā)表于 06-05 17:28

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現(xiàn)了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。隊列管理模塊中含有數(shù)
    發(fā)表于 05-03 20:19

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現(xiàn)了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。隊列管理模塊中含有數(shù)
    的頭像 發(fā)表于 05-03 15:32 ?345次閱讀
    NVME控制器之<b class='flag-5'>隊列</b>管理模塊

    芯片離子注入后退火引入的工藝問題

    本文簡單介紹了芯片離子注入后退火引入的工藝問題:射程末端(EOR)缺陷、硼離子注入退火問題和磷離子注入退火問題。
    的頭像 發(fā)表于 04-23 10:54 ?1158次閱讀
    芯片離子注入后退火<b class='flag-5'>會</b><b class='flag-5'>引入</b>的工藝問題

    STM32F103 TIM1_CH3N輸出的PWM波形為什么多出一個邊沿?

    紅色為TIM1_CH3N,綠色為TIM1_CH3,為什么TIM1_CH3N輸出的PWM波形多出這一個邊沿?是由于什么原因導致的?
    發(fā)表于 03-13 06:58

    JavaWeb消息隊列使用指南

    在現(xiàn)代的JavaWeb應用中,消息隊列(Message Queue)是一種常見的技術,用于異步處理任務、解耦系統(tǒng)組件、提高系統(tǒng)性能和可靠性。 1. 消息隊列的基本概念 消息隊列是一種應用程序對應
    的頭像 發(fā)表于 11-25 09:27 ?795次閱讀

    探索字節(jié)隊列的魔法:多類型支持、函數(shù)重載與線程安全

    探索字節(jié)隊列的魔法:多類型支持、函數(shù)重載與線程安全代碼難度指數(shù):文章學習重點:參數(shù)宏的使用技巧一、引言在嵌入式系統(tǒng)和實時應用中,數(shù)據(jù)的傳輸和處理是至關重要的。字節(jié)隊列(ByteQueue)是一種重要
    的頭像 發(fā)表于 11-15 01:08 ?1421次閱讀
    探索字節(jié)<b class='flag-5'>隊列</b>的魔法:多類型支持、函數(shù)重載與線程安全

    為什么同一個隊列引用的全局變量,運行在兩個子vi中發(fā)現(xiàn)隊列數(shù)據(jù)丟失了

    我創(chuàng)建了一個隊列,然后將隊列引用做了個全局變量,運行在兩個子vi中,一個是只入隊列,另一個是只出隊列。但我發(fā)現(xiàn),一個字vi數(shù)據(jù)入隊列成功,檢
    發(fā)表于 11-14 11:47