摘要:的定義是使用語言開發(fā)的開源消息隊(duì)列系統(tǒng),完整的實(shí)現(xiàn)了高級抽象層消息通信協(xié)議。交換機(jī)接受發(fā)送的消息,并根據(jù)綁定規(guī)則轉(zhuǎn)發(fā)到對應(yīng)的隊(duì)列。默認(rèn)是無名交換使用空字符串標(biāo)識。消息隊(duì)列是內(nèi)部對象,用于存儲(chǔ)未被消費(fèi)的消息。
RabbitMQ的定義
RabbitMQ是使用erlang語言開發(fā)的開源消息隊(duì)列系統(tǒng),完整的實(shí)現(xiàn)了AMPQ(高級抽象層消息通信協(xié)議)。
Mac下RabbitMQ安裝
使用Homebrew安裝
$ brew install rabbitmq
修改 ~/.bash_profile 配置環(huán)境變量:
# RabbitMQ Config export PATH=$PATH:/usr/local/sbin
重啟配置
$ source ~/.bash_profile
啟動(dòng)mq服務(wù)(后臺(tái)啟動(dòng)為rabbitmq-server -detached)
$ rabbitmq-server
登錄管理界面 http://127.0.0.1:15672 賬號密碼為:guest
客戶端RabbitMQ官方提供了三種PHP可用的擴(kuò)展:php-amqp,php-rabbit,php-amqplib
php-amqplib 安裝php的客戶端現(xiàn)在常用的是php-amqplib
$ git clone https://github.com/php-amqplib/php-amqplib.git
將composer.json文件添加到您的項(xiàng)目中
{
“require”:{ “php-amqplib / php-amqplib”:“> = 2.6.1” }
}
下載依賴
$ composer install
概念 Virtual vhostsvirtual vhosts是一個(gè)命名空間,可以存在多個(gè)exchange和queue。實(shí)現(xiàn)了環(huán)境(用戶,用戶組,exchange,queue)隔離,是權(quán)限控制的最小粒度。默認(rèn)的virtual host為/。
Exchange(交換機(jī))接受producer發(fā)送的消息,并根據(jù)binding綁定規(guī)則轉(zhuǎn)發(fā)到對應(yīng)的隊(duì)列。默認(rèn)是無名交換使用空字符串標(biāo)識。exchange type(交換機(jī)類型)包含四種類型:direct,topic,headers,fanout
轉(zhuǎn)發(fā)消息到routigKey指定的隊(duì)列
類似于direct類型,只不過routigKey為一個(gè)句點(diǎn)號“.”分隔的字符串
*可以替代一個(gè)字。
#可以替換零個(gè)或多個(gè)單詞。
根據(jù)發(fā)送的消息內(nèi)容中的headers屬性進(jìn)行匹配。
將所有收到的消息廣播到所有已知的隊(duì)列。
Queue(消息隊(duì)列)queue是mq內(nèi)部對象,用于存儲(chǔ)未被customer消費(fèi)的消息。相同屬性的queue可以重復(fù)定義,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列。
Binding(綁定)binding是將exchange和queue按照路由規(guī)則綁定起來??梢岳斫鉃閎inding是exchange和queue之間的關(guān)系
Connection(連接)消息tcp連接
Channel(信道)每個(gè)connection里,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會(huì)話任務(wù)。做到盡量共用connection
RabbitMQ使用示例1.send.php:
require_once __DIR__ . "/vendor/autoload.php"; use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibMessageAMQPMessage; // 創(chuàng)建連接 $connection = new AMQPStreamConnection("localhost", 5672, "guest", "guest"); // 創(chuàng)建channel,多個(gè)channel可以共用連接 $channel = $connection->channel(); // 創(chuàng)建交換機(jī)以及隊(duì)列(如果已經(jīng)存在,不需要重新再次創(chuàng)建并且綁定) // 創(chuàng)建直連的交換機(jī) $channel->exchange_declare("direct_logs", "direct", false, false, false); // 創(chuàng)建隊(duì)列 $channel->queue_declare("hello", false, false, false, false); // 交換機(jī)跟隊(duì)列的綁定, $channel->queue_bind("hello", "direct_logs", "routigKey"); // 設(shè)置消息bady傳送字符串logs(消息只能為字符串,建議消息均json格式) $msg = new AMQPMessage("logs"); // 發(fā)送數(shù)據(jù)到對應(yīng)的交換機(jī)direct_logs并設(shè)置對應(yīng)的routigKey $channel->basic_publish($msg, "direct_logs", "routigKey");
2.receive.php:
require_once __DIR__ . "/vendor/autoload.php"; use PhpAmqpLibConnectionAMQPStreamConnection; // 創(chuàng)建連接 $connection = new AMQPStreamConnection("localhost", 5672, "guest", "guest"); // 創(chuàng)建channel,多個(gè)channel可以共用連接 $channel = $connection->channel(); // 可能會(huì)在數(shù)據(jù)發(fā)布之前啟動(dòng)消費(fèi)者,所以我們要確保隊(duì)列存在,然后再嘗試從中消費(fèi)消息。 // 創(chuàng)建直連的交換機(jī) $channel->exchange_declare("direct_logs", "direct", false, false, false); // 創(chuàng)建隊(duì)列 $channel->queue_declare("hello", false, false, false, false); // 交換機(jī)跟隊(duì)列的綁定, $channel->queue_bind("hello", "direct_logs", "routigKey"); // 回調(diào)函數(shù) $callback = function ($msg) { echo $msg->body; }; // 啟動(dòng)隊(duì)列消費(fèi)者 $channel->basic_consume("hello3", "", false, true, false, false, $callback); // 判斷是否存在回調(diào)函數(shù) while(count($channel->callbacks)) { // 此處為執(zhí)行回調(diào)函數(shù) $channel->wait(); }RabbitMQ備注
非持久化會(huì)導(dǎo)致,隊(duì)列重啟,數(shù)據(jù)丟失
exchange持久化,在聲明durable參數(shù)時(shí)指定為true
queue持久化,在聲明durable參數(shù)時(shí)指定true
消息持久化,實(shí)例化AMQPMessage類時(shí)指定delivery_mode為2
exchange和queue是否持久化需要一致才能綁定
消費(fèi)者設(shè)置手動(dòng)ack,在聲明no_ack參數(shù)時(shí)指定false
隊(duì)列消息異常需要將消息刪除并再次發(fā)送同樣的消息置于末尾并手動(dòng)記錄日志
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26097.html
摘要:本文基于的插件,針對進(jìn)行簡單的測試。包括協(xié)議的介紹,的安裝配置開啟插件及基于進(jìn)行的測試。協(xié)議是基于發(fā)布訂閱模型的物聯(lián)網(wǎng)消息傳遞協(xié)議。對傳輸消息有三種服務(wù)質(zhì)量最多一次,這一級別會(huì)發(fā)生消息丟失或重復(fù),消息發(fā)布依賴于底層網(wǎng)絡(luò)。 ...
摘要:進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為對頭。還有個(gè)專業(yè)術(shù)語要了解下生產(chǎn)者發(fā)送消息的應(yīng)用程序被稱為生產(chǎn)者。消費(fèi)者接收消息的應(yīng)用程序被稱為消費(fèi)者。參考鏈接下安裝及操作常用命令譯實(shí)戰(zhàn)教程一你是否聽說過或者使用過隊(duì)列? 你是否聽說過或者使用過消息隊(duì)列? 你是否聽說過或者使用過RabbitMQ? 提到這幾個(gè)詞,用過的人,也許覺得很簡單,沒用過的人,也許覺得很復(fù)雜,至少在我沒使用消息隊(duì)列之前,聽...
摘要:簡介是開發(fā)中很平常的中間件,本文講述的是怎么在一個(gè)項(xiàng)目中配置多源的,這里不過多的講解的相關(guān)知識點(diǎn)。但是需要配置多個(gè)源時(shí),第二個(gè)及其以上的就需要單獨(dú)配置了,這里我使用的都是單獨(dú)配置的。源碼個(gè)人日拱一卒,不期速成 簡介 MQ 是開發(fā)中很平常的中間件,本文講述的是怎么在一個(gè)Spring Boot項(xiàng)目中配置多源的RabbitMQ,這里不過多的講解RabbitMQ的相關(guān)知識點(diǎn)。如果你也有遇到需要...
摘要:慕課網(wǎng)消息中間件極速入門與實(shí)戰(zhàn)學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。 慕課網(wǎng)《RabbitMQ消息中間件極速入門與實(shí)戰(zhàn)》學(xué)習(xí)總結(jié) 時(shí)間:2018年09月05日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:RabbitM...
摘要:源碼安裝推薦使用的鏡像這樣也不會(huì)污染本地環(huán)境基于下載給予你自己使用的權(quán)限查找鏡像你會(huì)看到下載鏡像查看自己本地已經(jīng)下載好的鏡像運(yùn)行鏡像查看自己已經(jīng)運(yùn)行的鏡像說明你可能會(huì)遇到如下的因?yàn)楸緳C(jī)與通信是通信,也就是通過文件通信的 源碼:https://github.com/ltoddy/rabbitmq-tutorial Introduction 安裝:(推薦使用docker的鏡像,這樣也不會(huì)污...
閱讀 3706·2021-09-30 09:59
閱讀 2373·2021-09-13 10:34
閱讀 590·2019-08-30 12:58
閱讀 1522·2019-08-29 18:42
閱讀 2215·2019-08-26 13:44
閱讀 2936·2019-08-23 18:12
閱讀 3332·2019-08-23 15:10
閱讀 1637·2019-08-23 14:37