RabbitMQ遇到的坑


1. NOT_ALLOWED - access to vhost '/' refused for user 'test'

https://blog.csdn.net/u010889616/article/details/80644225

定位發現是連接rabbitmq使用的用戶沒有賦予訪問權限

rabbitmqctl.bat set_permissions -p / test '.*' '.*' '.*'

2. queue_declare 參數詳解

  • queue_declare ()不帶參數方法默認創建一個由RabbitMq命名的(amq.gen-LHQZz...)
    名稱,這種隊列也稱之為匿名隊列,排他 的,自動刪除的,非持久化的隊列
  • queue:隊列名稱
  • passive:如果用戶僅僅想查詢某一個隊列是否已存在,如果不存在,不想建立該隊列,仍然可以調用queue.declare,只不過需要將參數passive設為true,傳給queue.declare,如果該隊列已存在,則會返回true;如果不存在,則會返回Error,但是不會創建新的隊列。
  • durable: 是不持久化, true ,表示持久化,會存盤,服務器重啟仍然存在,false,非持久化
  • exclusive : 是否排他的,true,排他。如果一個隊列聲明為排他隊列,該隊列公對首次聲明它的連接可見,並在連接斷開時自動刪除,
  • auto_delete :是否自動刪除,true,自動刪除,自動刪除的前提:至少有一個消息者連接到這個隊列,之后所有與這個隊列連接的消息都斷開時,才會自動刪除,備注:生產者客戶端創建這個隊列,或者沒有消息者客戶端連接這個隊列時,不會自動刪除這個隊列
  • arguments:其它一些參數。如:x-message-ttl,之類

https://www.jianshu.com/p/5634a9c71559
https://www.cnblogs.com/linkenpark/p/5393666.html

3. inequivalent arg 'durable' for exchange 'delay_exchange' in vhost '/': received 'false' but current is 'true'

 RabbitMQ 不允許你綁定一個非堅固(non-durable)的交換機和一個durable的隊列。反之亦然。要想成功必須隊列和交換機都是durable的。

一旦創建了隊列和交換機,就不能修改其標志了。例如,如果創建了一個non-durable的隊列,然后想把它改變成durable的,唯一的辦法就是刪除這個隊列然后重現創建。因此,最好仔細檢查創建的標志。

4. https://blog.csdn.net/wangzhan0123/article/details/80922327

1.normal_exchange_delay和normal_queue_delay是死信隊列,設置了隊列屬性x-message-ttl的屬性,即指定了延時時間,達到x-message-ttl設置的時間未消費的就會自動路由到normal_exchange_requeue交換器,從而實現了延遲重試。這里需要解釋的是為什么要重新創建一個新的交換器normal_exchange_requeue:因為當你的normal_exchange綁定多個隊列,且是topic類型的交換器時,如果你的死信隊列指定的死信交換器是該交換器,消息存在發送到多個隊列的風險,會對別的系統造成重復消費。

2.max retry如何獲取,rabbitmq有一個屬性,就是當一個消息進入到死信隊列時,消費者收到的AMQP.BasicProperties參數中的headers屬性中的cout參數就會加1,利用這個屬性我們可以獲取到該消息被消費了多少次。代碼:

private function getRetryCount(AMQPMessage $msg): int
    {
        $retry = 0;
        Log::info('xx', [$msg->has('application_headers')]);
        if ($msg->has('application_headers')) {
            $headers = $msg->get('application_headers')->getNativeData();
            if (isset($headers['x-death'][0]['count'])) {
                $retry = $headers['x-death'][0]['count'];
            }
        }

        return (int)$retry;
    }

5. 聲明隊列報錯:PhpAmqpLib\Exception\AMQPProtocolChannelException: PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'normal_queue' in vhost '/': received the value '30000' of type 'signedint' but current is none in file 。。。

 原因:queue已經存在,但是啟動 consumer 時試圖設定一個 x-dead-letter-exchange 參數,這和服務器上的定義不一樣,server 不允許所以報錯。如果刪除 queue 重新 declare 則不會有問題。或者通過 policy 來設置這個參數也可以不用刪除隊列。也就是同時聲明了2個屬性不一致的隊列


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM