阿里云國際站經(jīng)銷商,主營阿里云,騰訊云,華為云,亞馬遜aws,谷歌云gcp,微軟云az,免費(fèi)開戶,代充值優(yōu)惠大,聯(lián)系客服飛機(jī)@jkkddd
背景信息
消息服務(wù)MNS提供的隊(duì)列(Queue)主要的特點(diǎn)是高可靠、高可用、高并發(fā)。每個隊(duì)列的數(shù)據(jù)都會被持久化三份到阿里云的飛天分布式平臺。其中每個隊(duì)列至少有兩臺服務(wù)器向外提供服務(wù),同時(shí)每臺服務(wù)器都支持高并發(fā)訪問。這些分布式特性導(dǎo)致了消息服務(wù)MNS的隊(duì)列無法像傳統(tǒng)單機(jī)隊(duì)列嚴(yán)格保證消息FIFO,只能做到基本有序。
隊(duì)列如果同時(shí)有多個消息發(fā)送者(Sender),由于并發(fā)和網(wǎng)絡(luò)延遲等問題,根本無法獲知消息的實(shí)際發(fā)送順序和消息到達(dá)服務(wù)器端的真實(shí)順序。同理,當(dāng)有多個接收者并發(fā)接收消息時(shí),其真正的處理順序也不可獲知。綜上所述,只有一個發(fā)送者(一個進(jìn)程,可以是多個線程)、一個接收者時(shí),消息順序才有意義,也只有在這種情況下才能感知和記錄消息的真實(shí)發(fā)送和接收順序。
解決方案
基于上述假設(shè),同時(shí)為了滿足部分用戶對于消息消費(fèi)順序性的要求,設(shè)計(jì)了以下方案,確保消息按照用戶發(fā)送順序被接收和消費(fèi)。
消息在發(fā)送端進(jìn)行染色,加上SeqId(例如:#num#)。
消息在接收端進(jìn)行還原,并根據(jù)SeqId排序后返回給上層,同時(shí)對于已經(jīng)接收的消息會有后臺線程保證消息不會被重復(fù)消費(fèi)。
為了避免因?yàn)榘l(fā)送者或者接收者fail導(dǎo)致SeqId丟失。SeqId會被持久存儲到本地磁盤文件,或者其他存儲和數(shù)據(jù)庫,例如OSS、OTS或RDS。
注意事項(xiàng)
本文的主要目的是展示順序消息的解決方案,不建議不加測試直接用于生產(chǎn)環(huán)境。
正常情況下,發(fā)送端和接收端的SeqId應(yīng)該和隊(duì)列中的消息(染色)匹配。當(dāng)出現(xiàn)刪除隊(duì)列重新創(chuàng)建等操作時(shí),請注意磁盤文件中的SeqId是否和隊(duì)列中的真實(shí)情況相符,同時(shí)建議不要往染色的消息隊(duì)列里發(fā)送非染色消息。
隊(duì)列的消息有效期設(shè)置過短或者每條消息的實(shí)際處理結(jié)果都有可能會對消息有序性造成影響,在您的程序中需要對這些情況所導(dǎo)致的亂序現(xiàn)象進(jìn)行處理。
示例代碼
本文以Python版的方案實(shí)現(xiàn)為例,下載地址:有序隊(duì)列Python示例代碼(依賴MNS Python SDK)。其中,主要提供了OrderedQueueWrapper類(ordered_queue.py文件),可以將普通隊(duì)列包裝成有序隊(duì)列。
OrderedQueueWrapper提供SendMessageInOrder()和ReceiveMessageInOrder()方法:
發(fā)送時(shí)對消息進(jìn)行染色。
接收時(shí)還原消息,并且按順序返回給接收者。
另外,send_message_in_order.py和receive_message_in_order.py提供發(fā)送者和接收者使用OrderedQueueWrapper的程序示例。
運(yùn)行方法
配置send_message_in_order.py和receive_message_in_order.py中的配置項(xiàng)g_endpoint、g_accessKeyId、g_accessKeySecret以及g_testQueueName。
運(yùn)行send_message_in_order.py。
心靈雞湯:
標(biāo)題:阿里云服務(wù)器購買,阿里云賬號免費(fèi)注冊
地址:http://m.nickbaillie.com/kfxw/64310.html