使用場景。有個高并發的某某活動,因為并發量很高,Mysql的寫入的性能不能滿足吞吐(其他類似于mongo的庫除外),此時,可用借助RabbitMQ的工作隊列來處理,將直接寫入mysql的數據,以消息的形式先發送到RabbitMq的工作隊列中,消費端從隊列中消費數據入庫,這樣:1)客戶端不需要考慮mysql的瓶頸,隊列做為一個緩沖區。2)可用加入多個消費者,加速消費工作隊列,避免造成工作隊列消息積壓。
我們再hello world的發送、接收的代碼中,我做了幾點調整。
指定exchange,并顯式申明它的類型。
將exchange持久化,這樣那怕Rabbit重啟,exchange也不會消失。
將queue持久化,這樣那怕Rabbit重啟,queue也不會消失(包括queue中的消息)
在exchange publish消息時,指定 route key,同時在queue中綁定rout key,這樣exchange在轉發消息時,能夠將消息轉發到與route key匹配的的隊列中。
~~~
send.php
<?php
$config = [
'host' => '127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
];
$conn = new \AMQPConnection($config);
$conn->connect();
$channel = new \AMQPChannel($conn);
$channel->qos(0,0);
$exchange = new \AMQPExchange($channel);
$exchange->setName('exchange.activity');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange();
$queue = new \AMQPQueue($channel);
$queue->setName('queue.activity');
$queue->declareQueue();
$queue->bind('exchange.activity','route.activity');
for($i=0;$i<6;$i++){
$result = $exchange->publish("message[$i]",'route.activity');
var_dump($result);
}
receive.php
<?php
$config = [
'host' => '127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
];
$conn = new \AMQPConnection($config);
$conn->connect();
$channel = new \AMQPChannel($conn);
$channel->qos(0,0);
$queue = new \AMQPQueue($channel);
$queue->setName("queue.activity");
$queue->setFlags(AMQP_PASSIVE);
$queue->declareQueue();
$queue->bind('exchange.activity','route.activity');
$queue->consume('processMessage',AMQP_AUTOACK);
function processMessage($envelope, $queue) {
global $i;
echo "Message $i: " . $envelope->getBody() . "\n";
$i++;
}
~~~
- 關于我
- laravel
- quickstart
- quickstart-intermediate
- swoole
- (一)快速起步
- php7
- swoole異步高性能
- 開發中常見問題
- event擴展的安裝
- phptrace
- 用C/C++寫php擴展
- 無聊的筆試題
- rewrite二級目錄轉二級域名
- php多進程
- rpc-yar
- php專家列表
- php守護進程
- php函數防止超時
- php分析報錯信息
- gdb調試php
- php-cli模式
- composer/pear
- 基礎
- sublime+xdebug
- 開啟opcache
- 前端
- js
- linux
- Xshell連接不上Ubuntu解決方式
- xshell
- centos安裝中文輸入
- centos下安裝谷歌瀏覽器
- centos安裝phpstorm
- php7之phpredis安裝
- 磁盤大小
- dns
- TCP/IP協議
- HTTP
- tcpdump
- zbacktrace
- gdb調試php擴展
- lsof
- perf
- lnmp
- first
- 重定向
- echo
- 鍵盤高效操作
- 權限控制
- 進程
- 環境變量
- vi
- 軟件包管理
- 網絡
- 查找文件
- 壓縮
- 正則
- sed/awk
- 編譯程序
- shell腳本
- shell認識
- sh腳本
- sh調試相關
- win共享文件夾給虛擬機
- git
- git的安裝
- 常用命令
- 本地到遠程倉庫
- 遠程到本地倉庫
- 分支管理
- bug分支
- feature
- 標簽
- 多人協作
- FAQ
- C/C++
- 難點
- 修飾符
- 數組
- 字符串
- 指針
- 引用
- 面向對象
- 類訪問修飾符
- 構造函數
- 操作文件
- mysql集群
- 使用navicat操作MySQL數據庫能不能整個數據庫搜索一條數據?
- 幫助的使用
- 存儲引擎的選擇
- 數據類型/字符集
- 索引
- kafka集群
- rabbitmq集群
- (一)初識rabbitmq
- (二)原理
- (三)消息模型
- (四)rabbitmq&php基礎
- (五)持久化&route&指定exchange
- (六)發布訂閱
- (七)route key
- (八)topic
- elasticsearch集群
- (一)服務端搭建
- (二)elasticsearch&php
- (三)head插件
- redis集群
- github
- 設計模式
- createType
- factory_method.php
- abstract_factory.php
- mysql_singleton.php
- builder.php
- prototype.php
- structType
- adapter.php
- 數據結構與算法
- python