rabbitmq简介

特点

RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件,特点如下:

  • 可靠性:支持持久化,传输确认,发布确认等保证了MQ的可靠性
  • 灵活的分发消息策略:RabbitMQ的一大特点,在消息进入MQ前由Exchange(交换机)进行路由消息(分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式)
  • 支持集群:多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 多种协议:RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
  • 支持多种语言客户端:RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
  • 可视化管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
  • 插件机制:RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。


    rabbitmq简介_第1张图片
    简介

组件

  • 生产者(Producer):发送消息的应用。
  • 消费者(Consumer):接收消息的应用。
  • 队列(Queue):存储消息的缓存。
  • 消息(Message):由生产者通过RabbitMQ发送给消费者的信息。
  • 连接(Connection):连接RabbitMQ和应用服务器的TCP连接。
  • 通道(Channel):连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。
  • 交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息列队里。要实现消息的接收,一个队列必须到绑定一个交换机。
  • 绑定(Binding):绑定是队列和交换机的一个关联连接。
  • 路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。

消息六种发送模式

生产者(Producer)发送->中间件->消费者(Consumer)接收消息。

1、简单队列

1)生产者将消息发送到队列,消费者从队列获取消息。
2)一个队列对应一个消费者。


rabbitmq简介_第2张图片
简单队列

2、工作队列

1)一个生产者,多个消费者
2)一个消息发送到队列时,只能被一个消费者消费
3)多个消费者并行处理消息,提升消息处理数据


rabbitmq简介_第3张图片
工作队列

3、发布/订阅模式(Publish/Subcribe)

将消息发送到交换机,队列从交换机获取消息,队列需要绑定到交换机。
1)一个生产者,多个消费者
2)每个消费者都有自己的队列
3)生产者把消息发送到交换机(exchange),由交换机分发到队列
4)交换机类型为“fanout”


rabbitmq简介_第4张图片
发布/订阅模式

4、路由模式(Routing)

路由模式是发布/订阅模式的一种特殊情况
1)路由模式的交换机类型为“direct”
2)绑定队列到交换机时指定 key,即路由键,一个队列可以指定多个路由键
3)生产者发送消息时指定路由键,消息只会发送到绑定的key的对应队列中


rabbitmq简介_第5张图片
路由模式

5、主题模式(Topic)

1)将路由键和某模式进行匹配
2)符号“#”匹配一个或多个词,“*”匹配不多不少一个词
3)绑定队列到交换机指定key时,进行通配符模式匹配


rabbitmq简介_第6张图片
主题模式

6、RPC模式

1)对于RPC请求,客户端发送一条带有两个属性的消息:replyTo--设置为仅为请求创建的匿名独占队列;correlationId--设置为每个请求的唯一id值
2)请求被发送到rpc_queue队列
3)RPC工作进程(即:服务器)在队列上等待请求。当一个请求出现时,它执行任务,并使用replyTo字段中的队列将结果发回客户机
4)客户机在回应消息队列上等待数据。当消息出现时,它检查correlationId属性。如果匹配请求中的值,则向程序返回该响应数据


rabbitmq简介_第7张图片
RPC模式

rabbitmq的四种交换机

有4种不同的交换机类型:

  • 直连交换机:Direct exchange
  • 扇形交换机:Fanout exchange
  • 主题交换机:Topic exchange
  • 首部交换机:Headers exchange

1、扇形交换机

  • 扇形交换机是最基本的交换机类型,它所能做的事情非常简单———广播消息。
  • 扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。

2、直连交换机

直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key,当消息被发送的时候,需要指定一个binding_key,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key也是支持应用到多个队列中的。

3、主题交换机

  • 发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。
  • 主题交换机的routing_key需要有一定的规则,交换机和队列的binding_key需要采用.#......的格式,每个部分用.分开,其中:
    "*"表示一个单词
    "#"表示任意数量(零个或多个)单词

4、首部交换机

  • 定义一个Hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当Hash的内容匹配上的时候,消息就会被写入队列
  • 绑定交换机和队列的时候,Hash结构中要求携带一个键“x-match”,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了。相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串(string)

rabbitmq四种集群部署架构

1、主备模式

一个主/备方案,主节点提供读写,备用节点不提供读写。如果主节点挂了,就切换到备用节点,原来的备用节点升级为主节点提供读写服务,当原来的主节点恢复运行后,原来的主节点就变成备用节点,和 activeMQ 利用 zookeeper 做主/备一样,也可以一主多备。
Warren (兔子窝) 模式。实现 rabbitMQ 的高可用集群,一般在并发和数据量不高的情况下,这种模式非常的好用且简单

rabbitmq简介_第8张图片
主备模式

2、远程模式

远程模式可以实现双活的一种模式,简称 shovel 模式,所谓的 shovel 就是把消息进行不同数据中心的复制工作,可以跨地域的让两个 MQ 集群互联,远距离通信和复制。

3、镜像模式(常用)

  • 集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失,在实际工作中用的最多的
  • Mirror镜像队列,目的是为了保证rabbitmq数据的高可靠性解决方案,主要就是实现数据的同步,一般来讲是2-3个实现数据同步(对于100%数据可靠性解决方案一般是3个节点)集群架构如下:


    rabbitmq简介_第9张图片
    镜像模式

4、多活模式

这种模式也是实现异地数据复制的主流模式,因为Shovel模式配置比较复杂,所以一般来说实现异地集群都是使用双活或者多活模式来实现的。这种模式需要依赖rabbitmq的federation插件,可以实现继续的可靠AMQP数据通信,多活模式在实际配置与应用非常的简单。

rabbitmq简介_第10张图片
多活模式

主备模式和主从模式的区别:
主备模式:主节点提供读写,从节点不提供读写服务,只是负责提供备份服务,备份节点的主要功能是在主节点宕机时,完成自动切换 从-->主
主从模式:主节点提供读写,从节点只读


消息幂等性(重复消费)

同kafka一样,消息队列本身无法保证幂等性,以下是解决思路:
1)redis:消费数据后把消息的唯一键存到redis中,每次消费的时候去redis查一下key是否存在
2)mysql:消费数据后把消息的唯一键存到mysql中,每次消费的时候查mysql


数据丢失

  • 生产者:可通过开启事务解决数据丢失问题
    1)事务模式txSelect()、txCommit()与txRollback()
    2)confirm模式
  • rabbitmq:消息持久化
  • 消费者:手动ack

顺序性

当一个queue对应多个消费者时才会顺序错乱,只要保证一个queue对应一个consumer即可保证顺序性

你可能感兴趣的:(rabbitmq简介)