本文来说下RocketMQ的架构设计

文章目录

  • RocketMQ的简介
  • RocketMQ的架构设计
    • RocketMQ的核心组件
    • RocketMQ的消息领域模型
  • RocketMQ的关键特性
    • 消息的顺序
    • 消息重复
      • 消息重复的原因
      • 消息去重
  • RocketMQ的应用场景

RocketMQ的简介

RocketMQ一个纯java、分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点。


RocketMQ的架构设计

RocketMQ的核心组件

RocketMQ主要由NameServer、Broker、Producer以及Consumer四部分构成

NameServer:主要负责对于源数据的管理,包括了对于Topic和路由信息的管理。

NameServer是一个功能齐全的服务器,其角色类似kafka中的Zookeeper,但NameServer与Zookeeper相比更轻量。主要是因为每个NameServer节点互相之间是独立的,没有任何信息交互。

Producer

消息生产者,负责产生消息,一般由业务系统负责产生消息

  • Producer由用户进行分布式部署,消息由Producer通过多种负载均衡模式发送到Broker集群,发送低延时,支持快速失败。

Broker

消息中转角色,负责存储消息,转发消息

  • Broker是具体提供业务的服务器,单个Broker节点与所有的NameServer节点保持长连接及心跳,并会定时将Topic信息注册到NameServer,顺带一提底层的通信和连接都是基于Netty实现的。
  • Broker负责消息存储,以Topic为纬度支持轻量级的队列,单机可以支撑上万队列规模,支持消息推拉模型。
  • 官网上有数据显示:具有上亿级消息堆积能力,同时可严格保证消息的有序性。

Consumer

消息消费者,负责消费消息,一般是后台系统负责异步消费

  • Consumer也由用户部署,支持PUSH和PULL两种消费模式,支持集群消费和广播消息,提供实时的消息订阅机制。

大致流程

Broker在启动的时候会去向NameServer注册并且定时发送心跳,Producer在启动的时候会到NameServer上去拉取Topic所属的Broker具体地址,然后向具体的Broker发送消息。具体如下图


RocketMQ的消息领域模型

主要分为Message、Topic、Queue、Offset以及Group这几部分。

Topic

Topic表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息、物流消息等。一条消息必须有一个Topic。

最细粒度的订阅单位,一个Group可以订阅多个Topic的消息。

Tag

Tag表示消息的第二级类型,比如交易消息又可以分为:交易创建消息,交易完成消息等。RocketMQ提供2级消息分类,方便灵活控制。

Group

组,一个组可以订阅多个Topic。

Message Queue

消息的物理管理单位。一个Topic下可以有多个Queue,Queue的引入使得消息的存储可以分布式集群化,具有了水平扩展能力。

在RocketMQ 中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset 来访问,offset 为 java long 类型,64 位,理论上在 100年内不会溢出,所以认为是长度无限。

也可以认为 Message Queue 是一个长度无限的数组,Offset 就是下标。


RocketMQ的关键特性

消息的顺序

消息的顺序指的是消息消费时,能按照发送的顺序来消费。例如:一个订单产生了 3 条消息,分别是订单创建、订单付款、订单完成。消费时,要按照这个顺序消费才有意义。但同时订单之间又是可以并行消费的。

RocketMQ是通过将“相同ID的消息发送到同一个队列,而一个队列的消息只由一个消费者处理“来实现顺序消息。如下图:


这样对于同一个订单的创建、付款和完成消息,确保按照这一顺序被发送和消费。


消息重复

消息重复的原因

消息领域有一个对消息投递的QoS定义,分为:

  • 最多一次(At most once)
  • 至少一次(At least once)
  • 仅一次( Exactly once)

几乎所有的MQ产品都声称自己做到了Atleastonce。既然是至少一次,那避免不了消息重复,尤其是在分布式网络环境下。比如:网络原因闪断,ACK返回失败等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将该消息分发给其他的消费者。

不同的消息队列发送的确认信息形式不同,例如RabbitMQ是发送一个ACK确认消息,RocketMQ是返回一个CONSUME_SUCCESS成功标志,kafka实际上有个offset的概念。

RocketMQ没有内置消息去重的解决方案,最新版本是否支持还需确认。


消息去重

去重原则:使用业务端逻辑保持幂等性

幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用,数据库的结果都是唯一的,不可变的。

只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样,需要业务端来实现。

去重策略:保证每条消息都有唯一编号(比如唯一流水号),且保证消息处理成功与去重表的日志同时出现。

建立一个消息表,拿到这个消息做数据库的insert操作。给这个消息做一个唯一主键(primary key)或者唯一约束,那么就算出现重复消费的情况,就会导致主键冲突,那么就不再处理这条消息。


RocketMQ的应用场景

削峰填谷

