RocketMQ消息中间件(消息队列)

本文介绍了RocketMQ,阿里巴巴的开源消息中间件,如何通过消息队列实现异构服务间的平台无关调用,以及其特点如高性能、高可靠性和限流削峰功能。同时对比了其他消息中间件如ActiveMQ、RabbitMQ和Kafka。
摘要由CSDN通过智能技术生成

RocketMQ消息中间件(消息队列)

消息中间件是什么

中间件:顾名思义,就是介于两者之间的一个技术。

消息中间件:消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。

举个例子:现在有两个微服务系统,一个是由Spring Cloud实现的微服务系统A,另一个是由Dubbo实现的微服务B。如果A想调用B的服务此时该怎么做?因为Dubbo并不支持HTTP协议,支持的是自身的Dubbo协议。所以需要在A中引入Dubbo依赖才能向B发送服务调用,那如果还需要调用其他很多的微服务系统呢?就需要将对应的依赖都引入才能调用。这就意味着我们调用服务的方式和平台有关。为什么要引入消息中间件,就是为解决这个问题。我们来描述一下使用消息中间件是如何进行异构服务之间的调用的,首先A会把请求信息(请求端口号、请求方法等等)封装成一个消息,把这个消息发送给消息中间件,消息中间件再把这个消息转发给B,B接收到消息之后就执行响应的逻辑,B将执行结果也封装成消息,B将封装好的消息发送给消息中间件,消息中间件再转发给A,因为消息有自己固定的格式,所以异构的服务系统只需要将请求、响应信息封装成消息通过消息中间件转发就可以实现平台无关性的数据交流。

RocketMQ是什么

RocketMQ是阿里巴巴开源的一个消息中间件,是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。目前已贡献给apache。到2015年,RocketMQ已经经历了多年双十一的洗礼,在可用性、可靠性以及稳定性等方面都有出色的表现。

都有什么功能

异步化

将一些可以进行异步化的操作通过发消息来进行异步化,提高效率。

具体场景

用户为使用某个应用,需要进行注册,系统需要发送注册邮件和注册短信。对于这两个处理方式有两种:串行和并行。

  1. 串行方式:新注册信息生成之后,先发送注册邮件,再发送注册短信

在这里插入图片描述

在这种方式下,需要最终发送注册短信之后再返回成功给客户端

  1. 并行方式:新注册信息写入之后,发短信和发邮件并行处理

在这里插入图片描述

在这种方式下,发短信和发邮件需要处理完成之后再返回成功给客户端

假设以上三个子系统处理的时间均为50ms,不考虑网络延迟,则总处理时间为:

串行方式:50 + 50 + 50 = 150 ms
并行方式:50 + 50 = 100 ms

  1. 使用消息队列:

在这里插入图片描述

新注册信息写入并在写入消息队列之后立即返回成功给客户端,则总的时间依赖于写入消息队列的时间,而写入消息队列的时间本身是很快的,基本可以忽略不计,因此总的时间相比串行提高了两倍,相比并行提高了一倍。

限流削峰

在高并发场景下把请求存入消息队列,利用排队思想降低系统瞬间峰值

举个例子:购物网站开展秒杀活动,由于瞬间访问量过大,服务器接收过大,会导致流量暴增,相关系统无法处理请求甚至是崩溃。而加入消息队列之后,系统可以从消息队列中取消息,相当于消息队列做了一次缓冲

优点

  1. 请求先入队列,而不是由业务处理系统直接处理,做了一次缓冲,极大减小了业务处理系统的压力。
  2. 事实上,秒杀时,后入队列的用户无法秒杀到商品,这些请求可以直接被抛弃,返回活动已结束或者商品已售罄信息。

其他消息中间件

消息中间件不仅仅只有RocketMQ,市面上还有很多其他的消息中间件。

ActiveMQ:ActiveMQ 是Apache出品,最流行的,能力强劲的(现在不能说是最流行的,起初只有ActiveMQ的时候,都只能用ActiveMQ)开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,是使用Java语言编写的。

JMS: 全称是Java Message Service,即消息服务应用程序接口,是一个Java面向消息中间件平台的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信

RabbitMQ:AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用,使用Erlang语言编写的。

AMQP: 即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计

Kafka: Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

在这里插入图片描述

RocketMQ模型

相关概念

  • Producer:消息生产者,负责消息的生产,由业务系统负责产生
  • Consumer:消息消费者,负责消息的消费,由后台业务系统负责异步消费
  • Topic:消息的逻辑管理单位(消费的一个属性,并且每个消息都一定由这个属性)

具体来说Producer将消息发往具体的Topic,Consumer订阅Topic,主动拉取或被动接收消息,如果Consumer消费消息失败则默认会重试16次。

