一文理解RocketMQ

news2024/11/19 14:34:38

概述

        RocketMQ是阿里开发的基于JMS的分布式消息中间件,是由纯JAVA实现的。放弃了比较重量级的Zookeeper作为注册中心,使用自研的NameServer实现元数据的管理,支持事务消息,顺序消息,批量消息,定时消息以及消息回溯。

  •  支持发布订阅和点对点的两种消息模型
  •  支持pull和push两种消息模式
  •  单个队列可以支持百万的消息堆积能力
  •  支持事务消息,重复消费,支持指定次数和时间间隔的失败消息重发

基本架构以及概念
        RocketMQ使用轻量级的自研NameServer作为注册中心进行服务的协调工作,Producer, Consumer, Broker集群在启动之后都会将自身信息注册到NameServer中,三者都会与NameServer建立长连接,通过定时轮询的方式获取服务最新信息。

         NameServer相对于Kafka中的Zookeeper是一个非常简单的Topic路由注册中心,NameServer完全是无状态的,可以使用集群进行部署,而NameServer Cluster中的各个NameServer节点相互不会同步任何信息。NameServer会存储Topic和Broker的信息。

  • Broker启动时会向所有的NameServer进行注册,NameServer和各个Broker之间保持长连接,Broker每隔30s向NameServer发送心跳信息,而NameServer每隔10s会轮询检查Broker是否存活。Broker宕机之后,会从路由表中删除,但是Producer不会马上感知,NameServer自身有一套完整的容错机制。
  • Producer启动之后是随机选择一个NameServer进行长连接,获取路由信息,并与提供Topic服务的Master节点建立长连接
  • Consumer启动之后同样是随机选择一个NameServer进行长连接,获取路由信息,与提供Topic服务的Master/Slave节点建立长连接

         在上图中NameServer集群中有3个NameServer节点;Producer集群有两个群组,每个群组中有两个Producer节点,Consumer配置类似。RocketMQ集群有两组Broker,分别都有主从之分,而且分别和Topic A, Topic B进行绑定,例如, BrokerA Master表示此Broker负责存储Topic 数据并是Master主节点。Producer从NameServer获取broker信息之后,选择该Topic绑定的Master进行发送数据;Consumer从NameServer获取broker信息之后,既可以绑定Master节点也可以绑定Slave节点,具体的规则由broker决定。这里和Kafka Consumer不太一样, Kafka不论Producer还是Consumer都只能绑定Master节点。

        以下是RocketMQ部分概念解析

  • Producer:消息生产者
  • Producer Group:消息生产者群组
  • Consumer:消息消费者
  • Consumer Group: 消费者群组,包含多个消费者,同组消费者消费同一个Topic下不同的分区的消息。
  • Broker: RocketMQ实例,可以理解为不同的RocketMQ服务器,每个都有一个唯一的编号。
  • Message: 生产者传递给消费者的消息体
  • Topic: 消息的主题,Broker上可以新建不同的Topic, Message发送到不同的Topic供消费者消费。
  • Tag:标签,相当于一个子Topic,可以区分同一主题下不同业务的消息
  • Queue: Topic和Queue是一对多的关系,主要用于负载均衡
  • Offset: 持久化的时候在每个Topic下的每个Queue会生成一个消息的索引文件,Offset记录当前Queue中的消息总数
  • NameServer:消息注册中心,管理两部分信息:1.Topic和Queue的路由配置信息 2.Broker的实时配置信息

具体工作流程

         RocketMQ同样采用顺序IO的方式将所有Topic的消息都写入同一个文件中,这个文件就是CommitLog.由于不同的topic消息都会混淆在一起,而Consumer又是按照topic来消费消息的,这样的话势必会去遍历commitLog文件来过滤topic,这样性能肯定会非常差,所以rocketMq采用ConsumeQueue来提高消费性能。即每个Topic下的每个queueId对应一个Consumequeue,其中存储了单条消息对应在commitLog文件中的物理偏移量offset,消息大小size,消息Tag的hash值。

        Producer使用轮询的方式分别向每个Queue中发送消息。

        Consumer会采用负载均衡角度,为每个Consumer Group下的所有Consumer平均分配需要处理的Queue。可以利用这一机制,实现客户端的动态扩容。

        当queue 个数大于 Consumer个数, 那么 Consumer 会平均分配 queue,不够平均,会根据clientId排序来拿取余数queue个数小于Consumer个数,那么会有Consumer闲置,就是浪费掉了,其余Consumer平均分配到queue。

        消息的刷盘机制同样有两种:

        同步刷盘:当消息持久化完成之后,Broker才会返回给Producer一个Ack。

        异步刷盘:只要消息写入PageCache即可将成功的ACK返回给Producer端。

