RabbitMQ 6种工作模式
对RabbitMQ 6种工作模式(简单模式、工作模式、订阅模式、路由模式、主题模式、RPC模式)进行场景和参数进行讲解,PHP代码作为实例。
安装
客户端实现:添加扩展,执行composer.phar install
命令
1 2 3 4 5 | { "require" : { "php-amqplib/php-amqplib" : ">=3.0" } } |
引入包
1 2 3 | require_once __DIR__ . '/vendor/autoload.php' ; use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibMessageAMQPMessage; |
建立一个链接,
1 2 3 4 5 6 7 8 9 10 | # 链接服务 $connection = new AMQPStreamConnection( '127.0.0.1' , 5672, 'stark' , '1990@stark' ); $channel = $connection ->channel(); $channel ->queue_declare( 'hello' , false, false, false, false); $msg = new AMQPMessage( 'Hello World!' ); $channel ->basic_publish( $msg , '' , 'hello' ); echo " [x] Sent 'Hello World!'n" ; # 关闭信道和链接 $channel ->close(); $connection ->close(); |
6种模式
1.简单模式
简单模式是最简单的使用方式,P代表生产者,C代表消费者,红色的代表队列,执行过程生产者发送消息到队列,右面的消费者消费消息,需要注意的是这里没有交换机。
生产者代码(PHP)
1 2 3 | # 声明队列 $queueName = 'MqName' ; $channel ->queue_declare( $queueName , false, false, false, false); |
queue_declare 参数说明:
- 队列名
- 检测队列是否存在,true只检测不创建,false会创建
- 是否持久化队列,true持久化
- 是否私有队列 true代表私有
- 当消费者断开后,队列是否自动删除
1 2 3 4 | # 创建AMQP消息类型 $msg = new AMQPMessage( $data , array ( 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT) ); |
AMQPMessage 参数说明: 1.消息体 2.是否持久化
1 | $channel ->basic_publish( $msg , '' , $queueName ); |
basic_publish参数详解:
- 发送内容
- 交换机名称,简单模式没有使用交换机
- 队列名称
消费者代码:
1 2 3 4 5 | $channel ->basic_consume( 'hello' , '' , false, true, false, false, $callback ); # 阻塞队列,做监听 while ( $channel ->is_open()) { $channel ->wait(); } |
basic_consume 参数说明:
- 队列名
- 消费者标签
- AMQP标准
- 是否自动应答 ack true 自动应答,false应答
- 是否排他
- ?
- 回调函数
2.工作模式
它由一个生产者发送在队列中,work队列会分配消息给不同的消费者,让每个消费者接收到不同的消息。
工作模式的场景特别适合集群模式的异步处理,最大程度发挥每一台服务器的性能。
3.订阅模式
从订阅模式开始就使用了交换机,订阅模式使用了广播类型的交换机,它会让每个队列的消息都是一样的。
生产者把消息发送给交换机,交换机把消息发送给和它绑定的队列,让消费者来消费,需要强调的是绑定的队列获得的消息是一模一样的,订阅模式就是让所有的消费者获得相同的消息。
订阅模式使用场景,天气、微博的订阅,收费文章的订阅等等。
生产者实现:
1 2 3 | $channel ->exchange_declare( 'logs' , 'fanout' , false, false, false); # 绑定交换机和队列 $channel ->queue_bind( $queue_name , 'logs' ); |
交换机参数详解:
- 交换机名
- 交换机类型
- 检查是否存在
- 是否持久化
- 是否自动删除
1 | $channel ->basic_publish( $msg , '这里是交换机的名字' , $queueName ); |
消费者和生产者一样,先绑定交换机:
4.路由模式
路由模式使用direct定向类型的交换机,生产者发送一个消息到交换机,交换机根据发送来的路由键发送到相匹配的队列中,来和队列绑定的消费者进行消费。
订阅模式和路由模式的区别,订阅模式无条件的把消息发送给所有的消费者,每一个消费者收到的消息都是一样的,而路由模式对消息进行筛选发送给对应的消费者队列。
5.主题模式
主题模式采用的事topic的交换机,通过通配符进行匹配,通配符主要有*
和#
。
6.RPC模式
RabbitMQ的RPC模式,支持生产者和消费者不在同一个系统中,即允许远程调用的情况。通常,消费者作为服务端,放置在远程的系统中,提供接口,生产者调用接口,并发送消息。
RPC模式是一种远程调用的模式,因为需要http请求,因此速度比系统内部调用慢。而且rpc模式下,通常不易区分哪些是来自外部的请求,哪些是内部的请求,导致整体速度较慢。因此,不能滥用rpc模式。
最后
后面的3个模式不做详细的代码讲解了,可以看参考官网,实现起来都是差不多的。
以上就是以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式的详细内容,更多关于RabbitMQ模式php实例的资料请关注IT俱乐部其它相关文章!