RabbitMQ - 基础介绍 以及 常用的5种队列

 RabbitMQ介绍

   RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。

   它支持开放的高级消息队列协议 (AMQP,Advanced Message Queuing Protocol),从根本上避免了生产厂商的封闭,使用任何语言的各种客户都可以从中受益。这种协议提供了相当复杂的消息传输模式,所以基本上不需要MassTransit或NServiceBus的配合。它还具有“企业级”的适应性和稳定性。这些东西对我的客户来说十分的有吸引力。

  RabbitMQ从信息接收者角度可以看做三种模式,一对一,一对多(此一对多并不是发布订阅,而是每条信息只有一个接收者)发布订阅。其中一对一是简单队列模式,一对多是Worker模式,而发布订阅包括发布订阅模式,路由模式和通配符模式,为什么说发布订阅模式包含三种模式呢,其实发布订阅,路由,通配符三种模式都是使用只是交换机(Exchange)类型不一致

 如何安装RabbitMQ 以及 用户和权限配置

 docker安装RabbitMQ请参考:https://www.cnblogs.com/gygtech/p/14860921.html

 架构模型

   想要学习后面的几种消息具体的发送模式,这个模型图就必须理解清楚,因为这几种方式就是对这个模型不同程度的选择和缩减

  • Producer:消息的生产者(发送消息的程序)。
  • Connection:应用程序与Broker之间的网络连接。
  • Channel:信道,即信息传输的通道,可以建立多个 Channel,每个 Channel 代表一个会话任务。
    • 信道是建立在 TCP 连接内的虚拟连接,信息的读写都通过信道传输,因为对于操纵系统而言,建立和销毁 TCP 是非常昂贵的,所以引入了信道的概念,以复用一条 TCP 连接。
  • Broker(Server) :标识消息队列服务器实体,例如这里就是 RabbitMQ Server。
  • Virtual Host:虚拟主机,一个 Broker 中可以设置多个 Virtual Host,用作不同用户的权限隔离。
    • Broker 可以理解为整个数据库服务,而 Virtual Host 就是其中每个数据库的感觉,不同项目可以对应不同的数据库,其中有着项目所属的业务表等等。
    • 每个 Virtual Host 中,可以有若干个 Exchange 和 Queue。
  • Exchange:交换机,用来接收生产者发送的消息,然后将这些消息根据路由键发送到队列。
  • Binding:Exchange 和 Queue 之间的虚拟连接,Binding 中可以包括多个 Routing key。
  • Routing key:路由规则,虚拟机用它来确认如何路由一个特定消息。
  • Queue:消息队列,它是消息的容器,用来保存消息,每一条消息都能传入一个或者多个队列中,等待消费者消费,即取出这个消息。
  • Consumer:消息的消费者(接收消息的程序)。
 RabbitMQ队列形式

 RabbitMQ一共有五种常用的队列:

  • 第一种:简单队列(一对一模式)耦合性高,生产消费一一对应。
  • 第二种:WorkQueues(工作队列),一个生产,多个消费者共同处理消息。
  • 第三种:订阅模式,1一个生产者多个消费者,每一个消费者有自己的一个队列,生产者直接将消息发送给交换机,交换机将消息发送给队列,每一个队列都需要绑定到交换机。这种模式可以满足消费者发布一个消息,多个消费者消费同一信息的需求,但C1、C2消费的都是相同的数据,有时我们需要C1和C2消费的信息只有部分差异,比如我们需求:C1消费增加的数据,C2消费编辑、增加和删除的数据。
  • 第四种:路由模式,路由模式是在订阅模式基础上的完善,可以在生产消息的时候,加入Key值,与key值匹配的消费者消费信息。但路由模式中,就如三中提到的C1、C2、如果C2对应的类型更多,就需要写很多key值。但其实它只与C1有一点差别

  • 第五种:通配符模式是在路由模式的升级,他允许key模糊匹配。*代表一个词,#代表一个或多个词。通过通配符模式我们就可以将C1对应的一个key准确定为item.add。而C2我们就不需要一一写出key值,而是用item.#代替即可。

posted @ 2021-06-19 10:20  gygtech  Views(2604)  Comments(0Edit  收藏  举报