💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[info] 认识 RabbitMQ **故事原型:** 比如,小时候你爸爸要出差了,因为赶时间,家里的事情他没做完,但他又没能联系上你。 于是他给你留下一张小纸条要你去做,内容是这样的(其实这张小纸条就是一个消息队列): ~~~ 收碗筷 ​ • 擦饭桌 ​ • 拖地 ~~~ 你根据小纸条上面的3条消息,依次做完了这3件事。 ***** **故事解读:** 其实这张小纸条就是一个消息队列中间件,我们可以当它是RabbitMQ, 而你爸爸就是消息的生产者,你是消息的消费者. 正如你爸爸(消息生产者)通过小纸条(消息队列)让你(消息消费者)完成了3件事。 程序A(消息生产者)也可以通过RabbitMQ(消息队列) 让其它程序(消息消费者)去做事。 没错,这就是我们要学的RabbitMQ,一款消息队列中间件 ***** >[info] RabbitMQ的诞生和概念 **消息队列的由来:** * 分布式系统已成为当前系统架构的主流, 而消息队列在分布式系统中作为消息中间件,能为分布式系统中各个应用提供会话平台, 比如:连接PHP和java(比如上面这个故事中的爸爸和儿子)。 * 其次,用多进程异步操作取代单进程同步操作, 从而满足高性能系统架构需求。比如爸爸通过消息队列让儿子帮他洗碗,那么爸爸的办事效率是不是高了很多? 同样的,比如双十一你到淘宝去下个单,可能感到不卡了,其实淘宝的下单进程已经把很多订单相关逻辑交给其它进程去处理了,那么下单进程就会很快。 * 其次,可以防止服务器一下子做很多事情。消息队列采用队列的形式,消费者读取队列里面的消息的时候是一条一条读取的,服务器不会超负载。比如上面故事中的儿子,不是 收碗筷 擦饭桌 拖地一起干,二是按着消息队列的顺序一件一件干,这样儿子不会超负载,服务器也是如此。 原来消息队列这么牛X,升职加薪的必修课,非常值得学习。 ***** **消息队列的概念:** 从上面消息队列的由来,我们可以进一步大致了解下消息队列的概念: >[] 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。 ***** **消息队列的种类:** >[] 目前使用较多的消息队列有ActiveMQ,RabbitMQ,Redis的list和订阅,ZeroMQ,Kafka,阿里的RocketMQ. 这里我们就不一一赘述,我们现在要学的是这其中应用较广泛部署较容易的一种: RabbitMQ ***** >[info] RabbitMQ的AMQP协议 >[] RabbitMQ采用了AMQP协议,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 ![](https://img.kancloud.cn/ae/c9/aec90372a66abaeffb57d9fee7c4f794_1404x661.png) * 生产者(Producer)(见上图中的生产者):发送消息的应用。 * 消费者(Consumer)(见上图中的消费者):接收消息的应用。 * 队列(Queue)(见上图中的queue):存储消息的缓存,一个队列queue存多条消息。 * 消息(Message):由生产者通过RabbitMQ发送给消费者的信息,消息存储在消息队列queue中。 * 连接(Connection):连接RabbitMQ和应用服务器的TCP连接(上图中发送消息和接收消息都是必须先建立连接的)。 * 通道(Channel):连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。 * 交换机(Exchange)(见上图中的交换机):生产者发送消息是先发到交换机,再由交换机发送到队列里面,并最终保存在队列里面。就好比寄快递,台湾寄到长沙,可能要先寄到上海,那么上海就是这个交换机。 * 绑定(Binding):绑定是队列和交换机的一个关联连接。 * 路由键(Routing Key)(见上图中的Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。 * 用户(Users):在RabbitMQ里,是可以通过指定的用户名和密码来进行连接的。每个用户可以分配不同的权限,例如读权限,写权限以及在实例里进行配置的权限。