RabbitMQ初步学习

MQ介绍

MQ(Message Queue),即消息队列,用于消息存储,实现各系统间的异步通信。

MQ的应用场景(优点)

  • 系统解耦:增强系统的容错性和扩展性
  • 异步实现业务功能:缩短接口访问时间
  • 流量消峰:高并发场景下降低服务器压力

MQ的缺点

  • 降低系统可用性
  • 增加系统复杂度
  • 系统一致性问题

业界主流MQ对比

  • ActiveMQ 基于JMS(Java Message Service)规范实现,吞吐量低(万级),但功能完善,各种协议支持较好,文档丰富。MQ的早期的一个产品,目前使用的较少(官方对5.x维护的越来越少,较少在大规模吞吐的场景中使用)。
  • RabbitMQ 基于AMQP协议,使用Erlang语言开发的MQ产品。吞吐量万级,MQ功能较完备,性能极好。适用于中小型数据量的项目。
  • RocketMQ 阿里开源,使用JAVA语言开发的分布式MQ产品。吞吐量在10W级,功能较完备。适合于高吞吐量需求项目。
  • Kafka 使用Sala开发的分布式MQ产品。吞吐量最高(10W级),但MQ功能单一,适用于大数据场景下日志处理和实时计算。

RabbitMQ

架构图

RabbitMQ架构图

核心组件(概念)

  • vhost(virtual host) RabbitMQ虚拟服务器,用于数据和权限的隔离,同时避免命名冲突。每个vhost拥有自己的exchange,和queue 以及绑定关系,不同vhost之间的exchange和queue不能相互绑定。
  • Connection 与 Channel:Connection 是Poceducer/Consumer与Broker建立的TCP链接。为了避免TCP链接频繁的创建和销毁, 在TCP链接内创建虚拟信息传送通道(Channel),增大TCP链接的复用。
  • Exchange 交换机 用于将消息按绑定关系路由到一个或多个Queue

交换机类型

  • direct 消息发送到按照RoutingKey完全匹配的队列
  • topic 消息发送到按照RoutingKey模糊匹配的队列
  • fanout 消息发送到绑定此exchange的所有队列
  • header 消息发送到匹配消息header的队列,性能差,基本不用

消息确认机制 Message acknowledgment

  • 生产者确认模式 将信道设置成confirm模式,则信道上发布的消息都将被指派一个唯一ID,一旦消息被投递到目的队列后(或则消息被写入磁盘-可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)
  • 消费者确认模式(ACK)RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除(类似kafka offset偏移量提交)
    • 自动ACK
      消息一旦被接收,消费者自动发送ACK,可能造成消息丢失。如果消息不太重要,丢失也没有影响,那么自动ACK会比较方便
    • 手动ACK
      消息接收后,不会发送ACK,需要手动调用,但可能出重复消费情况。可在消息内部维护一个全局唯一的id,可以借助数据库的唯一索引或则redis的set去重,防止重复消费。

消费模式

消费模式分为两种: 推(Push)模式和拉(Pull)模式。推模式采用Basic.Consume进行消费,而拉模式则是调用Basic.Get模式。

  • Push模式 MQ主动将消息推送给消费者,消费者容易实现,且实时性较高;但需要考虑消费者的性能(特别是消息比较大时)和可靠性

  • Pull模式 消费者采用轮询的方式,从服务中拉取消息进行消费,消费确认后通知MQ删除已消费成功的消息。消费者可以更好的控制自身的消费速度(可以用线程池实现);但消费有一定延迟,甚至产生消息积压。

集群和镜像队列

一个基本的 RabbitMQ 集群不是高可用的,虽然集群共享队列,但在默认情况下,消息只会被路由到某一个节点的符合条件的队列上,并不会同步到其他节点的相同队列上(存储队列的元信息)。假设该节点突然宕,消息就会丢失。

开启队列镜像,将集群中的队列彼此之间进行镜像,此时消息就会被拷贝到处于同一个镜像分组中的所有队列上,达到高可用。

HAProxy负载均衡

RabbitMQ HAProxy负载均衡方案

RabbitMQ 集群本身并没有提供负载均衡的功能,可以通过硬件负载均衡或者软件负载均衡的方式,这里选择使用 HAProxy 来进行负载均衡,当然也可以使用其他负载均衡中间件,如 LVS 等。
HAProxy 同时支持四层和七层负载均衡,并基于单一进程的事件驱动模型,因此它可以支持非常高的井发连接数。

如果只采用一台 HAProxy ,它就存在明显的单点故障的问题,所以至少需要两台 HAProxy ,同时这两台 HAProxy 之间需要能够自动进行故障转移,通常的解决方案就是 KeepAlived 。KeepAlived 采用 VRRP (Virtual Router Redundancy Protocol,虚拟路由冗余协议) 来解决单点失效的问题,它通常由一组一备两个节点组成,同一时间内只有主节点会提供对外服务,并同时提供一个虚拟的 IP 地址(Virtual Internet Protocol Address ,简称 VIP) 。 如果主节点故障,那么备份节点会自动接管 VIP 并成为新的主节点 ,直到原有的主节点恢复。

参考文章

RabbitMQ的三种集群模式
RabbitMq持久化、队列排他、自动删除、消息确认机制、消息ACK、消费消息的模式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值