集群搭建

        本文采用docker-compose部署RocketMQ集群以及UI页面,docker版本:18.06.3-ce  docker-compose版本:1.24.1。下图中的10.232.112.13为宿主机的IP,注意需要替换

        1.  在/usr/local/server/rocketmq_cluster/conf1创建broker.conf配置文件

# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = ItmentuCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH

        2.  在/usr/local/server/rocketmq_cluster/conf2创建broker.conf配置文件

# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = ItmentuCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-b
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
————————————————
版权声明:本文为CSDN博主「拥有1024的蜡笔小新」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/scmagic/article/details/124771179

        3.docker-compose文件建立集群

version: '3'
services:
  #Service for nameserver
  namesrv:
    image: rocketmqinc/rocketmq:4.4.0
    container_name: cluster_rmqnamesrv
    ports:
      - 9876:9876
    volumes:
      - /usr/local/server/rocketmq_cluster/data_namesrv/namesrv/logs:/root/logs
      - /usr/local/server/rocketmq/data_namesrv/namesrv/store:/root/store
    command: sh mqnamesrv
  broker1:
    image: rocketmqinc/rocketmq:4.4.0
    container_name: cluster_rmqbroker1
    links:
      - namesrv
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
environment:
      - NAMESRV_ADDR=namesrv:9876
    volumes:
      - /usr/local/server/rocketmq_cluster/data1/broker/logs:/root/logs
      - /usr/local/server/rocketmq_cluster/data1/broker/store:/root/store
      - /usr/local/server/rocketmq_cluster/conf1/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
    command: sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
    depends_on:
      - namesrv
  broker2:
    image: rocketmqinc/rocketmq:4.4.0
    container_name: cluster_rmqbroker2
    links:
      - namesrv
    ports:
      - 10929:10909
      - 10931:10911
      - 10932:10912
    environment:
      - NAMESRV_ADDR=namesrv:9876
    volumes:
      - /usr/local/server/rocketmq_cluster/data2/broker/logs:/root/logs
      - /usr/local/server/rocketmq_cluster/data2/broker/store:/root/store
      - /usr/local/server/rocketmq_cluster/conf2/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
    command: sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
    depends_on:
      - namesrv
  rmqconsole:
    image: pangliang/rocketmq-console-ng
    container_name: rmqconsole
    ports:
      - 7001:7001
    environment:
      JAVA_OPTS: "-Drocketmq.namesrv.addr=10.232.112.13:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Dserver.port=7001"
    depends_on:
      - namesrv

Demo代码(待添加)

到这里,你了解RocketMQ了吗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件体系结构复习题

2020 论述题 统一软件过程RUP:用例驱动、以架构为中心的迭代增量开发 一个用例可能需要多个功能来实现,一个功能也可能被用于多个用例 边界类、控制类、实体类 顺序图、通信图、定时图、交互概述图 扩展关系《extend》、包含关系《include》、…

python将图片批量排版插入Word文档

今天分享一个将图片批量插入word文档的小脚本,本脚本可以实现 jpg\png图片,可以混合在一起! 首先 我们需要设置每页word文档的排版需求,如:每页6张图片,一共是3行2列 pics_per_page 6,这是每页…

解说天下之操作系统

