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