RabbitMQ概述与工作模式剖析

RabbitMQ概述与工作模式剖析

MQ简介

  • MQ: 消息队列,是一种先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理
  • MQ的作用主要有以下三个方面
    • 异步: 异步能提高系统的响应速度、吞吐量
    • 解耦
      • 服务之间进行解耦,才可以减少服务之间的影响。提高系统整体的稳定性以及可扩展性
      • 可以实现数据分发。生产者发送一个消息后可以由一个或者多个消费者进行消费,并且消费者的增加或者减少对生产者没有影响
    • 削峰: 以稳定的系统资源应对突发的流量冲击

MQ产品特点比较

优点 缺点 使用场景
Kafka 吞吐量非常大,性能非常好,集群高可用 会丢数据,功能单一 日志分析,大数据采集
RabbitMQ 消息可靠性高,功能全面 吞吐量比较低,消息积累会影响性能,erlang语言不好定制 小规模场景
RocketMQ 高吞吐、高性能、高可用,功能全面 开源版本不如云上版,官方文档比较简单,客户端只支持java 几乎全场景

RabbitMQ相关概念

  • Broker: 接收和分发消息的引用,RabbitMQ Server就是Message Broker
  • Virtual host: 处于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ Server提供的服务时,可以划分出多个host,每个用户在自己的vhost创建Exchange/Queue
  • Connection: publisher/consumer和Broker之间的TCP连接
  • Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCPConnection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个Thread创建单独的Channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立连接。
  • Exchange: message到达Broker的第一站,根据分发规则,匹配查询表中的routingkey,分发消息到queue中去。常用的类型有: direct(点对点)、topic(发布订阅)、andfanout(广播)
  • Queue: 消息最终被送到这里等待Consumer取走
  • Binding: Exchange和Queue之间的虚拟连接,binding中可以包含Routing Key,Binding信息被保存到Exchange中查询表中,用于Message的分依据。

RabbitMQ结构图

RabbitMQ概述与工作模式剖析_第1张图片

RabbitMQ工作模式

6种工作模式:

  1. 简单模式: 一个生产者,一个消费者,不需要设置交换机(使用的是默认的交换机)
  2. 工作队列模式: 一个生产者,多个消费者(竞争关系),不需要设置交换机(使用的是默认的交换机)
  3. 发布订阅模式: 需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列
  4. 路由模式: 需要设置类型为direct的交换机,交换机和队列进行绑定,并且指令路由key,将发送消息到交换机后,交换机会根据路由key将消息发送到对应的队列
  5. 通配符模式: 需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式路由key,当发送消息到交换机后,交换机会根据路由key将消息发送到对应的队列
  6. RPC远程调用模式

简单模式

生产者负责发送消息,消费者会一直监听Queue等待消息到来

简单模式结构图

RabbitMQ简单模式.png

工作队列模式

工作队列模式结构图

RabbitMQ概述与工作模式剖析_第2张图片

  • 与简单模式相比,多了一个或多个消费者,多个消费者共同消费同一个队列中的信息。对于任务过重或任务较多的情况使用工作队列模式可以提高任务处理的速度

  • 应用场景: 短信通知服务

发布订阅模式

发布订阅模式结构图

RabbitMQ概述与工作模式剖析_第3张图片

  • 在发布订阅模式中,多了一个Exchange角色,而且过程也略有变化

    • Provider: 生产者也就是发送消息的程序,但是不再发送到队列中,而是发送交换机

    • Consumer: 消费者是消息的接收者,会一直等待消息到来

    • Queue: 消息队列,接收消息,缓存消息

    • Exchange: 一方面,接收生产者发送的消息。另一方面知道如何处理消息,假如递交给某个特别的队列,递交给所有队列,或是将消息丢弃.到底如何操作,取决于Exchange的类型。只负责发送消息,不具备存储消息的能力,如果没有任何Queue和Exchange绑定,则不会发送给任何Consumer,Exchange的常见类型:

      • Fanout(广播): 将消息交给所有绑定到交换机的队列
      • Direct(定向): 把消息交给复合指定routing key的队列
      • Topic(通配符): 把消息交给符合routing pattern的队列
  • 交换机只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与交换机绑定,或者没有复合路由规则的队列,那么消息会丢失.

  • 应用场景:

    • 数据提供商和应用商

    • 中国气象局提供天气预报送入交换机,网易、新浪、百度、搜狐等门户介入通过队列绑定到该交换机,自动获取气象局推送的气象数据

  • 小结:

    • 交换机需要与队列进行绑定,绑定之后,一个消息可以被多个消费者都收到

    • 发布订阅模式与工作队列模式的区别

      • 工作队列模式不用定义交换机,而发布订阅模式需要定义交换机
      • 发布订阅模式的生产方式面向交换机发送信息,工作队列模式的生产方是面向队列发送消息(底层使用默认交换机)
      • 发布订阅模式需要设置队列和交换机的绑定,工作队列模式不需要设置,实际上工作队列模式会将队列绑定到默认的交换机

路由模式

发布订阅模式结构图

RabbitMQ概述与工作模式剖析_第4张图片

  • 队列与交换机的绑定,不能是任意绑定了,而是指定一个路由key
  • 消息的发送方在想交换机发送消息时,也必须指定消息的路由key
  • 交换机不再把消息交给每一个绑定的队列,而是根据消息的路由key进行判断,只有队列的路由key与消息完全一致,才会接收到消息
  • 小结: 路由模式要求队列在绑定交换机时需要指定路由key,消息会转发到复合路由key的队列

通配符模式

通配符模式结构图

RabbitMQ概述与工作模式剖析_第5张图片

  • Topic 类型与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列.只不过 Topic 类型Exchange 可以让队列在绑定 Routing key 的时候使用通配符!
  • Routingkey一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
  • 通配符规则:# 匹配一个或多个词* 匹配不多不少恰好1个词,例如:item.# 能够匹配 item.insert.abc 或者 item.insert,item.* 只能匹配 item.insert
  • 小结: 通配符模式可以实现发布订阅模式和路由模式的功能,只是通配符模式在配置路由key的时候可以使用通配符,显得更加灵活.

你可能感兴趣的:(java,分布式,rabbitmq)