【LSP】rabbitmq(生命周期,confirm模式,延迟队

1008612   ·   发表于 2020-9-26   ·   编程代码

什么是消息队列?

就是生产者生产一条消息,发送到这个rabbitmq,消费者连接rabbitmq并且进行消费,生产者和消费者并需要知道对方是如何工作的,从而实现程序之间的解耦,异步和削峰,这也就是消息队列的作用。

使用的场景也有很多,比如用户支付购买之后的发送短信,增加用户积分等等,只要能将业务逻辑抽象出来,就能很好得使用它。



下面进入正题:

先来介绍一下基本概念和参与生命周期的各个成员。

publisher:消息生产者,负责创建消息,并发送到代理服务器(rabbitmq)

message:发送的消息,由 有效负载(payload) 和 标签 (label) 组成

exchange:交换器,负责接收消息并路由给服务器的队列

queue:消息队列,就是消息最后要去的地方。然后等待消费者取走并消费

consumer:消息消费者,与生产者对应,程序的另外一方,负责消费信息,并完成相应的业务逻辑

channel:信道,在tcp之上建立的通道,负责传送消息。队列的传输都是基于信道来完成的。

broker:消息队列服务器实体

下面来解析一下这张图,这张图是网上找的,虽然不够详细,但是勉强能用。




准备前提,开启rabbitmq服务,生命队列和交换器,并将两者进行绑定。



生产逻辑:

publisher 通过 broker服务器ip 和 端口 尝试建立与 broker 的 tcp 连接,连接成功之后,会尝试验证验证用户名和密码,如果错误,则拒绝访问。

验证成功之后,在tcp上建立一个 信道(channel) ,publisher 通过信道,发送消息到 broker,进入指定的虚拟主机virtual host。然后查找到交换器绑定的队列,并将消息推送进入队列。


消费逻辑:

consumer 建立连接和验证和生产者一样。接下来通过队列名,直接找到队列进行监听并消费。



有几个比较重要的知识点:

1. rabbitmq的交换器并不是真正意义的交换器,它本质上其实就是一张表,里面存放和交换器名称和消息队列的映射关系。所以说队列的传输都是通过信道来完成的。

2. 信道存在的意义在于 创建和销毁tcp连接非常消耗资源





交换器的类型

当生产的消息进入虚拟主机时,会去寻找一张表,就是交换器和队列映射关系的一张表。而交换器的类型也分了好多种,可以根据不同的场景自由选择。

目前总共分了4种,direct,fanout,topic,headers。其中headers因为性能问题几乎不在使用,这里就不做过多的讨论。

1.direct

direct是直接,完全匹配,单播的模式。

php简单代码实现:

0 Reply   |  Until 2020-9-26 | 5060 View
LoginCan Publish Content
程序耗时 0.2335秒 内存:1373KB