RocketMQ原理解析

RocketMQ原理解析1 NameServer 名称服务 NameServer 是没有状态的 即 NameServer 中的 Broker 和 topic 等状态信息 通过其他角色上报获取 都是保存在内存中的 不会持久化存储 可通过配置实现 集群可以横向扩展 主要功能如下 a 接收 Broker master 和 slave 启动时的注册路由信息 b 为 producer 和 consumer 提供路由服务 即通过 topic 名字获取所

RocketMQ原理解析

RocketMQ原理解析 

1.NameServer名称服务

2.Broker

Broker向NameServer注册topic配置信息,配置信息格式如下:

{ "perm":6, "readQueueNums":2, "topicFilterType":"SINGLE_TAG", "topicName":"Topic-Lance", "writeQueueNums":5 }

3:Broker的消息存储

Rocketmq的消息的存储是由consumeQueue和 commitLog 配合完成的,commitLog保存消息的物理数据,consumeQueue是消息的逻辑队列,类似于索引,存储的是指向物理存储的地址。在一个Broker上,只有一个commitLog,所有consumeQueue共享同一个commitLog。

假如topic的名字是Topic-Lance,配置的读写队列有queue-1和queue-2,那么Topic-Lance和queue-1组成一个consumeQueue,Topic-Lance和queue-2组成另一个consumeQueue。

假如broker-A(包含queue-0,queue-1,queue-2), broker-B(包含queue-0,queue-1)两台broker机器都配置了Topic-Lance,那么broker启动的时候,注册到NameServer的Topic-Lance的路由有broker-A-queue-0,broker-A-queue-1,broker-A-queue-2,broker-B-queue-0,broker-B-queue-1共5个consumeQueue。

为了提高读写性能,commitLog采取顺序写,随机读(通过pagecache机制批量从磁盘读取到内存,加速后续的读取速度),consumeQueue大部分读入内存(如果consumeQueue因为重启等因素丢失,可以通过commitLog重建)

Page cache是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O操作,从而提高性能。此外,还要确保在page cache中的数据更改时能够被同步到磁盘上,后者被称为page回写(page writeback)。一个inode对应一个page cache对象,一个page cache对象包含多个物理page。

4.Producer 生产者

a.Producer发送消息时(必须制定topic),首先从本地的Producer集合中获取topic->broker的路由信息,如果没有,则从     nameserver中获取topic->broker路由,并缓存到本地集合;
b.定时从nameServer获取最新的topic路由信息;
c.Producer定时将Producer的group信息发送到对应的broker上;
d.Producer发送消息到Master的broker上,通过Broker的主从复制copy到slave的broker上。


5.Consumer 消费者

RocketMQ是基于pull模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消息,长轮询拉取消息后回调MessageListener接口实现完成消费。

关于RocketMQ长轮询可参考:https://www.jianshu.com/p/48dbc9eee890 

6.数据丢失问题处理

RocketMQ默认保存3天,commit log刷盘间隔,默认1秒

7.消费重试机制

Producer端重试 :

默认情况下是失败3次重试,可通过retryTimesWhenSendFailed定义重试次数;

Consumer端重试:

8. Rocketmq消费模型(实时性)

RocketMQ默认是采用pushConsumer方式消费的,从概念上来说是推送给消费者,它的本质是pull+长轮询。这样既通过长轮询达到了push的实时性,又有了pull的可控性。系统收到消息后会自动处理消息和offset(消息偏移量),如果期间有新的consumer加入会自动做负载均衡(集群模式下offset存在broker中; 广播模式下offset存在consumer里)。当然我们也可以设置为pullConsumer模式,这样灵活性会提高,但是代码却会很复杂,需要手动维护offset,消息存储和状态。

  * offset:简单粗暴的理解就是数组下标。message queue是无限长的数组,每次消息进来就会涨1,下标就是offset。consumer可以通过指定offse位置开始读取数据。queue的maxOffset是消息的最大offset,不是最新消息的offset 而是最新消息的offset+1,minOffset则是现存的最小offset。

9. Rocketmq消息存储(顺序写,随机读)   

RocketMQ原理解析

10. ZeroCopy高性能零拷贝 

RocketMQ原理解析

RocketMQ原理解析 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233722.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • github上开源的优秀android项目

    github上开源的优秀android项目源码大招:不服来战!撸这些完整项目,你不牛逼都难!经常有人问我有没有什么项目代码,我回复说去Github找,但是还是好多人不知道如何找到那些比较好的项目。今天花了点时间找了些安卓的项目,觉得还是不错的,几乎就是自己生活常用的一些app,如果你是一个Android开发者,我觉得撸完这些项目,你想不牛逼都难。菜鸟新闻菜鸟新闻客户端是一个仿照36Kr官方,实时抓取36Kr…

    2022年6月16日
    36
  • html爱心特效代码

    html爱心特效代码<!DOCTYPEHTMLPUBLIC”-//W3C//DTDHTML4.0Transitional//EN”><HTML><HEAD><TITLE>NewDocument</TITLE><METANAME=”Generator”CONTENT=”EditPlus”><METANAME=”Author”CONTENT=””><METANAME=”Keywor…

    2022年7月19日
    24
  • Nginx转发ssh服务「建议收藏」

    Nginx转发ssh服务「建议收藏」一、需求当前置机需要转发内网主机的ssh端口号,方便外网直连服务器。二、nginx配置注:与events,http同级,配置stream即可events{worker_connections1024;accept_mutexon;}stream{ upstreamssh{ server10.11.4.78:22;#这里IP是虚拟机的,对应虚拟机的IP+Port } server{ listen9028;#外层通信需要的tc

    2022年10月18日
    1
  • Lombok插件的简介「建议收藏」

    Lombok插件的简介「建议收藏」Lombok插件的简介1Lombok引入2Lombok常见注解使用1@Data2@AllArgsConstructor3@NoArgsConstructor4@ToString5@EqualsAndHashCode6@Getter/@Setter7@Slf4j8@NonNull9@Value10@Builder11@Synchronized12@SneakyThrows13@Cleanup3Lombok原理4关于Lombok总结官网:https://projectlom

    2025年10月4日
    5
  • dell服务器显示器fre,戴尔全新 Freesync 显示器,专门针对游戏玩家[通俗易懂]

    dell服务器显示器fre,戴尔全新 Freesync 显示器,专门针对游戏玩家[通俗易懂]戴尔拥有一对全新的Ultrasharp显示器,专门针对游戏玩家,对于那些重视整体速度和响应能力的人来说,它们可能是不久的将来理想的升级途径。运动刷新率高达155Hz,分辨率高达1440P,以及24英寸和27英寸面板的选项,有很多值得关注的新的,配备Freesync的显示器。但这会是如今最好的游戏显示器吗?戴尔2719DGF是一款27英寸TN面板显示器,其机箱外观干净,专…

    2022年6月4日
    31
  • vs2019配置opencv什么版本_vs配置opencv

    vs2019配置opencv什么版本_vs配置opencv一、环境vs2019社区版、win1064位操作系统二、opencv配置步骤(共5步)1、下载OpenCV4.0.1,官网为opencv.org2、安装opencv,我的安装目录是D:\opencv-4.0.1-vc14_vc153、添加环境变量,在PATH中添加:D:\opencv-4.0.1-vc14_vc15\opencv\build\x64\vc15…

    2022年10月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号