本篇內(nèi)容介紹了“redis消息隊(duì)列是什么意思”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營(yíng)銷的理念,以專業(yè)定制企業(yè)官網(wǎng),網(wǎng)站制作、網(wǎng)站設(shè)計(jì),微信小程序,網(wǎng)頁(yè)設(shè)計(jì)制作,手機(jī)網(wǎng)站制作,全網(wǎng)整合營(yíng)銷推廣幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長(zhǎng)。
異步的使用場(chǎng)景【符合我們的真實(shí)的世界,真實(shí)世界本來(lái)就是異步的】,生活中大部分的使用都是基于異步的,比如發(fā)送郵件與回復(fù)郵件的請(qǐng)求響應(yīng)模型。
一個(gè)service與另外一個(gè)service有三種交互方式:命令(Commands)、事件(Events)以及查詢(Queries)。一次請(qǐng)求可以理解為由主服務(wù)與觸發(fā)服務(wù)和關(guān)聯(lián)服務(wù)組成。
Commands 。命令是一個(gè)操作。希望在另一個(gè)服務(wù)中執(zhí)行某些操作的一個(gè)請(qǐng)求。 會(huì)改變系統(tǒng)狀態(tài)的東西。 命令期待有響應(yīng)。
Events 。事件既是一個(gè)事實(shí)也是一個(gè)觸發(fā)器。 發(fā)生了一些事情,表示為通知。
Queries 。查詢是一個(gè)請(qǐng)求,是一個(gè)查找一些東西的請(qǐng)求(request)。重要的是,查詢不會(huì)使得系統(tǒng)狀態(tài)發(fā)生改變。
解耦
解耦的基礎(chǔ)含義倡導(dǎo)一種是由上而下,分而治之的思想。
解耦又是消息隊(duì)列最本質(zhì)的目的。把消息的送達(dá)和處理分開,才真正實(shí)現(xiàn)消息系統(tǒng)的解耦。
基于消息的模型,關(guān)心的是通知,而非處理 。只關(guān)心核心流程,多個(gè)任務(wù)的情況下,發(fā)送通知就行了。
經(jīng)典的生產(chǎn)者消費(fèi)者模式的消息模型,通過(guò)Broker分離生產(chǎn)與消息,Broker簡(jiǎn)單來(lái)說(shuō)就是消息服務(wù)器,負(fù)責(zé)消息的接受,存取??梢赃@樣理解:
在服務(wù)型項(xiàng)目開發(fā)上,服務(wù)型項(xiàng)目的意思就是項(xiàng)目本質(zhì)上不是單體應(yīng)用,會(huì)為多個(gè)業(yè)務(wù)服務(wù),上游對(duì)下游的調(diào)用,不直接通過(guò)觸發(fā)方式完成即可,而是通過(guò)消息中心隔離上下游
![服務(wù)調(diào)用方式.jpg](upload-images.jianshu.io)
001
可靠性簡(jiǎn)單來(lái)說(shuō)就是程序把需要處理的任務(wù)進(jìn)行編號(hào),每個(gè)編號(hào)的任務(wù)在任務(wù)運(yùn)行期間都是可以被跟蹤的。每一個(gè)任務(wù)擁有自己的唯一標(biāo)記。比如命名規(guī)則可以是:業(yè)務(wù)組件名稱加時(shí)間戳的生成規(guī)則。
以下 我們看一個(gè)網(wǎng)絡(luò)資料的公開案例
用戶最近N條訂單記錄的Redis存儲(chǔ)
對(duì)于這個(gè)需求需要滿足幾個(gè)條件
1 消息需要有序存儲(chǔ),來(lái)確定數(shù)據(jù)結(jié)構(gòu)SortSet
2 全局跟蹤每條記錄,對(duì)數(shù)據(jù)進(jìn)行唯一編碼
【訂單有序集合中的每個(gè)元素是將時(shí)間毫秒數(shù)+訂單號(hào)最后3位作為分?jǐn)?shù)進(jìn)行排序的。為什么不只用毫秒數(shù)作為分?jǐn)?shù)呢?因?yàn)槲覀兊南聠螘r(shí)間只精確到秒,如果不加訂單號(hào)最后3位,若同一秒有兩個(gè)或兩個(gè)以上訂單時(shí),排序分?jǐn)?shù)就會(huì)一樣,從而導(dǎo)致根據(jù)分?jǐn)?shù)從緩存查詢訂單時(shí)不能保證唯一性。而我們的訂單號(hào)的生成規(guī)則可以保證同一秒內(nèi)的訂單號(hào)的最后3位肯定不一樣】
002
每個(gè)階段在處理任務(wù)時(shí),都需要有任務(wù)回執(zhí),來(lái)表明這條任務(wù)的處理狀態(tài),是處理成功還是失敗,還是別拒絕處理等。我們以SortSet集合為例,隊(duì)列處理消費(fèi)時(shí),一定是按照一定順序,從前往后或者從后往前依次N條的獲取,獲取之后,索取元素被消費(fèi)程序處理,處理的結(jié)果如何就是前文提到的任務(wù)回執(zhí),如果這時(shí)因?yàn)榫W(wǎng)絡(luò)抖動(dòng)或者調(diào)用鏈下游原因?qū)е孪M(fèi)失敗,所取元素代表的業(yè)務(wù)元數(shù)據(jù)也會(huì)隨之消失。這時(shí)候就需要根據(jù)回執(zhí)來(lái)判斷是否需要另外處理所取元素。
使用redis的pubsub功能,訂閱者訂閱頻道,發(fā)布者發(fā)布消息到頻道了,頻道就是一個(gè)消息隊(duì)列。
我們可以認(rèn)為發(fā)布訂閱方式是一種實(shí)時(shí)的通訊模式。
001
redis 發(fā)布訂閱使用場(chǎng)景明顯是構(gòu)建實(shí)時(shí)消息系統(tǒng),依賴于redis服務(wù)端長(zhǎng)連接的穩(wěn)定性。php連接redis的長(zhǎng)鏈接本身就是不靠譜的,而且pubsub也不能使用在可靠性要求比較高的系統(tǒng)中?!静豢孔V】體現(xiàn)在訂閱模式服務(wù)器端開啟訂閱后,過(guò)一段時(shí)間訂閱會(huì)失效,需要不停的輪訓(xùn)開啟訂閱。
針對(duì)Redis的發(fā)布訂閱功能,網(wǎng)上找到一種說(shuō)明
一個(gè)生產(chǎn)者可以對(duì)應(yīng)多個(gè)消費(fèi)者,但是必須保證消息發(fā)布者和消息的訂閱者同時(shí)在線,否則,否則一旦消息訂閱者由于各種異常情況而被迫斷開連接,在其重新連接后,其離線期間的消息是無(wú)法被重新通知的(即發(fā)即棄)。
對(duì)于這種理解,最重要的是在應(yīng)用開發(fā)中如何保證雙發(fā)都在線的長(zhǎng)連接狀態(tài)?
002
對(duì)【不靠譜】的一種解釋如下:
因?yàn)镽edis的監(jiān)聽其實(shí)是打開了一個(gè)長(zhǎng)連接操作的。任何網(wǎng)絡(luò)波動(dòng)都會(huì)斷開的。服務(wù)器內(nèi)網(wǎng)絡(luò)穩(wěn)定的情況下是可以的?;蛘哌@么說(shuō)更準(zhǔn)確一些,redis做長(zhǎng)連接不算是一種優(yōu)選方案。
分布式
涉及到消息隊(duì)列的三個(gè)角色,發(fā)布者,Broker和消費(fèi)者,都可以以集群的形式進(jìn)行部署和發(fā)布。消費(fèi)能力可以通過(guò)增加機(jī)器數(shù)進(jìn)行擴(kuò)展。
補(bǔ)充:根據(jù)參考文檔來(lái)
Q1:分布式消息系統(tǒng)中,如何避免消息重復(fù)?
造成消息重復(fù)的根本原因是:網(wǎng)絡(luò)不可靠。只要通過(guò)網(wǎng)絡(luò)交換數(shù)據(jù),就無(wú)法避免這個(gè)問題。所以解決這個(gè)問題的辦法就是繞過(guò)這個(gè)問題。那么問題就變成了:如果消費(fèi)端收到兩條一樣的消息,應(yīng)該怎樣處理?
a. 消費(fèi)端處理消息的業(yè)務(wù)邏輯保持冪等性;
b. 保證每條消息都有唯一編號(hào)且保證消息處理成功與去重表的日志同時(shí)出現(xiàn)。
通過(guò)冪等性,不管來(lái)多少條重復(fù)消息,可以實(shí)現(xiàn)處理的結(jié)果都一樣。再利用一張日志表來(lái)記錄已經(jīng)處理成功的消息的ID,如果新到的消息ID已經(jīng)在日志表中,那么就可以不再處理這條消息,避免消息的重復(fù)處理。
“Redis消息隊(duì)列是什么意思”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
本文題目:Redis消息隊(duì)列是什么意思
網(wǎng)頁(yè)鏈接:http://aaarwkj.com/article40/jeejho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、App開發(fā)、營(yíng)銷型網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、定制網(wǎng)站、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)