摘要:查看未確認消息命令消息持久化問題雖然消息確認機制能夠保證消費者掛掉時消息不丟失,但是當(dāng)掛掉時,那就沒法保證了,這時就需要持久化了。方法隊列和消息必須設(shè)置為持久化隊列持久化生成者和消費者聲明隊列參數(shù)設(shè)置為,已存在的隊列不能重新設(shè)置參數(shù)值。
消息確認機制
當(dāng)把basic_consume的參數(shù)no_ack設(shè)置為true時,消息達到消費者時就立刻被標記為刪除狀態(tài),如果這時一個worker的消息來不及執(zhí)行完成就被中止掉,那么這條消息就會丟失,所以需要一個消息確認機制,當(dāng)worker掛掉后,把消息重新分發(fā)給另一個woker執(zhí)行
方法:將no_ack設(shè)置為false,然后在回調(diào)函數(shù)中確認消息
$callback = function($msg){ echo " [x] Received ", $msg->body, " "; sleep(substr_count($msg->body, ".")); echo " [x] Done", " "; $msg->delivery_info["channel"]->basic_ack($msg->delivery_info["delivery_tag"]); }; $channel->basic_consume("task_queue", "", false, false, false, false, $callback);
需要特別注意的是,如何忘記確認消息,將耗盡內(nèi)存。查看未確認消息命令:
sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged消息持久化問題
雖然消息確認機制能夠保證消費者掛掉時消息不丟失,但是當(dāng)rabbitmq掛掉時,那就沒法保證了,這時就需要持久化
了。
方法:隊列和消息必須設(shè)置為持久化
(1) 隊列持久化:生成者和消費者聲明隊列參數(shù)durable設(shè)置為true,已存在的隊列不能重新設(shè)置參數(shù)值。命令如下:
$channel->queue_declare("task_queue", false, true, false, false);
(2) 消息持久化:消息delivery_mode設(shè)置為2,如下:
$msg = new AMQPMessage($data, array("delivery_mode" => AMQPMessage::DELIVERY_MODE_PERSISTENT) );公平分發(fā)問題
問題:當(dāng)多個worker處理隊列消息,rabbitmq循環(huán)均勻分配消息到分一個worker,如果此時其中一個worker分配到比較耗時的任務(wù),那么會出現(xiàn)這個worker會比較忙碌,而其他worker比較清閑的情況。
方法:在worker處理和確認消息之前,不要再向worker發(fā)送新消息,而是向下一個清閑的worker發(fā)送,把prefetch參數(shù)設(shè)置為1.
當(dāng)然,如果所有的worker都很忙,這時候應(yīng)該增加worker數(shù)量
$channel->basic_qos(null, 1, null);
參考鏈接:http://www.rabbitmq.com/tutor...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26283.html
摘要:簡介是開發(fā)中很平常的中間件,本文講述的是怎么在一個項目中配置多源的,這里不過多的講解的相關(guān)知識點。但是需要配置多個源時,第二個及其以上的就需要單獨配置了,這里我使用的都是單獨配置的。源碼個人日拱一卒,不期速成 簡介 MQ 是開發(fā)中很平常的中間件,本文講述的是怎么在一個Spring Boot項目中配置多源的RabbitMQ,這里不過多的講解RabbitMQ的相關(guān)知識點。如果你也有遇到需要...
摘要:后續(xù)介紹交換機,生產(chǎn)者直接將消息投遞到中。消息,服務(wù)器和應(yīng)用程序之間傳送的數(shù)據(jù),由和組成。也稱為消息隊列,保存消息并將它們轉(zhuǎn)發(fā)給消費者。主要是應(yīng)為和有一個綁定的關(guān)系。 showImg(https://img-blog.csdnimg.cn/20190509221741422.gif); showImg(https://img-blog.csdnimg.cn/20190731191914...
摘要:基礎(chǔ)教程注本文是對眾多博客的學(xué)習(xí)和總結(jié),可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。安裝庫這里我們首先將消息推入隊列,然后消費者從隊列中去除消息進行消費。 RabbitMQ 基礎(chǔ)教程(1) - Hello World 注:本文是對眾多博客的學(xué)習(xí)和總結(jié),可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。 如果你喜歡我的文章,可以關(guān)注我的私人博客:http:...
摘要:在發(fā)送后端監(jiān)聽聲明的排他隊列,當(dāng)收到消息后比對正確則處理消息斷開監(jiān)聽連接,然后此隊列被系統(tǒng)自動回收。并且通過也看到了這條消息的返回。此時我們基本已經(jīng)將問題鎖定在端了。 背景 公司的一個項目使用rabbitmq作為broker進行交互,并且數(shù)據(jù)的查詢方法使用RPC模式,RPC Client端使用java編寫并使用springAMQP包與rabbitmq交互,在RPC Server端使用p...
閱讀 2259·2023-04-26 01:50
閱讀 715·2021-09-22 15:20
閱讀 2595·2019-08-30 15:53
閱讀 1596·2019-08-30 12:49
閱讀 1714·2019-08-26 14:05
閱讀 2714·2019-08-26 11:42
閱讀 2309·2019-08-26 10:40
閱讀 2602·2019-08-26 10:38