作为消息中间部分,MQ具有异步改进性能,减少系统耦合和峰值流量切割的特征,并已成为改善系统应用程序的必不可少的组件。RockEtMQ提供了高吞吐量,高可用性,数据非斜率,群集部署,支持高级功能(死信,试验队列等)的功能,并基于Javalanguage开发,这对于源代码分析和次要转换非常方便,因此,它是对中间件源代码的分析的最佳候选人。
让我们简要介绍RocketMQ的一些特征和基本原理。稍后,我们将根据这些特征逐步分析源代码。
RocketMQ架构主要包括以下四个部分,如上图所示:
定时消息(延迟队列)意味着在将消息发送给经纪人之后,它不会立即消耗,等待将真实主题交付给特定时间。Broker具有MESSECURATION MESSAGERAYLEVEL。默认值为“ 1S 5S 10S 30S 1M 2M 3M 3M 4 MM 5M 7M 7M 8M 10M 10M 10M 30M 1H 2H”,18级别。您可以配置自定义MessagedElaylevel。
定时消息将暂时存在于名为schedule_topic_xxxx的主题中,并根据delayTimelevel存储特定的队列。queueid = delayTimelevel -1,即,队列仅具有相同的延迟消息,以确保可以按顺序消费相同的发送新闻。Broker将安排Schedule_topic_xxxxx并将消息写入真实主题。
我们需要在以下内容中进行次要发展。可以在指定的时间设置此延迟时间,以使整体更灵活。
消费消息失败后,消费消息将失败,它将提供重试的机制,以再次使消息消耗。
RocketMQ将为每个消费者组设置一个主题名称为“%重试% +消费者组”,用于试用队列(在这里应注意,该主题的试用队列是针对消费者组的,而不是每个主题设置),用于临时保存有消息称,消费者由于各种异常而无法消费。考虑到异常恢复需要一段时间,它将为重试队列设置多个重试水平。每个重试级别都有相应的重新延迟延迟。重试的次数越多,后来的延迟越大。重试消息的RocketMQ处理是在延迟队列中保留主题名称“ scheple_topic_xxxx”。在相应的时间,后端时间任务被很好地保存在“%retry%+消费组”的重新打开队列中。
死信队列用于处理无法正常消费的新闻。消息首次消费失败后,新闻队列将自动使消息重试;在达到最大恢复次数后,如果消费仍然失败,则表明消费者在正常情况下无法正确消费新闻。目前,新闻队列不会立即丢弃消息,并将其发送给与消费者相对应的特殊队列。
RocketMQ将这种正常信息称为死心的信息,而存储死亡信件的特殊队列被称为“死书”队列。在RocketMQ中,死者信中的消息队列可以重新播放。通过使用控制台控制台使消费者实例再次消费。
RockEtMQ事务消息(事务消息)意味着可以在全球交易中定义本地事务和发送消息操作的应用,或者同时成功,或者在同一时间失败。RocketMQ的交易消息提供了类似于x的分布式交易功能/OPEN XA,可以通过交易消息实现分布式交易的最终一致性。
我们的源代码还分析了RocketMQ交易消息的基本原理。
RocketMQ消息存储包含三个部分:
什么是页面缓存?优点:pre -Reading,缓存
PageCache是OS的缓存,可以加速文件的读写。从总的来说,程序读取和写入文件的速度几乎与内存的读写速度接近。主要原因是操作系统使用PageCache机制来优化读取和写入访问操作,并将部分内存用作PageCache。对于数据的编写,OS将首先写入缓存,然后使用PDFlush内核要使用pdflush内核来刷数据中的数据到物理磁盘。对于数据读数,如果一次读取文件时存在不受欢迎的pagecache,则OS将从物理磁盘中访问读取文件,而另一个相邻的文件将访问读取文件数据文件将按顺序预先阅读。
此页面缓存机制适用于更少的存储数据,并顺序读取。在PageCache的预读效果下,消耗队列文件的阅读性能几乎接近阅读内存,因此即使消息累积不会影响性能。
对于由Commitlog消息存储的日志数据文件,更多的随机访问读数将在阅读信息时会产生更多的随机访问,这会严重影响性能。如果选择正确的系统IO计划算法,例如将调度算法设置为“截止日期”(在此期间时间块存储在SSD中使用),随机读取的性能也将得到改善。
什么是内存映射?优点:减少内核状态和用户模式复制
磁盘的顺序可以大大提高I/O写作的效率,并且常规Java API的性能受到限制。
因此,请使用Nio Filechannel地图方法创建内存映射文件。其优点是减少内核状态和用户模式的背面和forth副本所带来的费用。文件操作的操作已转换为内存地址,大大提高了文件的读写效率。
RocketMQ的文件存储使用固定长度结构来存储它,这很方便将整个文件映射到内存一次。
磁盘订购+内存映射大大提高了RocketMQ的性能,但是该新闻存储在页面缓存中,并且不耐用。该消息如何成功发送?是否已将其发送到页面缓存以直接返回,或者在持久到磁盘后将其返回?
RocketMQ提供了两种刷牙机制:同步刷牙,异步刷。根据性能和可靠性确定什么样的刷子机制。
同步刷磁盘:RocketMQ实现称为组提交,GroupCommitservice。
异步刷:同步刷子可以确保不会丢失消息,而牺牲是写作的性能。RocketMQ提供异步的刷子机构。
将消息存储在PageCache上后,异步刷磁盘将直接返回。打开一个异步线程定期执行Filechannel力法,并定期将数据写入磁盘。默认间隔为500毫秒。
RocketMQ由名称服务器,经纪人,制作人和消费者组成,RocketMQ提供了一些基本功能,包括:延迟队列,新闻重演,死信,交易消息等。
并简单地了解RocketMQ的存储架构设计,从而大大提高了通过此写作+内存映射的顺序提高消息写作的速度。通过Cubsumequeue的设计,提高了消息消耗的效率。
我们将启动源代码分析过程,首先从名称服务器分析,然后开始发送消息,消息存储和时间表,消息消耗过程以及分析核心过程后,高级特征(延迟队列,交易消息)等等)分析。
原始:https://juejin.cn/post/70978954295436295