欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

消息隊(duì)列MQ使用詳解

 更新時(shí)間:2024年10月12日 11:00:36   作者:Lvan的前端筆記  
消息隊(duì)列(MQ)是一種基于“先進(jìn)先出”原則的數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于分布式系統(tǒng)中,主要用于應(yīng)用解耦、異步消息處理和流量削峰,消息隊(duì)列中間件通過(guò)允許生產(chǎn)者發(fā)送消息到隊(duì)列,消費(fèi)者從隊(duì)列中拉取消息或訂閱消息,實(shí)現(xiàn)高效、可擴(kuò)展和最終一致性的系統(tǒng)架構(gòu)

什么是消息隊(duì)列MQ

MQ(Message Queue)消息隊(duì)列,是基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)中“先進(jìn)先出”的一種數(shù)據(jù)結(jié)構(gòu)。指把要傳輸?shù)臄?shù)據(jù)(消息)放在隊(duì)列中,用隊(duì)列機(jī)制來(lái)實(shí)現(xiàn)消息傳遞——生產(chǎn)者產(chǎn)生消息并把消息放入隊(duì)列,然后由消費(fèi)者去處理。

消費(fèi)者可以到指定隊(duì)列拉取消息,或者訂閱相應(yīng)的隊(duì)列,由MQ服務(wù)端給其推送消息。

作用

消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用解耦,異步消息,流量削鋒等問(wèn)題,實(shí)現(xiàn)高性能,高可用,可伸縮和最終一致性架構(gòu)。

  • 解耦:一個(gè)業(yè)務(wù)需要多個(gè)模塊共同實(shí)現(xiàn),或者一條消息有多個(gè)系統(tǒng)需要對(duì)應(yīng)處理,只需要主業(yè)務(wù)完成以后,發(fā)送一條MQ,其余模塊消費(fèi)MQ消息,即可實(shí)現(xiàn)業(yè)務(wù),降低模塊之間的耦合。
  • 異步:主業(yè)務(wù)執(zhí)行結(jié)束后從屬業(yè)務(wù)通過(guò)MQ,異步執(zhí)行,減低業(yè)務(wù)的響應(yīng)時(shí)間,提高用戶體驗(yàn)。
  • 削峰:高并發(fā)情況下,業(yè)務(wù)異步處理,提供高峰期業(yè)務(wù)處理能力,避免系統(tǒng)癱瘓。

缺點(diǎn)

1、系統(tǒng)可用性降低。依賴服務(wù)也多,服務(wù)越容易掛掉。需要考慮MQ癱瘓的情況

2、系統(tǒng)復(fù)雜性提高。需要考慮消息丟失、消息重復(fù)消費(fèi)、消息傳遞的順序性

3、業(yè)務(wù)一致性。主業(yè)務(wù)和從屬業(yè)務(wù)一致性的處理

主要產(chǎn)品

主要的 MQ 產(chǎn)品包括:RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka、IBM WebSphere 等。

比較火的是 RocketMQ 和 Kafka。

分別應(yīng)用在 web 和大數(shù)據(jù)

舉例

1、例一

一個(gè)實(shí)際的使用消息隊(duì)列(MQ)的例子是電商網(wǎng)站的訂單處理系統(tǒng)。在電商網(wǎng)站中,用戶下單后需要經(jīng)過(guò)一系列的處理流程,包括訂單驗(yàn)證、庫(kù)存檢查、支付處理、物流跟蹤等。這些處理流程需要多個(gè)模塊之間進(jìn)行協(xié)作,而且每個(gè)模塊都需要處理大量的訂單數(shù)據(jù)。

為了解決這些問(wèn)題,可以使用消息隊(duì)列系統(tǒng)來(lái)實(shí)現(xiàn)訂單處理流程的異步處理。具體來(lái)說(shuō),可以將訂單數(shù)據(jù)發(fā)送到一個(gè)訂單處理隊(duì)列中,然后由不同的模塊從隊(duì)列中獲取訂單數(shù)據(jù)進(jìn)行處理。這樣就可以將訂單數(shù)據(jù)的發(fā)送和接收者進(jìn)行解耦,實(shí)現(xiàn)了系統(tǒng)的高可靠性、可伸縮性和可維護(hù)性。