解说天下之操作系统 本文由桌案drawon (https://www.drawon.cn),云晶(https://www.yunjingxz.com)创始人根据多年从业经验, 从操作系统的起源,应用分类, 设计分类,以及资源使用角度对操作系统进…

leetcode 数据库题 175~185

leetcode 数据库题 175. 组合两个表176. 第二高的薪水177. 第N高的薪水178. 分数排名180. 连续出现的数字181. 超过经理收入的员工182. 查找重复的电子邮箱183. 从不订购的客户184. 部门工资最高的员工185. 部门工资前三高的所有员工小结 嗯。。。数据库题目就不贴原题内容了&…

00后是真卷不过,工作没两年,跳槽到我们公司起薪20K都快接近我了

在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&…

cocosCreator自动化打包工具

前言: 使用nodeJs脚本化Cocos Creator自动化构建、编译。 版本:cocosCreator2.4.5。 简述:使用自动化构建-编译工具前提,你终端上配置了相关的环境,比如JDK、NDK、SDK(对于原生平台)&#xff0c…

Express实战个人订阅号实现网站登录

今天我们来实现一个使用个人订阅号实现网站的功能,后端使用的是 express 。其它框架原理基本一致,只是定义路由或返回响应数据部分代码跟 express 有所出入。先来一波效果图: 1. 前言 20 年 3 月在掘金写过一篇文章,介绍了使用 e…

使用cmake 构建构建新项目的时候,编译提示库找不到怎么办?

昨天帮其他部门同事解决Linux下Qt编译找不到Qt 依赖库 core的问题。过程很有特征性,可以推广到Linux下使用cmake构建项目时找不到库文件的广泛性问题。 先上图,结合事情经过讲述: 事情经过: 这里给大家介绍第一个重点&#xff1…

秘塔写作猫

秘塔写作猫是集AI智能写作、多人协作、改写润色、文本校对等功能为一体的AI原生创作平台,可以帮助不同群体大幅提升写作效率和生产力。 接下来小编就带大家了解一下该软件具体的一些功能,不论你是学生、上班族还是自媒体从业者等,该工具绝对可…

箭头函数与普通的函数有什么区别-M

箭头函数与普通的函数有什么区别 1、写法不同 在 js 中,像命名式函数、函数表达式都称为普通函数。对于普通函数,需要用function关键字来声明。而箭头函数则不需要使用function关键字,在箭头前面的括号里面写参数,后面的大括号里…

Linux 安装MySQL-5.7.30

1.官网下载MySQL 进入官网https://www.mysql.com/ 从下载页面下载社区版本其中社区版本免费,免费的午餐不提供技术支持. 页面中MySQL Enterprise Edition是企业版,企业版收费但是会提供技术支持, 点击图中红框下载社区版本 选择Download Arc…

AC,AP以及三阶段项目

特点:access:连接终端设备 只能通过1个vlan trunk:交换机与交换机相连 可以通过多个vlan 共同特点:交换机的端口收发数据的规则: 收:如果收到的数据,没有携带任何标签,则使用该端口…

01SpringCloudRibbon负载均衡

Ribbon负载均衡 Ribbon Eureka帮我们集成了负载均衡组件:Ribbon,简单修改代码即可使用。 什么是Ribbon:客户端负载均衡组件 开启负载均衡 1、Eureka中已经集成了Ribbon,所以我们无需引入新的依赖,直接修改代码。 2、…

Redis的主从集群搭建与配置

文章目录 Redis主从集群模式搭建过程分级管理容灾冷处理 Redis主从集群模式 Redis的集群模式 主从复制模式:利用主从复制原理,一主多从架构。读写分离,主节点可读可写,从节点只能提供读服务。哨兵模式:哨兵实现了自动化…

Vue 3 + Element Plus 简单用法

Element Plus: A Desktop UI toolkit for Vue.js 即 Vue 桌面 UI 工具包 基于 Vue 2 的组件库和基于 Vue 3 的组件库安装方法不同,基于 Vue 3 的组件库叫做 Element Plus。 MDBootstrap 与 Element UI 区别: MD Bootstrap vs ElementUI: W…

如何在金融企业推进故障演练?中国人寿分阶段实践总结

一分钟精华速览 越来越多企业正在通过故障注入和演练的方式提升系统可靠性,这其中金融行业的应用较为特殊。一方面其可靠性要求比非涉账类系统更高;另一方面金融行业有更加严格的监管要求,如客户、账目等信息都有严格约束。加之金融系统较其…

ActiveMQ基础学习简单记录

ActiveMQ基础学习简单记录 JMS是什么JMS消息模型JMS Message Type Activemq安装概念强化JMS的跨平台性JMS通用接口JMS希望达到的目标是什么 Activemq发送消息的三种模式至少一次至多一次精确一次可重复确认模式小结 Activemq支持众多协议Activemq支持的定时消息,延迟消息,优先级…

【C++技能树】类和对象的使用 --初始化列表,static,友元,内部类,匿名对象的理解与使用

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我bua! 类和对象的使用 0. 初始化列表explicit关键字 1.Static静态成员变量2.友元2.1.友元函数2.2.友元类 3.内部类4.匿名对象4.匿名对象至此初始化列表,static…

【Linux】2. Shell运行原理与Linux权限操作

专栏导读 🍁作者简介:余悸,在读本科生一枚,致力于 C方向学习。 🍁收录于 C 专栏,本专栏主要内容为 C 初阶、 C 进阶、 STL 详解等,持续更新中! 🍁相关专栏推荐&#xff1…

Cloud Studio 有“新”分享

GitHub仓库推荐 Awesome Open Source Applications - 收集了各种开源应用程序,包括 Web 应用、桌面应用、移动应用等。Cloud Studio 一键运行 Free for Dev - 收集了各种免费的开源应用程序和工具,包括 Web 应用、桌面应用、移动应用等。Cloud Studio 一…