概念模型

  • Broker:消息的中转角色,负责存储消息,转发消息,一般也称为server,可以理解为一个存放消息的服务,里面可以由多个Topic
  • MessageQueue:消息的物理管理单位,一个Topic下有多个Queue,默认一个Topic创建时会创建四个MessageQueue
  • ConsumerGroup:具有相同消费逻辑,消费同样消息的Consumer,可以归并为一个group
  • ProducerGroup:具有同样属性的一些Producer可以归并为同一个group;同样属性是指:发送同样Topic类型的消息
  • Nameserver:注册中心
    作用:
    • 每个Broker启动的时候会向nameserver注册
    • Producer发送消息的时候,通过nameserver找到目标Topic对应的Queue所在Broker地址
    • Consumer消费消息的时候,通过nameserver找到订阅的Topic对应的Borker地址来实现消息的获取

部署模型

  1. 注册中心Nameserver启动

  2. 消息中转服务Broker启动

    • 启动的时候会去创建Topic并创建对应的MessageQueue

    • 启动的时候会去注册中心注册,把自己的地址和负责的Topic告诉注册中心

    • Broker和Nameserver之间通过心跳机制来检测对方是否存活

      连接:单个broker和所有nameserver保持长连接
      心跳:
      	心跳间隔:每个30秒(此时间无法更改)向所有nameserver发送心跳,心跳包含了自身的topic配置信息。
      	心跳超时:nameserver每个十秒钟(此时间无法更改),扫描所有还存活的broker连接,若某个连接2分钟内(当前时间与最后更新时间差超过2分钟,此时间无法更改)没有发送心跳数据,则断开连接。
      
  3. 消息生产者Producer启动

    启动时:

    • 单个生产者和一台nameserver保持长连接,定时查询topic配置信息
    • 单个生产者和该生产者关联的所有broker保持长连接

    运行时:

    • 默认情况下,生产者每隔30秒从nameserver获取所有topic的最新队列情况
    • 发送消息时,根据从nameserver获取的路由信息,根据发送消息的Topic和目标broker建立连接
    • 默认情况下,生产者每隔30秒向所有broker发送心跳,该时间由DefaultMQProducer的heartBrokerInterval参数决定,可手动配置。broker每隔10秒钟(此时间无法更改),扫描所有还存活的连接,若某个连接2分钟内(当前时间与最后更新时间差超过2分钟,此时间无法改变)没有发送心跳数据,则关闭连接。
  4. 消息消费者Consumer启动

    启动时:

    • 单个消费者和一台nameserver保持长连接,定时查询topic配置信息
    • 单个消费者和该消费者关联的所有broker保持长连接

    运行时:

    • 默认情况下,消费者每隔30秒从nameserver获取所有topic的最新队列情况
    • 默认情况下,消费者每隔30秒向所有broker发送心跳,该时间由DefaultMQPushConsumer的heartbeatBrokerInterval参数决定,可手动配置。broker每隔10秒(此时间无法更改),扫描所有还存活的连接,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟,此时间无法更改)没有发送心跳数据,则关闭连接。

注意事项

  • 同步刷盘与异步刷盘

    ​ RocketMQ的消息是存储到磁盘上的,这样既能保证断电后恢复,又可以让存储的消息量超出内存的限制。

    RocketMQ为了提高性能,会尽可能地保证磁盘的顺序写。消息在通过Producer写入RocketMQ的时候,有两种写磁盘方式:

    • 异步刷盘:在返回写成功状态时,消息可能只是被写入了内存中,写操作的返回快,

      吞吐量大;当内存里的消息量积累到一定程度时,统一触发写磁盘操作,快速写入

    • 同步刷盘:在返回写成功状态时,消息已经被写入磁盘。具体流程是,消息写入内存后,立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态。

    同步刷盘还是异步刷盘,是通过Broker配置文件里的flushDiskType参数设置的,这个参数被设置成SYNC_FLUSH、ASYNC_FLUSH

    中的一个

  • 同步复制与异步复制

    ​ 如果一个broker组有Master和Slave,消息需要从Master复制到Slave上,有同步和异步两种复制方式。

    同步复制是等Master和Slave均写成功后才反馈给客户端写成功状态;异步复制方式是只要Master写成功即可反馈给客户端写成功状态

    同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成

e,消息需要从Master复制到Slave上,有同步和异步两种复制方式。

同步复制是等Master和Slave均写成功后才反馈给客户端写成功状态;异步复制方式是只要Master写成功即可反馈给客户端写成功状态

同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成

ASYNC_MASTER、SYNC_MASTER、SLAVE三个值中的一个。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值