舉個(gè)例子,當(dāng)用戶下單后,訂單系統(tǒng)會(huì)將訂單數(shù)據(jù)發(fā)送到訂單處理隊(duì)列中,然后庫(kù)存系統(tǒng)會(huì)從隊(duì)列中獲取訂單數(shù)據(jù)進(jìn)行庫(kù)存檢查,支付系統(tǒng)會(huì)從隊(duì)列中獲取訂單數(shù)據(jù)進(jìn)行支付處理,物流系統(tǒng)會(huì)從隊(duì)列中獲取訂單數(shù)據(jù)進(jìn)行物流跟蹤等。這些模塊之間可以并行處理訂單數(shù)據(jù),而且每個(gè)模塊都可以獨(dú)立地進(jìn)行擴(kuò)展和升級(jí),從而實(shí)現(xiàn)了系統(tǒng)的高可用性和可伸縮性。

另外,由于電商網(wǎng)站的訂單數(shù)據(jù)量可能非常大,使用消息隊(duì)列可以實(shí)現(xiàn)削峰填谷,平滑處理訂單請(qǐng)求,從而保證系統(tǒng)的可用性和穩(wěn)定性。此外,使用消息隊(duì)列還可以實(shí)現(xiàn)訂單數(shù)據(jù)的緩存和延遲處理,以提高系統(tǒng)的性能和吞吐量。

總之,使用消息隊(duì)列可以使得電商網(wǎng)站的訂單處理系統(tǒng)更加高效、可靠和可維護(hù),是現(xiàn)代電商系統(tǒng)中必不可少的技術(shù)。

例二

在線游戲中的多人游戲場(chǎng)景同步。在多人游戲中,多個(gè)玩家之間需要實(shí)時(shí)同步游戲場(chǎng)景的狀態(tài),包括角色位置、狀態(tài)、動(dòng)作等,同時(shí)還需要處理玩家之間的交互、碰撞等復(fù)雜場(chǎng)景邏輯。

為了實(shí)現(xiàn)這樣的實(shí)時(shí)場(chǎng)景同步,可以使用消息隊(duì)列來(lái)處理游戲場(chǎng)景事件的分發(fā)和處理。具體來(lái)說(shuō),可以將游戲場(chǎng)景中的事件(如玩家移動(dòng)、攻擊、技能釋放等)封裝成消息,然后通過(guò)消息隊(duì)列進(jìn)行廣播,讓所有參與游戲的客戶端都能夠接收到相應(yīng)的消息,并根據(jù)消息內(nèi)容來(lái)更新本地的游戲狀態(tài)。

使用消息隊(duì)列的好處在于,它可以將游戲場(chǎng)景事件的發(fā)送和接收者進(jìn)行解耦,從而提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。同時(shí),由于消息隊(duì)列可以處理大量的消息,還可以應(yīng)對(duì)高并發(fā)的場(chǎng)景,并且能夠削峰填谷,提高系統(tǒng)的穩(wěn)定性和可用性。

在多人游戲中,使用消息隊(duì)列還可以實(shí)現(xiàn)一些高級(jí)功能,比如實(shí)現(xiàn)延遲同步、反作 弊等。比如,可以將游戲場(chǎng)景中的事件緩存到消息隊(duì)列中,并設(shè)置一定的延遲時(shí)間后再進(jìn)行處理,以確保所有玩家都能夠接收到相同的游戲狀態(tài)。此外,還可以使用消息隊(duì)列來(lái)監(jiān)控和過(guò)濾玩家的行為,以檢測(cè)和防范作弊行為。

綜上所述,使用消息隊(duì)列可以實(shí)現(xiàn)多人游戲場(chǎng)景的實(shí)時(shí)同步,并提高系統(tǒng)的可擴(kuò)展性、可維護(hù)性和穩(wěn)定性,是現(xiàn)代游戲開(kāi)發(fā)中的重要技術(shù)。

