rabbitmq自帶管理後台,安裝後需要設定開啟
進入rabbitmq安裝目錄中的sbin目錄執行
rabbitmq-plugins enable rabbitmq_management
重啟rabbitmq服務生效
開啟http://localhost:15672/即可看到管理後台
使用者名稱密碼皆為guest
sbin>rabbitmqctl list_queues sbin>rabbitmqctl list_queues name messages_ready messages_unacknowledged
使用命令列查看exchange清單
sbin>rabbitmqctl list_exchanges
RabbitMQ 不允許你用不同的參數重新定義一個已經存在的隊列。
RabbitMQ doesn't allow you to redefine an existing queue with different parameters and will return an error to any program that tries to do that
但這樣做仍然不是100%可靠,因為如果RabbitMQ 在接收訊息後、完成持久化之前崩潰,那麼就會導致訊息遺失。
這種場景下,訊息msgA就會被處理兩次,所以消費者端應該要有防止重複處理的機制。 ACKACK確認,只是告訴RabbitMQ 消費者已經完成了對訊息的處理,而不是說邏輯上處理成功,即使是由於業務處理失敗了,也要進行ACK確認。因為一般而言業務上的原因導致失敗的話,重試是不解決問題的。只有網路中斷、機器斷電等故障所引起的失敗才有重試的必要。 防止業務負載集中到某個消費者
- 消費者接收了一個訊息msgA,處理了一半,沒有完成、沒有發起ack確認;
- 此時RabbitMQ 崩潰了;
- 消費者完成了訊息msgA的處理;
- 當RabbitMQ 重啟後,發現msgA未被處理,於是msgA再次被傳送給消費者。
channel.basicQos(prefetchCount);
prefetchCount=1,告訴RabbitMQ 每次只給一個消費者分配一個訊息,直到上一個分配給該消費者的訊息被確認處理完成。這樣一來,訊息就會根據實際處理情況,每次都分配給空閒的消費者。
The default exchange is implicitly bound to every queue, with a routing key equal to the queue name. It is not possible to explicitly bind to, or unbind from the default exchange. It desocannotexchange. .訊息傳遞的基本程序發布者發布一個訊息
-->exchange接收訊息(如果發布者沒有指定特定的Exchange則使用預設Exchange) ,並根據exchange的類型,按照一定的路由規則,把訊息路由給每一個符合路由規則的隊列(如果沒有匹配的隊列,則訊息被丟棄)
-->隊列將訊息發送給訂閱該佇列的某一個消費者(如果沒有消費者則訊息保留在佇列中,知道有消費者消費該訊息)
AMQP協定mandatory和immediate標誌位的作用mandatory和immediate是AMQP協定中basic.pulish方法中的兩個標誌位,它們都有當訊息傳遞過程中不可達目的地時將訊息傳回給生產者的功能。具體區別在於:1. mandatory標誌位元當mandatory標誌位元設定為true時,如果exchange根據自身類型和訊息routeKey無法找到一個符合條件的queue,那麼會呼叫basic .return方法將訊息回饋給生產者;當mandatory設為false時,出現上述情形broker會直接將訊息丟掉。 2. immediate標誌位元當immediate標誌位元設為true時,如果exchange在將訊息route到queue(s)時發現對應的queue上沒有消費者,那麼這條訊息不會放入隊列中。當與訊息routeKey關聯的所有queue(一個或多個)都沒有消費者時,該訊息會透過basic.return方法返還給生產者。*
(star) can substitute for exactly one word.
井號符合任一單字# ( hash) can substitute for zero or more words.
以上是RabbitMQ安裝(windows)實例教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!