比如如秒杀等大型活动时会带来较高的流量脉冲,如果没做相应的保护,将导致系统超负荷甚至崩溃。如果因限制太过导致请求大量失败而影响用户体验,可以利用MQ 超高性能的消息处理能力来解决。

异步解耦

通过上、下游业务系统的松耦合设计,比如:交易系统的下游子系统(如积分等)出现不可用甚至宕机,都不会影响到核心交易系统的正常运转。

顺序消息

与FIFO原理类似,MQ提供的顺序消息即保证消息的先进先出,可以应用于交易系统中的订单创建、支付、退款等流程。

分布式事务消息

比如阿里的交易系统、支付红包等场景需要确保数据的最终一致性,需要引入 MQ 的分布式事务,既实现了系统之间的解耦,又可以保证最终的数据一致性。

将大事务拆分成小事务,减少系统间的交互,既高效又可靠。再利用MQ 的可靠传输与多副本技术确保消息不丢,At-Least-Once 特性来最终确保数据的最终一致性。

RocketMQ的架构设计详解相关推荐

  1. 分布式 | Dubbo 架构设计详解

    转载自   分布式 | Dubbo 架构设计详解 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务 ...

  2. 【转】Dubbo架构设计详解

    本文转自:Dubbo架构设计详解,原作者是:时延军 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服 ...

  3. hbase 二进制数据写入_分布式数据库HBase的架构设计详解(有彩蛋)

    原标题:分布式数据库HBase的架构设计详解(有彩蛋) 本文根据DBAplus社群第99期线上分享整理而成,文末还有好书送哦~ 讲师介绍 陈鸿威 云财经大数据CTO 曾任百度高级工程师,现主持设计开发 ...

  4. 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

    本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 单体架构 Web应用程序发展的早期, ...

  5. 电商APP首页楼层架构设计详解

    关于C端产品的开发中,一个典型的业务场景即是移动端的首页楼层配置.作为APP的入口,首页承担着巨大流量压力.而且作为各频道以及搜索的入口,首页的用户体验与容灾容错的能力,响应效率用户体验都承担着巨大的 ...

  6. Dubbo架构设计详解--转载

    原文地址:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...

  7. Dubbo架构设计详解

    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...

  8. 从单体架构、到SOA、再到微服务的架构设计详解

    本文涉及的内容以及知识点如下: 单体架构 单体架构的拆分 SOA与微服务的区别 微服务的优缺点 微服务的消息 服务集成 数据的去中心化 单体架构 Web应用程序发展的早期,大部分web工程是将所有的功 ...

  9. Kafka第一讲:应用场景及架构设计详解

    本节是Kafka专题第一篇,主要介绍Kafka的发展历史.应用场景以及Kafka的基本架构,后续还会对Kafka的生产者.Broker.消费者.集群做详细讲解,敬请期待. 1.kafka的发展历史及应 ...

最新文章

  1. 选择select 标签中指定值的option
  2. Python类继承简单实现
  3. python库怎么绘画_python基础,安装并使用matplotlib库画图
  4. 也谈PostgreSQL的Vacuum机制及其最佳实践
  5. rpm安装mysql
  6. 汇编--查找第一个非0字符的五种方法
  7. python二级考试真题_2020年海南二级建造师考试《建筑工程》真题及答案_二级建造师...
  8. char *p=new char
  9. 全网首发:There is an incompatible JNA native library installed on this system/6.1.2/4.0.1
  10. Atitit 安全流程法 目录 1. 常见等安全措施方法 2 1.1. 安全的语言 代码法,编译型 java 2 1.2. 安全编码法 2 1.3. 安全等框架类库 api 2 1.4. 加密法 2
  11. phpdesigner 的配置
  12. 二、echarts地图从全国进省从省进市
  13. ue4材质节点大全_UE4材质节点大全
  14. 如何下载专利(国内)
  15. 守望先锋等FPS游戏的网络同步
  16. Neuralizing Regular Expressions for Slot Filling 神经网络转回自动机
  17. Essay-One Piece海贼王每集剧情介绍
  18. 培训linux系统下载,非常好的Linux培训教程集合下载
  19. Android 报错:Entry name 'AndroidManifest.xml' collided
  20. java计算机毕业设计高铁在线购票系统MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. Mysql 获取年级每个班前十学生的信息
  2. appearance—外观样式属性
  3. mongo系统(1)
  4. 第3章 用户(账户)管理
  5. Exchange2007客户端收发邮件时找不到对象
  6. Transposed Convolution 反卷积
  7. 即时通讯开发----回音消除技术
  8. 展讯召开2017全球合作伙伴大会,发布两款新平台及新战略
  9. 如何找到准确的终端连接端口?(转)
  10. Facebook已经过时,蜂巢新网络崛起