日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot高级-消息-JMSAMQP简介

發(fā)布時(shí)間:2024/4/13 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot高级-消息-JMSAMQP简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們來學(xué)習(xí)SpringBoot和消息,SpringBoot與消息隊(duì)列的整合使用,包括消息隊(duì)列的兩個(gè)常見規(guī)范,JMS Java消息服務(wù),和AMQP,高級消息隊(duì)列協(xié)議,而且我們還會整合RabbitMQ來使用,其實(shí)在我們大多的應(yīng)用中,我們都可以引用消息中間件,來提升我們系統(tǒng)的異步通信能力,以及擴(kuò)展解耦能力,為什么會有消息服務(wù)中間件

第一個(gè)是我們的異步處理,我們以某個(gè)用戶注冊為例,用戶注冊成功以后,將他的注冊信息寫進(jìn)數(shù)據(jù)庫,我同時(shí)還想給他發(fā)送一封郵件,并且發(fā)一封短信,如果是以前我們的方式,同步調(diào)用,寫完數(shù)據(jù)庫,調(diào)發(fā)郵件方法,再調(diào)發(fā)短信方法,每一個(gè)方法50毫秒,那我們合起來在150毫秒以后,我們來響應(yīng)用戶,這樣是很慢的,你發(fā)注冊郵件,跟發(fā)短信,不是下一毫秒立馬就要做完,用戶立馬就要看效果的,你可以慢慢來處理,我想要第二種模式,當(dāng)我用戶吧用戶信息寫進(jìn)數(shù)據(jù)庫,50毫秒以后,那接下來我用多線程的方式,我來并發(fā)執(zhí)行兩個(gè)操作,第一個(gè)是發(fā)送注冊郵件,第二個(gè)發(fā)短信,由于是并發(fā),發(fā)了一個(gè)最長的時(shí)間,合起來響應(yīng)100毫秒,我們此時(shí)就可以引入一個(gè)東西,叫消息隊(duì)列,這樣我們用戶將注冊好的信息,寫進(jìn)數(shù)據(jù)庫以后,他只需要將我們后來需要的信息,很快的寫進(jìn)消息隊(duì)列里邊,寫進(jìn)消息隊(duì)列呢,比如5毫秒,只要寫進(jìn)消息隊(duì)列,立馬返回,用戶在55毫秒就響應(yīng)成功,而接下來發(fā)送郵件,以及發(fā)送短信,這些服務(wù)呢,他們都可以通過異步讀取的方式,自己從消息隊(duì)列取出自己要的信息,給用戶發(fā)郵件,發(fā)短信,這是我們第一個(gè)場景,進(jìn)行異步處理,來提升我們異步通信能力,第二個(gè)是我們應(yīng)用解耦

訂單系統(tǒng)和庫存系統(tǒng),如果我們寫在一個(gè)應(yīng)用里面,我來下一個(gè)單,我們要減庫存,下完單要來減庫存的方法,這樣我們耦合起來也是很麻煩的,包括就跟我們剛才說的一樣,接下來我們可以怎么做呢,我們把訂單系統(tǒng)單獨(dú)抽取出來,庫存系統(tǒng)也單獨(dú)抽取出來,我們可以用微服務(wù)的方式抽取一個(gè)服務(wù),只要我們下單了,下單的信息寫到消息隊(duì)列里面,那么庫存系統(tǒng)通過訂閱消息隊(duì)列,這些內(nèi)容,只要消息隊(duì)列里面有一個(gè)訂單內(nèi)容,里面就會收到訂單的信息,而庫存系統(tǒng)在這計(jì)算庫存相關(guān)的操作,這就是我們這個(gè)應(yīng)用解耦,我們就引入消息隊(duì)列,來解耦兩個(gè)應(yīng)用,包括我們還有一個(gè)場景就是流量削峰,例如我們秒殺,比如我們有10萬個(gè)人,我們這個(gè)商品只有1萬個(gè),10萬個(gè)人要同時(shí)來秒殺,如果每一個(gè)人的請求都發(fā)過來,我們TOMCAT來處理,這是不是很麻煩,而且肯定卡死,那怎么做呢,我們的用戶秒殺請求進(jìn)來,秒殺請求直接進(jìn)消息隊(duì)列里邊,消息隊(duì)列我們可以來一個(gè)定長,他只能存儲一萬個(gè)數(shù)據(jù),那怎么辦呢,10萬個(gè)用戶,誰快誰先進(jìn)隊(duì),那么進(jìn)隊(duì)以后呢,后面9萬個(gè)進(jìn)不了隊(duì)列,立即響應(yīng)秒殺失敗,那么相當(dāng)于他搶占了一個(gè)座位,只要他搶占到座位了,消息隊(duì)列里面有內(nèi)容了,秒殺業(yè)務(wù)處理邏輯就慢慢的取出這些數(shù)據(jù),將秒殺的信息轉(zhuǎn)發(fā)后臺,這是我們的應(yīng)用場景

