rabbitmq之相关概念

版权声明:本文是作者在学习与工作中的总结与笔记,如有内容是您的原创,请评论留下链接地址,我会在文章开头声明。 https://blog.csdn.net/usagoole/article/details/82831812

RabbitMQ版本

  1. 版本声明: 3.6.15

RabbitMQ相关概念

  1. RabbitMQ是一个Erlang开发的AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的开源实现,它最初起源于金融系统
  2. 特点
    • 可靠性: RabbitMQ使用如持久化、传输确认、发布确认等机制来保证可靠性
    • 扩展性:多个RabbitMQ节点可以组成一个集群,可以动态扩展集群中的节点
    • 高可用性:队列可以在集群中的机器上设置镜像,即使部分节点出现问题队列仍然可用
    • 多种协议:AMQP协议STOMPMOTT等多种消息中间件协议
    • 多语言客户端:javaPythonRubyPHPC#JavaScriptGoObject-C
    • 管理界面:查看、监控、管理消息、集群中节点状态的用户界面
    • 第三方插件丰富
  3. AMQP规范不仅定义了一种网络协议,同时也定义了服务端的服务与行为——AMQP模型AMQP模型在逻辑上定义了三种抽象组件用于指定消息的路由行为
    • Exchange(交换器):用于把消息路由到队列的组件
    • Queue(队列):用于存储消息的数据结构(内存或者硬盘)
    • Binding(绑定规则):一套规则,用于告诉Exchange(交换器)消息应该被存储到哪个Queue(队列)
  4. 模型图

Queue

  1. Queue(队列)RabbitMQ的内部对象,用于存储消息。RabbitMQ中的消息都只能存储在Queue(队列)中Producer(生产者)发送的消息最终会投递到Queue(队列)中(从上图可以看出Producer并不直接与Queue直接交互),Consumer(消费者)可以从Queue(队列)中获取消息并消费
  2. 多个Consumer(消费者)可以订阅同一个Queue(队列),此时队列中的消息会被平均分配(Round-Robin,轮询)给多个Consumer(消费者)处理,RabbitMQ不支持队列层面的广播消费。

Exchange

Producer(生产者)会将消息发送给Exchange(交换器),由Exchange(交换器)将消息路由到一个或者多个Queue(队列)(或者丢弃)。因为消息是存储在Queue(队列)中,所以Exchange(交换器)的使用并不真正的消耗服务器的性能,而Queue(队列)会。

2. RoutingKey(路由键): Producer将消息发送给Exchange(交换器)时一般会指定一个RoutingKey(路由键)用来指定这个消息的路由规则,而这个RoutingKey(路由键)需要与交换器类型、BindingKey(绑定键)联合使用,最终才能到相应的Queue(队列)
3. BindingKey(绑定键):RabbitMQ Broker通过BindingKey(绑定键)Exchange(交换器)Queue(队列)关联起来,这样RabbitMQ Broker就知道如何正确地将消息路由到那个Queue(队列)
4. 当RoutingKey(路由键)BindingKey(绑定键)相匹配时,消息会被路由到对应的队列中。在绑定多个队列到同一个Exchange(交换器)的时候,这些绑定允许使用相同的BindingKey(绑定键)BindingKey(绑定键)是否有效取决于Exchange(交换器)的类型,比如fanout类型的Exchange(交换器)无论BindingKey(绑定键)是什么都会将消息路由到所有绑定到该Exchange(交换器)Queue(队列)中。
5. BindingKey(绑定键)官方解释是绑定的时候使用的RoutingKey(路由键),大多数时候都把BindingKey(绑定键)RoutingKey(路由键)看做RoutingKey(路由键),事实上RabbitMQ java API中只有RoutingKey(路由键),并没有BindingKey(绑定键),在API调用的时候需要自己辨别。
6. 发信人(Producer)填写在包裹上的地址(RoutingKey)真实存在的地址(BindingKey)相匹配时,这个包裹就会被正确的投递到目的地(Queue),如果匹配不上,就不会投递到目的地(Queue)

Exchange常见类型

fanout

  1. fanout类型的交换器会把所有发送到该Exchange的消息路由到所有与它绑定的Queue(队列)中。下图中,生产者(P)发送到Exchange(X)的所有消息都会路由到图中的两个Queue,并最终被两个消费者(C1与C2)消费。

direct

  1. direct类型Exchange交换器会把消息路由到那些BindingKey(绑定键)RoutingKey(路由键)完全匹配的Queue(队列)中。
  2. 以上图的配置为例,我们以RoutingKey="error"发送消息到Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…);如果我们以RoutingKey="info"RoutingKey="warning"来发送消息,则消息只会路由到Queue2。如果我们以其他RoutingKey发送消息,则消息不会路由到这两个Queue中。

topic

  1. topic类型Exchange(交换器)在匹配规则上进行了扩展,它与direct类型Exchange交换器相似,也是将消息路由到BindingKey(绑定键)RoutingKey(路由键)相匹配的Queue(队列)中,但这里的匹配规则有些不同,它约定: RoutingKey(路由键)为一个句点号"."分隔的字符串(我们将被句点号"."分隔开的每一段独立的字符串称为一个单词),如"stock.usd.nyse""nyse.vmw""quick.orange.rabbit"BindingKey(绑定键)RoutingKey(路由键)一样也是句点号"."分隔的字符串。
  2. BindingKey(绑定键)中可以存在两种特殊字符"*""#",用于做模糊匹配,其中"*"用于匹配一个单词,"#"用于匹配多个单词(可以是零个)。
  3. 图示
    • 以上图中的配置为例,routingKey="quick.orange.rabbit"的消息会同时路由到Q1与Q2,routingKey="lazy.orange.fox"的消息会路由到Q1,routingKey="lazy.brown.fox"的消息会路由到Q2,routingKey="lazy.pink.rabbit"的消息会路由到Q2(只会投递给Q2一次,虽然这个RoutingKey(路由键)与Q2的两个BindingKey(绑定键)都匹配).routingKey="quick.brown.fox"routingKey="orange"routingKey="quick.orange.male.rabbit"的消息将会被丢弃,因为它们没有匹配任何BindingKey(绑定键)

headers

  1. headers类型的Exchange(交换器)不依赖于RoutingKey(路由键)的匹配规则来路由消息,而是根据发送的消息内容中中headers属性进行匹配。QueueExchange绑定时指定的key-value键值对,如果完全匹配消息发送到Exchange时消息内容中的headers属性(key-value键值对),则消息会路由到该队列。headers类型的Exchange(交换器)性能很差,一般情况下不会使用

Virtual hosts

  1. 每个virtual host本质上都是一个RabbitMQ Server,拥有它自己的queueexchagne,和绑定规则等等。这保证了你可以在多个不同的Application中使用RabbitMQ

docker安装

  1. 安装

    $ docker run -d  --name rabbitmq-3.6.15-management  -p 15671:15671 -p 15672:15672 -p 5671:5671 -p 5672:5672 rabbitmq:3.6.15-management
    
  2. 访问http://jannal.mac.com:15672/

猜你喜欢

转载自blog.csdn.net/usagoole/article/details/82831812