【RocketMQ系列一】初识RocketMQ

简介: 【RocketMQ系列一】初识RocketMQ

1、消息队列

消息队列(Message Queue,下面简称MQ)  是一种用于分布式系统中各节点之间进行消息传输的,独立于平台的软件系统。如果把分布式系统中的各个节点比喻成商家和顾客的话,那么消息中间件就是快递公司。商家(生产者)将快递(消息)投递给快递公司,快递公司负责运送快递给顾客(消费者)。那么在分布式系统架构中为啥要用消息中间件呢?

2、消息队列的应用场景

消息队列在分布式系统中主要用于异步解耦,流量削峰等场景。就以订单流程为例。没有使用消息队列的情况下,用户下单,需要订单系统调用商品系统扣减库存,调用积分系统发放积分,调用优惠券系统抵扣优惠券。这几个系统都与订单系统耦合在一块了。任意一个系统的失败都可能导致下单失败。

使用消息队列之后,订单系统只需要发送一条消息,商品系统,积分系统,优惠券系统直接订阅订单系统发送的消息即可。

3、RocketMQ的简介

RocketMQ是阿里巴巴开源的一款消息队列,它具有低延迟,高吞吐量,高可靠性等特点。目前,RocketMQ在阿里巴巴内部有着广泛的应用,经历多次双十一的洗礼,RocketMQ的可靠性非常高。

4、各类MQ的对比

目前市面上常用的MQ有: kafka, RabbitMQ,RocketMQ,ActiveMQ。这四种MQ的主要对比如下图所示:

名称 RabbitMQ ActiveMQ RocketMQ kafka
开发语言 Erlang Java Java Scala&Java
客户端支持语言 支持,JAVA优先 语言无关 只支持JAVA 支持,JAVA优先
单机吞吐量 其次(万级) 最差(万级) 最高(十万级) 次之(十万级)
消息延迟 微秒级 \ 比kafka快 毫秒级
数据可靠性 可以保证数据不丢失,有slave用作备份 master/slave 支持异步实时刷盘,同步刷盘,同步复制,异步复制 数据可靠,并且有副本机制,有容错容灾能力
HA master/slave模式,master提供服务,slave仅作备份 基于Zookeeper+LevelDB的Master-Slave实现方式 支持多Master模式,多Master多Slave模式,异步复制模式, 支持replica机制,leader宕机后,备份自动顶替,并重新选举leader(基于zookeeper)
消息推拉模式 多协议,Pull/Push均有支持 多协议,Pull/Push均有支持 多协议,Pull/Push均有支持 Pull
成熟度 成熟 成熟 比较成熟 成熟
特点
支持协议 多协议支持:AMQP,XMPP,SMTP,STOMP 自有协议 自有协议,社区封装了HTTP协议支持
持久化 内存,文件,支持数据堆积,但数据堆积会影响生产速率 内存,文件,数据库 磁盘文件 磁盘文件,只要做到
事务 不支持 支持 支持 不支持,但可以通过Low Level API保证只消费一次
负载均衡 支持 支持 支持 支持
集群 支持 支持 支持 支持
评价 优点:由于Erlang语言的特性,mq性能较好,管理界面丰富,在互联网公司也有大规模应用;支持amqp。 缺点:erlang语言难度较大,集群不支持动态扩展。 优点:成熟的产品,已经在很多公司得到应用。缺点:社区不活跃,会出现莫名其妙的问题,且会丢失消息 优点:模型简单。在阿里大规模应用,单日处理消息上百亿。

综上所述:

早期的话ActiveMQ使用比较多,但是ActiveMQ没有经历过大吞吐量场景的验证,且可能会丢失消息,社区也不活跃,现在应用的比较少了。

RabbitMQ 得益于其活跃的开源社区以及高可用性被不少公司应用。但是Erlang语言阻止了大量的java开发工程师去深入研究和掌握它,对公司而言,几乎处于不可控的状态。

RocketMQ 作为经历过双十一大吞吐量场景的考验,Java语言开发的消息队列,现在被越来越多的公司采用。RocketMQ也已经捐给了Apache 基金会,社区较为活跃。

kafka主要应用于日志收集场景。

如果系统使用消息队列主要场景是处理在线业务,比如在交易系统中用消息队列传递订单,需要低延迟和高稳定性,建议使用 RocketMQ。

如果需要处理海量的消息,像收集日志、监控信息或是埋点这类数据,或是你的应用场景大量使用了大数据、流计算相关的开源产品,那 Kafka 是最适合的消息队列。

5、RocketMQ的技术架构

