一、消息確認(rèn)機(jī)制
成都創(chuàng)新互聯(lián)公司成立于2013年,先為彰武等服務(wù)建站,彰武等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為彰武企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
rabbitmq在發(fā)送消息后立即從內(nèi)存中刪除消息,因此如果消費(fèi)者處理消息耗時(shí)較長(zhǎng),在處理過(guò)程中消費(fèi)者被kill,則處理中的消息、以及其他發(fā)往該消費(fèi)者的消息都將丟失。
為了保證消息不丟失,rabbitmq支持消息確認(rèn)機(jī)制,消費(fèi)者可以發(fā)送ack告訴rabbitm指定消息已經(jīng)收到并處理,因此rabbitmq可以刪除該消息。
如果消費(fèi)者死掉(channel關(guān)閉、connection關(guān)閉、或者TCP connection丟失),導(dǎo)致rabbitmq沒(méi)有收到ack,rabbitmq將把消息重入隊(duì)列。
不存在消息超時(shí),這意味著處理一個(gè)消息非常長(zhǎng)的時(shí)間也是ok的。
消息確認(rèn)機(jī)制默認(rèn)是開(kāi)啟的,通過(guò)在channel.basic_consume中設(shè)置no_ack=True關(guān)閉。
注意消費(fèi)者在處理消息后,不要忘記調(diào)用channel.basic_ack進(jìn)行消息確認(rèn),否則rabbitmq將不斷消耗內(nèi)存把消息重入隊(duì)列。
二、隊(duì)列/消息持久化
為了防止rabbitmq服務(wù)終止導(dǎo)致隊(duì)列和消息丟失,需要將隊(duì)列和消息標(biāo)記為持久化的:
確保rabbitmq永遠(yuǎn)不丟失隊(duì)列,需要將隊(duì)列 聲明為持久化的:
channel.queue_declare(queue='task_queue', durable=True)
將消息聲明為持久化的:
channel.basic_publish(exchange='', routing_key="task_queue", body=message, properties=pika.BasicProperties( delivery_mode = 2, # make message persistent ))
注意:盡管已經(jīng)很健壯了,但是仍然無(wú)法完全保證消息不會(huì)丟失,例如rabbitmq接收消息但是還沒(méi)有保存到硬盤(pán)的情況。
三、exchange
簡(jiǎn)單的說(shuō),exchange的一端接收消息,另一端把消息放進(jìn)隊(duì)列。
在rabbitmq中生產(chǎn)者不會(huì)將請(qǐng)求直接發(fā)送給消費(fèi)者,生產(chǎn)值只會(huì)把消息發(fā)給exchange,exchange收到消息后需要知道怎么做:添加到特定隊(duì)列、添加到多個(gè)隊(duì)列、還是丟棄。
exchange的類(lèi)型包括direct,topic,headers,fanout
四、綁定
exchange和queue之間的聯(lián)系被稱(chēng)為綁定(binding),可以簡(jiǎn)單的看:隊(duì)列對(duì)于特定exchange上的消息感興趣
channel.queue_bind(exchange='logs', queue=result.method.queue)
此時(shí)'logs' exchange將添加消息到指定queue
綁定可以使用一個(gè)額外的routing_key參數(shù),例如:
channel.queue_bind(exchange=exchange_name, queue=queue_name, routing_key='black')
對(duì)于fanout類(lèi)型的exchange來(lái)說(shuō),routing_key參數(shù)是被忽略的
五、topic exchange
發(fā)往topic exchange的消息不能攜帶任意的routing_key,必須是以點(diǎn)隔開(kāi)的一串字符,最大255個(gè)字節(jié)
binding key也必須是相同的形式,注意binding key有兩個(gè)重要的特殊情況:
* 可以替代一個(gè)單詞
#可以替代零個(gè)或多個(gè)單詞
例如,如果binding key是*.orange.*,則可以匹配所有<one word>.orange.<one word>的key,但是如果key不是*.*.*的形式,例如orange,或者quick.orange.male.rabbit,則消息將被丟棄。
如果binding key是lazy.#,則類(lèi)似于帶有l(wèi)azy.orange.male.rabbit的key的消息可以匹配。
topic exchange非常強(qiáng)大,通過(guò)匹配routing_key可以表現(xiàn)的像存在多個(gè)exchange
六、RPC
為了接收響應(yīng),客戶(hù)端需要在發(fā)送請(qǐng)求時(shí)附加發(fā)送回調(diào)隊(duì)列地址:
result = channel.queue_declare(exclusive=True) callback_queue = result.method.queue channel.basic_publish(exchange='', routing_key='rpc_queue', properties=pika.BasicProperties( reply_to = callback_queue, ), body=request) # ... and some code to read a response message from the callback_queue ...
名稱(chēng)欄目:rabbitmq學(xué)習(xí)筆記
當(dāng)前鏈接:http://chinadenli.net/article18/gdsddp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、企業(yè)建站、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)