1.RabbitMq的使用场景
(1).解耦;
(2).涉及顺序的先后之分;
(3).并发
(4).异步通信
2.RabbitMq的内部协议
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d4fcd8fca6029aab81dafd549d288ca4.jpeg)
-
broker: 中间商,用来接受和分发消息;
-
Virtual Host: 类似于namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
-
Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据
-
Exchange: message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
3. 基本使用
$connection = new AMQPStreamConnection($host, $port, $user, $pswd, $vhost);
$channel = $connection->channel();
$channel->queue_declare($queue, false, true, false, false);
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_bind($queue, $exchange);
$message = new AMQPMessage($message);
## 生产
$channel->basic_publish($message, $this->exchange);
### 消费
$callback = function ($msg) {
echo ' [x] Received ', $msg->body, "\n";
};
$channel->basic_consume($this->queue, '', false, true, false, false, $callback);
while (count($this->channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
4 扩展
生产消息的时候,当队列里面长时间为空之后,再次往队列里面推送数据的时候,这个时候,并不会消费数据,但是消费的进程依旧是开启的,只不过服务端链接断了。
这个时候可以添加心跳,目前官方的RabbitMq发行的版本中心跳为0.故我们可以在建立链接初始化的时候添加心跳
$connection = new AMQPStreamConnection($host, $port, $user, $pswd, $vhost,false, 'AMQPLAIN', null, 'en_US', 3.0 , 130.0, null, false, 60);
当数据需要有优先级时,需要设置权重
#### 相对应的消费也需要初始化
$table = new AMQPTable();
$table->set('x-max-priority', 20);
####
$connection = new AMQPStreamConnection($host, $port, $user, $pswd, $vhost);
$channel = $connection->channel();
$channel->queue_declare($queue, false, true, false, false, false, $table);
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_bind($queue, $exchange);
$message = new AMQPMessage($message, [
'delivery_mode' => 2,
'priority' => 10
]);