一文读懂RabbitMQ是什么及RabbitMQ中相关的术语

目录

 

RabbitMQ是什么?

为什么要使用 rabbitmq

Rabbitmq运行原理

RabbitMQ通常术语

Connections

Channels

Exchanges

Fanout  扇型交换机

Direct直连交换机

Topic  主题交换机

Queues(队列)

消费发送示例

创建一个Exchange

 新建立一个队列

把交换机与队列进行绑定

发送一条信息

 


RabbitMQ是什么?

RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言。

为什么要使用 rabbitmq

(1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;

(2)拥有持久化的机制,进程消息,队列中的信息也可以保存下来。

(3)实现消费者和生产者之间的解耦。

(4)对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。

Rabbitmq运行原理

从上图可知生产者(P)并没有直接将消息发送给消息队列,而是通过建立与Exchange的Channel,将消息发送给Exchange,Exchange根据规则,将消息转发给指定的消息队列。消费者(C)通过建立与消息队列相连的Channel,从消息队列中获取消息。

RabbitMQ通常术语

安装好RabbitMQ后,我们使用guest用户登录到管理页面。我们看到上面主要有ConnectionsChannelsExchangesQueues,那这四个项表示什么意思呢?

Connections

无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是 Connection。一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP 信道(Channel),每个信道都会被指派一个唯一的 ID。信道是建立在 Connection 之上的虚拟连接,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的。

Channels

我们完全可以使用 Connection 就能完成信道的工作,为什么还要引入信道呢?试想这样一个场景,一个应用程序中有很多个线程需要从 RabbitMQ 中消费消息,或者生产消息,那么必然需要建立很多个 Connection,也就是多个 TCP 连接。然而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。RabbitMQ 采用类似 NIONon-blocking I/O)的做法,选择 TCP 连接复用,不仅可以减少性能开销,同时也便于管理。

每个线程把持一个信道,所以信道复用了 Connection TCP 连接。同时 RabbitMQ 可以确保每个线程的私密性,就像拥有独立的连接一样。当每个信道的流量不是很大时,复用单一的 Connection 可以在产生性能瓶颈的情况下有效地节省 TCP 连接资源。但是信道本身的流量很大时,这时候多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个 Connection,将这些信道均摊到这些 Connection 中,至于这些相关的调优策略需要根据业务自身的实际情况进行调节。

信道在 AMQP 中是一个很重要的概念,大多数操作都是在信道这个层面展开的。

比如 channel.exchangeDeclarechannel.queueDeclarechannel.basicPublishchannel.basicConsume 等方法。

RabbitMQ 相关的 API AMQP 紧密相连,比如 channel.basicPublish 对应 AMQP Basic.Publish 命令。

Exchanges

接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为,例如,在RabbitMQ中,ExchangeType有direct、Fanout和Topic三种,不同类型的Exchange路由的行为是不一样的。Headers exchange(头交换机)这个不常用,就不讲了。

Fanout  扇型交换机

fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。

 

https://img2018.cnblogs.com/blog/774371/201908/774371-20190819104152177-2053988251.png

上图中,生产者(P)发送到ExchangeX)的所有消息都会路由到图中的两个Queue,并最终被两个消费者(C1C2)消费。

Direct直连交换机

direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding keyrouting key完全匹配的Queue中。

 

https://img2018.cnblogs.com/blog/774371/201908/774371-20190819104210818-1771762193.png

在此设置中,我们可以看到交换机(X)绑定了两个队列Q1Q2。队列Q1绑定键为orange,队列Q2的绑定键为black,green。在这样的设置中,通过路由键orange发布到交换机的消息 将被路由到队列Q1。路由键为black 或green的消息将转到Q2。所有其他消息将被丢弃。

多重绑定

https://www.rabbitmq.com/img/tutorials/direct-exchange-multiple.png

用相同的键绑定多个队列是完全合法的。在我们的示例中,我们可以使用绑定键black在X和Q1之间添加绑定。在这种情况下,直连交换机的行为类似于扇型,并将消息广播到所有匹配的队列。带有black路由键的消息将同时传递给 Q1和Q2。

Topic  主题交换机

  • *可以代替一个单词。
  • 可以替代零个或多个单词

https://img2018.cnblogs.com/blog/774371/201908/774371-20190819104233644-253637000.png

在此示例中,我们将发送所有描述动物的消息。将使用包含三个词(两个点)的路由键发送消息。路由键中的第一个单词将描述一个速度(celerity),第二个描述颜色(colour),第三个描述物种(species)

我们创建了三个绑定:Q1与绑定键“ * .orange.* ” 绑定,Q2与“ *.*.rabbit ”和“ lazy.# ” 绑定。

这些绑定可以总结为:

Q1对所有橙色动物都感兴趣。

Q2想听听有关兔子的一切,以及有关懒惰动物的一切。

路由键设置为“ quick.orange.rabbit ”的消息将传递到两个队列。消息“ lazy.orange.elephant ”也将发送给他们两个。另一方面,“ quick.orange.fox ”只会进入第一个队列,而“ lazy.brown.fox ”只会进入第二个队列。“ lazy.pink.rabbit ”将被传递到第二个队列并且只会消费一次,即使两个绑定都匹配。“ quick.brown.fox ”与任何绑定都不匹配,因此将被丢弃。

如果我们不按照规则并发送一个或四个单词的消息,例如“ orange ”或“ quick.orange.male.rabbit ”,会发生什么?好吧,这些消息将不匹配任何绑定,并且将会丢失。

另一方面,“ lazy.orange.male.rabbit ”即使有四个单词,也将匹配最后一个绑定,并将其传递到第二个队列。

主题交换机功能强大,可以像其他交换机一样进行。

当队列用“ # ”绑定键绑定时,它将接收所有消息,而与路由键无关,就像在扇型交换机一样。

当在绑定中不使用特殊字符“ * ”和“ # ”时,主题交换的行为就像直连交换机一样。

Queues(队列)

作用是存储消息,队列的特性是先进先出。生产者把消息发送到ExchangeExchange根据规则,将消息转发给指定的消息队列。然后消费者从队列中获取相应的消息。

消费发送示例

下面我们通过管理界面演示如何创建ExchangeQueue,并且把ExchangeQueue进行绑定发送接收信息。

创建一个Exchange

点击Add a new exchange,输入Exchange name,z这里交换机类型我们选择direct。

Durablity:持久化选项,Durable(持久化保存),Transient(即时保存)

 

 新建立一个队列

 

 

把交换机与队列进行绑定

 

 

发送一条信息

Routing key 与上面的保持一致。

 

 

消息发送成功后,我们去队列查看

 

 然后我们双击队列名称,进入到Get messages,

 

Act Mode

  • Nack message requeue true  获取消息,但是不做ack应答确认,消息重新入队
  • Ack message requeue false  获取消息,应答确认,消息不重新入队,将会从队列中删除
  • reject requeue true                拒绝获取消息,消息重新入队
  • reject requeue false               拒绝获取消息,消息不重新入队,将会被删除

点击Get Message后我们看到已经成功接收到了消息。

重新查看队列,发现total已经变成了0

参考:

https://www.rabbitmq.com/getstarted.html

https://www.cnblogs.com/eleven24/p/10326718.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值