這些場景引入我們?yōu)槭裁匆孟⒅虚g件,我們的消息隊(duì)列,說起消息服務(wù)這里面有兩個(gè)重要的概念,一個(gè)叫消息代理,另外一個(gè)叫目的地,所謂的消息代理,就是我們消息中間件的服務(wù)器,我們要給消息隊(duì)列里面存儲內(nèi)容,就要連接消息中間件的服務(wù)器,這個(gè)我們稱之為消息代理,我們這個(gè)消息發(fā)送者,是將消息發(fā)送到消息代理,也就是發(fā)送到服務(wù)器,我們服務(wù)器接管到消息以后,服務(wù)器要把消息發(fā)送到一個(gè)指定的目的地,這就是我們要說的目的地,目的地可以有兩種形式,第一種隊(duì)列的形式,可以進(jìn)行點(diǎn)對點(diǎn)通信,和主題來進(jìn)行發(fā)布訂閱,這兩種通信機(jī)制呢,我們來了解一下 我們說的點(diǎn)對點(diǎn)式,其實(shí)指的就是發(fā)送者發(fā)送A,把消息發(fā)到一個(gè)隊(duì)列里邊,我們這個(gè)消息接著收呢,可以從B里面取出這個(gè)東西,而且消息一旦被取出以后,我們這個(gè)消息隊(duì)列里面的東西,就會被移除,當(dāng)然我們說,消息只有一個(gè)唯一的發(fā)送者,和接受者,但是不是只有一個(gè)接收者,接受者和接收者,我們B,C,D可以同時(shí)都來收消息隊(duì)列里面的內(nèi)容,但是我們說了,只要有一個(gè)人比如B拿到了,那C就不可能再來拿到了,比如我們這個(gè)消息一旦被消費(fèi),就會被刪除,這是我們點(diǎn)對點(diǎn)式,還有一種叫發(fā)布訂閱式,發(fā)布訂閱式指的就是,我們消息的發(fā)布者A,他把一個(gè)消息發(fā)布到主題,成為主題里面的topic,那我們多個(gè)接收者,B,C,D,我們可以同時(shí)來訂閱這個(gè)主題,也就是監(jiān)聽,我們可以監(jiān)聽里面的消息,只要這個(gè)消息已經(jīng)到達(dá),B,C,D同時(shí)都能夠收到消息,這叫發(fā)布訂閱,而以前這個(gè)點(diǎn)對點(diǎn),是只有一個(gè)能夠收到這個(gè)消息,這個(gè)就是兩個(gè)收到消息通信機(jī)制,接下來就是兩個(gè)常見的消息服務(wù)規(guī)范,第一個(gè)叫JMS,JAVA消息服務(wù),這是J2EE給我們制定的JVM的消息代理規(guī)范,而大家聽過的ActiveMQ,就是基于JVM的一個(gè)實(shí)現(xiàn),而另外一個(gè)代理消息規(guī)范呢,就是AMQP,高級消息隊(duì)列協(xié)議,他能兼容JMS,而RabbitMQ就是高級消息隊(duì)列的一個(gè)實(shí)現(xiàn),那么這兩個(gè)有什么不同呢,都是相當(dāng)于消息代理的規(guī)范,我們在這做一個(gè)簡單的對比

首先JMS是我們JAVA規(guī)定的API,而AMQP呢,它是網(wǎng)絡(luò)級的一個(gè)協(xié)議,所以跨語言和跨平臺,那我們JAVA規(guī)定的那只能用JAVA語言,和我們JAVA平臺,而我們AMQP,它是跨語言和跨平臺的,而JMS規(guī)范呢,他提供了兩種消息模型,就是我們的第一種點(diǎn)對點(diǎn)的消息模型,和第二種發(fā)布訂閱模型,而我們高級消息隊(duì)列,他提供了5種消息模型,后來我們在用RabbitMQ的時(shí)候呢,我們回來進(jìn)行測試,第一種就是我們說的點(diǎn)對點(diǎn),而后面四種就是發(fā)布訂閱,只是他更細(xì)致,那么對于JMS來說,能發(fā)消息,我們有這么多的類型,而我們AMQP,相關(guān)系列的產(chǎn)品,由于它是跨平臺的,所以說你發(fā)的什么消息,都是將消息序列化后在發(fā)送,都是一些字節(jié)數(shù)據(jù),綜合起來,首先JMS他不是跨平臺的,但是如果我們都是JAVA應(yīng)用,用面向JMS對象編程,我們無論用哪個(gè)產(chǎn)品的JMS的實(shí)現(xiàn),我們都不需要改代碼,這是比較友好的,我們AMQP呢,它是跨平臺的,所以說這個(gè)在后來,用的還是比較多的,但是后來不管選型JMS,還是用AMQP,我們Spring底層都是支持的

Spring底層有JMS模塊,它提供了對JMS產(chǎn)品操作的支持,包括對Spring-rabbit模塊,提供了對AMQP產(chǎn)品,特別是對rabbitmq操作的支持,那如果有了SpringBoot,要用相應(yīng)的場景,就更簡單了,你來到SpringBoot里邊,比如你要操作JMS的spring-boot-starter-activemqStarter for JMS messaging using Apache ActiveMQ這里有JMS的兩個(gè)操作產(chǎn)品,比如有ActiveMQ的,還有artemis的,都不可以導(dǎo)入相關(guān)的依賴,比如我們后面要來測rabbitmq的,我們都可以在這里導(dǎo)入相關(guān)的場景,我們來提供支持,當(dāng)然有了他們以后呢,Spring在底層給我們提供了JmsTemplate,和RabbitTemplate,來發(fā)送消息,我們可以用Spring提供的兩個(gè)簡化注解,如果是Jms的情況下,可以用JMSListener來監(jiān)聽,如果是AMQP,可以用@RabbitListener來監(jiān)聽,我們要用這兩個(gè)注解來開啟相關(guān)的支持,JMS的情況下用他,我們后來進(jìn)行測試,包括我們用了SpringBoot,都是有相關(guān)的配置的,我們只需要簡單,最少量的情況下,配置一個(gè)消息代理的服務(wù)器地址

?

總結(jié)

以上是生活随笔為你收集整理的SpringBoot高级-消息-JMSAMQP简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。