rabbitmq
需要對每一條傳送的訊息進行確認。消費者必須通過
amqp
的basic.ack
命令顯式地向
rabbitmq
傳送乙個確認,或者在訂閱到佇列的時候就將
auto_ack
引數設定為
true
。當auto_ack
為true
時,一旦消費者接收訊息,
rabbitmq
會自動視其確認了訊息。需要注意的是消費者對訊息的確認和告訴生產者訊息已經被接收了這兩件事毫不相關。以此,消費者通過確認命令告訴
rabbitmq
它已經確認地接收到訊息,同時
rabbitmq
才能安全的把訊息從佇列中刪除。
如果消費者受到一條訊息,然後確認之前從
rabbitmq
斷開連線(或者從佇列上取消訂閱),
rabbitmq
會認為這條訊息沒有分發,然後重新分發給下乙個訂閱的消費者。如果你的應用程式崩潰了,這樣做可以確保訊息會被傳送給另乙個消費者處理。另一方面,如果應用程式有
bug而忘記確認訊息的話,
rabbitmq
rabbit
會認為這個消費者沒有準備好接收下一條訊息。利用這一點,可以防止
rabbit
持續不斷的訊息湧向你的應用而導致過載。
在收到訊息後,如果想要拒接而不是確認收到訊息,有兩種做法: (
1)、把消費者從
rabbitmq
伺服器斷開連線,這會導致
rabbitmq
自動重新把訊息入隊並傳送給另乙個消費者,這樣做的好處是所有的
rabbitmq
版本都支援。缺點是,這樣的連線、斷開連線的方式會額外增加
rabbitmq
的負擔。 (
2)、如果使用的是
rabbitmq2.0.0
或更高版本,可以使用
amqp
的basic.reject
命令。顧名思義:
basic.reject
允許消費者拒絕
rabbitmq
傳送訊息。如果把
reject
命令的requeue
設定為true
的話,rabbitmq
會將訊息重新傳送給下乙個訂閱者。如果設定為
false
的話,rabbitmq
會立即把訊息從佇列中移除,而不會把它傳送給新的消費者。
rabbitmq
的消費者和生產者都能建立佇列,通過
queue.declare
方法來建立。如果消費者在同一通道上訂閱了乙個佇列,則它不能在宣告佇列,必須先取消訂閱後,將通道置為傳輸模式。消費者訂閱和繫結時都需要佇列名,如果你建立佇列時沒有設定名字,
rabbit
會自動宣告乙個佇列名稱,並在
queue.declare
命令中返回。
如果你建立乙個已經存在的佇列,那麼
rabbit
將不做任何事情。
rabbit
的queue.declare
可以檢測佇列是否存在,如果佇列存在,則返回成功,不存在則返回錯誤。
由生產者還是由消費者建立佇列?答案是雙向的,原因是消費者不能訂閱不存在的佇列,而發布者不能發布到訊息不存在的佇列,這有可能會造成訊息的丟失。當然也可以通過其它方式來控制未發布的訊息,而讓消費者一端負責建立佇列。
佇列存在的意義: (
1)、為訊息提供住所,訊息再次等待消費 (
2)、對負載均衡來說,佇列是絕佳的方案。只需附加一堆消費者,並讓
rabbitmq
以迴圈的方式均勻地分配發來的訊息 (
3)、佇列是
rabbitmq
中訊息的最後重點(除非訊息進入黑洞)
路由鍵:訊息繫結到交換器上的規則。
訊息根據規則由交換機將訊息投遞到相對應的佇列。如果路由訊息不匹配任何繫結,訊息將進入黑洞。
交換機有四種:
direct
、fanout
、topic
和header
。其中headers
和direct
交換器完全一致,但效能比較差,很少用。
伺服器必須實現
direct
型別交換器,包括乙個空白字串命名的預設交換器。當宣告乙個佇列時,它會自動繫結到預設交換器,並以佇列名稱作為路由鍵.
RabbitMQ訊息相關概念
當rabbitmq佇列擁有多個消費者時,佇列收到的訊息將以輪詢的分發方式傳送給消費者。每條訊息只會傳送給訂閱列表裡的乙個消費者。這種方式非常適合擴充套件,如果負載加重,那麼只需要建立更多的消費者來消費處理訊息即可。輪詢分發機制也不是那麼優雅,預設有n個消費者,那麼rabbitmq會將第m條訊息分發給...
訊息佇列RabbitMQ的概念
rabbitmq的核心概念為以下 1.訊息 由訊息頭和訊息體組成。訊息體是不透明的,訊息頭是由一系列可選屬性組成,包括路由鍵 優先權 是否持久化等 2.交換器 用來接收生產者傳送的訊息,並將訊息路由給伺服器中的佇列,有四種型別 direct 預設 fanout topic headers direc...
基於PHP使用rabbitmq實現訊息佇列
1.從github上面獲取amqp基於php的實現擴充套件 2.建立生產者 send.php 1 require dir protected vendor autoload.php 23 usephpamqplib connection amqpstreamconnection 4use phpam...