流殃的博客

| Comments

基本概念

生产者

发送消息的一方

消费者

接受消息的一方

Channel

Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

Exchange

消息交换机,作用是接收来自生产者的消息,并根据路由键转发消息到所绑定的队列。
生产者发送上的消息,就是先通过Exchnage按照绑定(binding)规则转发到队列的。
交换机类型(Exchange Type)有四种:fanout、direct、topic,headers,其中headers并不常用。

  • fanout:这种类型不处理路由键(RoutingKey),很像子网广播,每台子网内的主机都获得了一份复制的消息,发布/订阅模式就是指使用fanout交换机类型,
  • fanout类型交换机转发消息是最快的。
  • direct:模式处理路由键,需要路由键完全匹配的队列才能收到消息,路由模式使用的是direct类型的交换机。
  • topic:将路由键和某模式进行匹配。主题模式使用的是topic类型的交换机。

Binding

Binding是一种操作,其作用是建立消息从Exchange转发到Queue的规则,在进行Exchange与Queue的绑定时,需要指定一个BindingKey,Binding操作一般用于RabbitMQ的路由工作模式和主题工作模式。

Vitual Host

Virutal host也叫虚拟主机,一个VirtualHost下面有一组不同Exchnage与Queue,不同的Virtual host的Exchnage与Queue之间互相不影响。应用隔离与权限划分,Virtual host是RabbitMQ中最小颗粒的权限单位划分。

如果要类比的话,我们可以把Virtual host比作MySQL中的数据库,通常我们在使用MySQL时,会为不同的项目指定不同的数据库,同样的,在使用RabbitMQ时,我们可以为不同的应用程序指定不同的Virtual host。

工作模式

简单模式

特征:

  • 只有一个生产者、一个消费者和一个队列。
  • 生产者和消费者在发送和接收消息时,只需要指定队列名,而不需要指定发送到哪个Exchange,RabbitMQ服务器会自动使用Virtual host的默认的Exchange,默认Exchange的type为direct。

工作模式

在simple模式下只有一个生产者和消费者,当生产者生产消息的速度大于消费者的消费速度时,我们可以添加一个或多个消费者来加快消费速度,这种在simple模式下增加消费者的模式,称为work模式
特征:

  • 可以有多个消费者,但一条消息只能被一个消费者获取。
  • 发送到队列中的消息,由服务器平均分配给不同消费者进行消费

发布订阅模式

work模式可以将消息转到多个消费者,但每条消息只能由一个消费者获取,如果我们想一条消息可以同时给多个消费者消费呢?这种情况就叫做发布订阅模式

特征:

  • 发布/订阅模式中,Echange的type为fanout。
  • 生产者发送消息时,不需要指定具体的队列名,Exchange会将收到的消息转发到所绑定的队列。
  • 消息被Exchange转到多个队列,一条消息可以被多个消费者获取。
  • 不同的Exchange之间互不影响,相同Exchange,相同队列的情况下,消息均等消费
  • 相同Exchange,不同队列的情况下,一条消息可以被多个消费者获取

路由模式

前面几种模式,消息的目标队列无法由生产者指定,而在路由模式下,消息的目标队列,可以由生产者指定

  • 路由模式下Exchange的type为direct。
  • 消息的目标队列可以由生产者按照routingKey规则指定。
  • 消费者通过BindingKey绑定自己所关心的队列。
  • 一条消息队可以被多个消息者获取。
  • 只有RoutingKey与BidingKey相匹配的队列才会收到消息。

RoutingKey用于生产者指定Exchange最终将消息路由到哪个队列,BindingKey用于消费者绑定到某个队列。

主题模式

主题模式是在路由模式的基础上,将路由键和某模式进行匹配。其中#表示匹配多个词,*表示匹配一个词,消费者可以通过某种模式的BindKey来达到订阅某个主题消息的目的

高可用

单机

普通集群模式

image-1664774410216
这种模式严格来说不算是分布式的结构,因为它所有的数据都是在一台机器上的,消费者消费的时候可以在任意一个rabbitmq中进行消费,如果没有实际数据,就从有实际数据上的mq上进行拉取元数据:真实数据的描述如具体位置等

特征:

  • 主题模式Exchange的type取值为topic。
  • 一条消息可以被多个消费者获取。

优点

  1. 提高吞吐量,可以从多个节点来消费信息

缺点

  1. 如果放实际数据的mq宕机了,基本上这个架构就失效了
  2. 集群内部有大量数据传输
  3. 可用性几乎没有保障

镜像集群模式

image-1664774438843
生产者生产一条消息,将消息发送到一个mq中,mq会自动将信息同步到其他的mq上,每个mq上的数据都是一样的,所以称之为镜像集群模式

开启方式

rabbitmq有个很好的控制台,新增一条策略、这个策略就是开启开启镜像集群模式策略、指定的时候可以指定数据同步到所有的节点,也可以要求同步到指定的节点数量,之后你在创建queue时使用这个策略、就会在动降数据同步到其它节点上去了。

缺点

  1. 性能开销太大,消息同步到所有的节点服务器会导致网络带宽压力和消耗很严重。
  2. 这种模式没有扩展性可言,如果你某个queue的负载很高,你加机器,新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue
  3. 不是分布式的

为什么不是分布式的那?
因为所有的数据还是单独存在在每一个机器上,而分布式应该是将数据存储在不同的的机器上,几个机器上合起来的数据才是一个完整的数据

参考

Comments

评论