例三

用戶注冊(cè)后,需要發(fā)注冊(cè)郵件和注冊(cè)短信,傳統(tǒng)的做法有兩種

  • 1.串行的方式;
  • 2.并行的方式 ;
  • 3.消息隊(duì)列

(1)串行方式:將注冊(cè)信息寫(xiě)入數(shù)據(jù)庫(kù)后,發(fā)送注冊(cè)郵件,再發(fā)送注冊(cè)短信,以上三個(gè)任務(wù)全部完成后才返回給客戶端。這有一個(gè)問(wèn)題是,郵件,短信并不是必須的,它只是一個(gè)通知,而這種做法讓客戶端等待沒(méi)有必要等待的東西。

(2)并行方式:將注冊(cè)信息寫(xiě)入數(shù)據(jù)庫(kù)后,發(fā)送郵件的同時(shí),發(fā)送短信,以上三個(gè)任務(wù)完成后,返回給客戶端,并行的方式能提高處理的時(shí)間。

(3)消息隊(duì)列
引入消息隊(duì)列后,把發(fā)送郵件,短信不是必須的業(yè)務(wù)邏輯異步處理。

例四:流量削峰

秒殺活動(dòng),一般會(huì)因?yàn)榱髁窟^(guò)大,導(dǎo)致應(yīng)用掛掉,為了解決這個(gè)問(wèn)題,一般在應(yīng)用前端加入消息隊(duì)列。

用戶的請(qǐng)求,服務(wù)器收到之后,首先寫(xiě)入消息隊(duì)列,加入消息隊(duì)列長(zhǎng)度超過(guò)最大值,則直接拋棄用戶請(qǐng)求或跳轉(zhuǎn)到錯(cuò)誤頁(yè)面。秒殺業(yè)務(wù)根據(jù)消息隊(duì)列中的請(qǐng)求信息,再做后續(xù)處理。

發(fā)布訂閱 vs MQ

發(fā)布訂閱模式和消息隊(duì)列(MQ)都是在分布式系統(tǒng)中廣泛使用的消息傳遞機(jī)制,它們都具有將發(fā)送者和接收者解耦的優(yōu)點(diǎn)。

雖然這兩種模式在某些方面相似,但它們也有一些重要的區(qū)別。

誰(shuí)負(fù)責(zé)管理消息?

  • 在發(fā)布訂閱模式中,消息的發(fā)送者不需要知道消息的接收者,而是將消息發(fā)送到一個(gè)主題(Topic),然后所有訂閱該主題的訂閱者都會(huì)接收到該消息。主題的管理通常由發(fā)布者負(fù)責(zé)。
  • 在消息隊(duì)列中,消息的發(fā)送者將消息發(fā)送到隊(duì)列中,然后訂閱該隊(duì)列的訂閱者會(huì)按照隊(duì)列中的消息順序進(jìn)行消費(fèi)。隊(duì)列的管理通常由消息隊(duì)列系統(tǒng)負(fù)責(zé)。

消息如何分發(fā)?

  • 在發(fā)布訂閱模式中,消息是通過(guò)主題進(jìn)行分發(fā)的,所有訂閱該主題的訂閱者都會(huì)接收到相同的消息。這種方式可以使得多個(gè)訂閱者同時(shí)接收到同一份消息。
  • 在消息隊(duì)列中,消息是通過(guò)隊(duì)列進(jìn)行分發(fā)的,每個(gè)消息只會(huì)被一個(gè)訂閱者接收。這種方式可以確保每個(gè)訂閱者都能夠接收到所有消息,但是無(wú)法讓多個(gè)訂閱者同時(shí)接收到同一份消息。

