RabbitMQ中的channel信道、exchange交换机和queue队列详解

 更新时间:2023年08月28日 09:04:14   作者:循序0010  
这篇文章主要介绍了RabbitMQ中的channel信道、exchange交换机和queue队列详解,connection是指物理的连接,一个client与一个server之间有一个连接,一个连接上可以建立多个channel,可以理解为逻辑上的连接,需要的朋友可以参考下

RabbitMQ中的channel信道、exchange交换机和queue队列

环境:

CentOS 7

RabbitMQ Server 版本3.7.9.RELEASE

connection是指物理的连接,一个client与一个server之间有一个连接;一个连接上可以建立多个channel,可以理解为逻辑上的连接。

一般应用的情况下,有一个channel就够用了,不需要创建更多的channel。

//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);

exchange 与 routingkey : 交换机 与 路由键

为了将不同类型的消息进行区分,设置了交换机与路由两个概念。

比如,将A类型的消息发送到名为‘C1’的交换机,将类型为B的发送到'C2'的交换机。

当客户端连接C1处理队列消息时,取到的就只是A类型消息。

$e_name = 'e_linvo'; //交换机名
$k_route = array(0=> 'key_1', 1=> 'key_2'); //路由key
//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status:".$ex->declare()."\n";
for($i=0; $i<5; ++$i){
echo "Send Message:".$ex->publish($message . date('H:i:s'), $k_route[i%2])."\n";
}

由以上代码可以看到,发送消息时,只要有“交换机”就够了。

至于交换机后面有没有对应的处理队列,发送方是不用管的。routingkey可以是空的字符串(表示发送到所有的队列中)。

在示例中,我使用了两个key交替发送消息,是为了下面更便于理解routingkey的作用。

交换机设置参数中有两个重要的概念:

A,类型。有三种类型: Fanout类型最简单,这种模型忽略routingkey;Direct类型是使用最多的,使用确定的routingkey。这种模型下,接收消息时绑定'key_1'则只接收key_1的消息;最后一种是Topic,这种模式与Direct类似,但是支持通配符进行匹配,比如: 'key_*',就会接受key_1和key_2。Topic貌似美好,但是有可能导致不严谨,所以还是推荐使用Direct。

B,持久化。指定了持久化的交换机,在重新启动时才能重建,否则需要客户端重新声明生成才行。

需要特别明确的概念:

  • 交换机的持久化,并不等于消息的持久化。
  • 只有在持久化队列中的消息,才能持久化;
  • 如果没有队列,消息是没有地方存储的;
  • 消息本身在投递时也有一个持久化标志的,PHP中默认投递到持久化交换机就是持久的消息,不用特别指定。

queue: 队列

队列仅是针对接收方(consumer)的,由接收方根据需求创建的。

只有队列创建了,交换机才会将新接受到的消息送到队列中,交换机是不会在队列创建之前的消息放进来的。

即在建立队列之前,发出的所有消息都被丢弃了。

消息的处理,是有两种方式:

A,一次性。用 $q->get([...]),不管取到取不到消息都会立即返回,一般情况下使用轮询处理消息队列就要用这种方式;

B,阻塞。用 $q->consum( callback, [...] ) 程序会进入持续侦听状态,每收到一个消息就会调用callback指定的函数一次,直到某个callback函数返回FALSE才结束。
使用的$routingkey = '', 意味着接收全部的消息。我们可以将其改为 $routingkey = 'key_1',可以看到结果中仅有设置routingkey为key_1的内容了。

注意: routingkey = 'key_1' 与 routingkey = 'key_2' 是两个不同的队列。假设: client1 与 client2 都连接到 key_1 的队列上,一个消息被client1处理之后,就不会被client2处理。而 routingkey = '' 是另类,client_all绑定到 '' 上,将消息全都处理后,client1和client2上也就没有消息了。

到此这篇关于RabbitMQ中的channel信道、exchange交换机和queue队列详解的文章就介绍到这了,更多相关RabbitMQ的channel、exchange和queue内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现简易局域网聊天功能

    java实现简易局域网聊天功能

    这篇文章主要为大家详细介绍了java实现简易局域网聊天功能,使用UDP模式编写一个聊天程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Java基础学习之集合底层原理

    Java基础学习之集合底层原理

    今天带大家回顾Java基础的相关知识,文中对集合底层原理作了非常详细的图文介绍,对Java初学者有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • Spring Boot 整合JPA 数据模型关联使用操作(一对一、一对多、多对多)

    Spring Boot 整合JPA 数据模型关联使用操作(一对一、一对多、多对多)

    这篇文章主要介绍了Spring Boot 整合JPA 数据模型关联操作(一对一、一对多、多对多),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Lombok 报错:无法访问 jdk.compiler 内部类的解决方案

    Lombok 报错:无法访问 jdk.compiler 内部类的解决方案

    本文分析了JDK9及以上版本中Lombok报错"无法访问jdk.compiler内部类"的问题根源,并提供了4中解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2025-10-10
  • java实现题目以及选项乱序的方法实例

    java实现题目以及选项乱序的方法实例

    这篇文章主要给大家介绍了关于java实现题目以及选项乱序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 详解java中String值为空字符串与null的判断方法

    详解java中String值为空字符串与null的判断方法

    这篇文章主要介绍了详解java中String值为空字符串与null的判断方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • SpringBoot整合Mybatis,解决TypeAliases配置失败的问题

    SpringBoot整合Mybatis,解决TypeAliases配置失败的问题

    这篇文章主要介绍了SpringBoot整合Mybatis,解决TypeAliases配置失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java支撑10W高并发的架构设计核心思路

    Java支撑10W高并发的架构设计核心思路

    这篇文章主要介绍了Java支撑10W高并发的架构设计核心思路,在现代软件的开发中,数据处理规模超过10w的情况已是常态,无论是电商平台订单批处理、物联网设备日志分析等,无处不在挑战数据处理的极限,需要的朋友可以参考下
    2026-02-02
  • 详解java封装返回结果与RestControllerAdvice注解

    详解java封装返回结果与RestControllerAdvice注解

    这篇文章主要为大家介绍了java封装返回结果与RestControllerAdvice注解实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • java客户端登陆服务器用户名验证

    java客户端登陆服务器用户名验证

    这篇文章主要为大家详细介绍了java客户端登陆服务器用户名验证的相关资料,需要的朋友可以参考下
    2016-05-05

最新评论