RockerMQ架构上主要分为四部分, 如上图所示:

  1. Producer: 消息生产者角色,支持分布式集群部署,主要用于发送消息,通常集成于业务系统。它相当于是发信者。
  2. Consumer: 消息消费者角色,支持分布式集群部署,支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,通常集成于业务系统。它相当于收信者。
  3. Broker: 主要负责消息的存储、投递和查询以及服务高可用保证。它相当于是邮局 其内部包含以下几个重要子模块。
    4.1. Remoting Module: 整个Broker的实体,负责处理来自Clients端的请求。
    4.2. Client Manager: 负责管理客户端(Producer/Consumer)和维护Topic订阅信息。
    4.3. Store Service: 提供方便简单的API接口处理消息存储到物理磁盘和查询功能。
  4. NameServer:   它是Broker的注册中心,支持Broker的动态注册与发现。它主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的提供者。然后提供心跳检测机制,检查Broker是否存活;路由信息管理,每个NameServer通常也是集群方式部署,各实例互不进行通信,Broker向每一台NameServer注册自己的路由信息, 所以,每一个NameServer实例上面都保存一份完整的路由信息,当某个NameServer因某种原因下线了,Broker仍然可以向其他NameServer同步其路由信息。NameServer是无状态的。

6、RockerMQ领域模型

如上图所示,RocketMQ中消息的生命周期主要分为消息生产、消息存储、消息消费这三部分。

生产者生产消息并发送到RocketMQ服务端,消息被存储到服务端的主题中,消费者通过订阅主题消费消息。

1. 消息生产

生产者(Producer):用于产生消息的运行实体,一般集成于业务调用链路的上游。生产者是轻量级匿名无身份的。

2. 消息存储

  1. 主题(Topic):
    RocketMQ 消息传输和存储的分组容器,主题内部由多个队列组成,消息的存储和水平扩展实际是通过主题内的队列实现的。
  2. 队列(MessageQueue):
    RocketMQ 消息传输和存储的实际单元容器,类比于其他消息队列中的分区。RocketMQ 通过流式特性的无限队列结构来存储消息,消息在队列内具有顺序存储特性。
  3. 消息(Message):
    RocketMQ 的最小传输单元,消息具备不可变性,在初始化发送和完成存储后即不可变。

3. 消息消费

  1. 消费者分组(ConsumerGroup):
    RocketMQ发布订阅模型中定义的独立的消费身份分组。用于统一管理底层运行的多个消费者(Consumer)。同一个消费者组的多个消费者必须保持消费逻辑和配置一致,共同分担该消费者组订阅的消息,实现消费能力的水平扩展。
  2. 消费者(Consumer):
    RocketMQ 消费消息的运行实体,一般集成在业务调用链路的下游。消费者必须指定到某一个消费者组中。
  3. 订阅关系(Subscription):
    RocketMQ   发布订阅模型中消息过滤、重试、消费进度的规则配置。订阅关系以消费组粒度进行管理,消费组通过定义订阅关系控制指定消费组下的消费者如何实现消息过滤、消费重试及消费进度恢复等。RocketMQ  的订阅关系除过滤表达式之外都是持久化的,即服务端重启或请求断开,订阅关系依然保留。

参考

领域模型概述

千锋教育RocketMQ全套视频教程,快速掌握MQ消息中间件

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
消息中间件 监控 API
RocketMQ 5.0
RocketMQ 5.0 是一款分布式消息中间件,由阿里巴巴开源,提供了高性能、高可靠、高可扩展性的消息传递服务。它采用发布/订阅模式,支持多种消息协议,如 JMS、MQTT 等,可用于构建企业级应用的异步消息处理、系统解耦、流量削峰等场景。
92 4
|
2天前
|
消息中间件 Java RocketMQ
【RocketMQ系列九】SpringCloudStream整合RocketMQ
【RocketMQ系列九】SpringCloudStream整合RocketMQ
9 1
|
2月前
|
消息中间件 Apache RocketMQ
RocketMQ
RocketMQ “【5月更文挑战第24天】”
33 2
|
23天前
|
消息中间件 Java API
详解RocketMQ使用
详解RocketMQ使用
29 0
|
2月前
|
消息中间件 存储 Cloud Native
RocketMQ的初步认识
RocketMQ的初步认识
36 0
|
2月前
|
消息中间件 监控 RocketMQ
RocketMQ
RocketMQ是一个开源的分布式消息中间件,由阿里巴巴集团开发和维护。
70 1
|
8月前
|
消息中间件 存储 JSON
RocketMQ使用总结
RocketMQ使用总结
141 0
|
12月前
|
消息中间件 负载均衡 Java
RocketMQ6
RocketMQ是一款分布式消息中间件,广泛应用于企业级架构中的异步消息传递、数据流处理、日志收集与传输等场景。RocketMQ 6是RocketMQ的最新版本,相比于旧版本,它具有更高的性能、更好的稳定性和更丰富的功能,支持更多的协议和特性。
86 0
|
消息中间件 存储 运维
RocketMq
RocketMq
104 0
|
消息中间件 存储 缓存
RocketMQ参数约束和建议
Apache RocketMQ 系统中存在很多自定义参数和资源命名,您在使用 Apache RocketMQ 时建议参考如下说明规范系统设置,避对某些具体参数设置不合理导致应用出现异常。
189 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19