如何處理消息丟失?

  • 在發(fā)布訂閱模式中,如果某個(gè)訂閱者沒(méi)有及時(shí)接收到消息,它將無(wú)法再次獲取到該消息。這可能會(huì)導(dǎo)致消息丟失。
  • 在消息隊(duì)列中,消息通常會(huì)被持久化到磁盤(pán)上,以確保即使在消息消費(fèi)者宕機(jī)的情況下,消息也不會(huì)丟失。如果某個(gè)消費(fèi)者無(wú)法消費(fèi)某個(gè)消息,該消息將被保留在隊(duì)列中,直到可以被正確地處理為止。

用例場(chǎng)景

  • 發(fā)布訂閱模式通常適用于一些事件驅(qū)動(dòng)的應(yīng)用場(chǎng)景,例如消息推送、實(shí)時(shí)數(shù)據(jù)處理等。
  • 消息隊(duì)列則適用于一些流量高、性能穩(wěn)定的場(chǎng)景,例如電商交易、訂單處理、日志處理等。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java集合中的Collection接口總結(jié)

    Java集合中的Collection接口總結(jié)

    這篇文章主要介紹了Java集合中的Collection接口總結(jié),Collection 接口是 List和Set接口的父接口,該接口里定義的方法既可用于操作 Set 集合,也可用于操作 List 集合,需要的朋友可以參考下
    2023-11-11
  • mybatis中resultMap 標(biāo)簽的使用教程

    mybatis中resultMap 標(biāo)簽的使用教程

    resultMap 標(biāo)簽用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象,這篇文章重點(diǎn)給大家介紹mybatis中resultMap 標(biāo)簽的使用,感興趣的朋友一起看看吧
    2018-07-07
  • java多線程之線程,進(jìn)程和Synchronized概念初解

    java多線程之線程,進(jìn)程和Synchronized概念初解

    這篇文章主要介紹了java多線程之線程,進(jìn)程和Synchronized概念初解,涉及進(jìn)程與線程的簡(jiǎn)單概念,實(shí)現(xiàn)多線程的方式,線程安全問(wèn)題,synchronized修飾符等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟

    springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟

    這篇文章主要介紹了springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Java中遇到的For?input?string問(wèn)題解決辦法

    Java中遇到的For?input?string問(wèn)題解決辦法

    這篇文章主要給大家介紹了關(guān)于Java中遇到的For?input?string問(wèn)題的解決辦法,如果出現(xiàn)這樣的異常報(bào)錯(cuò),是指的數(shù)據(jù)轉(zhuǎn)換時(shí)出錯(cuò),文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • SpringMvc入門(mén)指南(必看)

    SpringMvc入門(mén)指南(必看)

    下面小編就為大家?guī)?lái)一篇SpringMvc入門(mén)指南(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • SpringBoot整合Log4j2實(shí)現(xiàn)自定義日志打印失效的原因及解決

    SpringBoot整合Log4j2實(shí)現(xiàn)自定義日志打印失效的原因及解決

    本文給大家介紹了關(guān)于SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效原因及解決辦法,主要的原因是因?yàn)镾pringBoot的logback包的存在,文中通過(guò)圖文給大家了詳細(xì)解決方法,需要的朋友可以參考下
    2024-01-01
  • Mybatis如何一次性插入多條數(shù)據(jù)

    Mybatis如何一次性插入多條數(shù)據(jù)

    這篇文章主要介紹了Mybatis如何一次性插入多條數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java String創(chuàng)建對(duì)象實(shí)例解析

    Java String創(chuàng)建對(duì)象實(shí)例解析

    這篇文章主要介紹了Java String創(chuàng)建對(duì)象實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java中的事件處理機(jī)制詳解

    Java中的事件處理機(jī)制詳解

    這篇文章主要介紹了Java中的事件處理機(jī)制詳解,Java事件處理是采取"委派事件模型",當(dāng)事件發(fā)生時(shí),產(chǎn)生事件的對(duì)象,會(huì)把此"信息"傳遞給"事件的監(jiān)聽(tīng)者"處理,這里所說(shuō)的"信息"實(shí)際上就是java.awt.event事件類庫(kù)里某個(gè)類創(chuàng)建對(duì)象,把它稱為"事件的對(duì)象",需要的朋友可以參考下
    2023-10-10

最新評(píng)論