深入研究Broker是如何持久化的】的更多相关文章

前言 上篇文章王子和大家讨论了一下RocketMQ生产者发送消息的底层原理,今天我们接着这个话题,继续深入聊一聊RocketMQ的Broker是如何持久化的. Broker的持久化对于整个RocketMQ的运行起着至关重要的作用,为什么这么说呢? 其实解释起来很容易,因为消息中间件要实现的功能不仅仅是消息的发送和接收,它本身还要有很强大的存储能力,把来自各个系统的消息持久化到磁盘上. 只有这样,在其他系统消费消息时才能从磁盘中读取想要的消息. 如果不持久化到磁盘上,而是通过内存存储消息,一是内存…
前言 小伙伴们,国庆都过的开心吗?国庆后的第一个工作日是不是很多小伙伴还沉浸在假期的心情中,没有工作状态呢? 那王子今天和大家聊一聊RocketMQ的消费者是如何获取消息的,通过学习知识来找回状态吧. 废话不多说,我们开始吧. 消费者组 首先我们了解一个概念,什么是消费者组. 消费者组你就可以把它理解为,给一组消费者起一个名字. 假设我们有一个订单Topic名字是OrderTopic,然后库存系统和积分系统都要消费这个Topic中的数据,我们分别给库存系统和积分系统起一个消费组名字:stock_…
前言 hello小伙伴们,今天王子又来继续和大家聊RocketMQ了,之前的文章我们一直说Broker的主从切换是可以基于Dledger实现自动切换的,那么小伙伴们是不是很好奇它究竟是如何实现的呢?今天我们就来聊一聊这个话题. 首先我们回顾一下上一篇文章深入研究Broker是如何持久化的中,producer发送消息给Broker后,首先将消息写入到CommitLog日志文件中,然后会把具体的MessageQueue中消息的位置信息存储到ConsumeQueue中. 之后Broker为了实现高可用…
前言 通过之前文章的阅读,有关RocketMQ的底层原理相信小伙伴们已经有了一个比较清晰的认识. 那么接下来王子想跟大家讨论一个话题,如果我们的项目中引入了MQ,势必要面对的一个问题,就是消息丢失问题,今天我们就来聊聊消息是怎么丢失的. 现在假设我们的业务是这样的,用户通过订单系统下了一个订单,订单系统完成支付后会发送消息给RocketMQ,然后积分系统会从RocketMQ中消费消息,去给用户增加积分,如下图: 但是突然有一天有用户反映,支付订单之后,自己的积分并没有增长,这是为什么呢? 经过排…
前言 上篇文章,王子通过一个小案例和小伙伴们一起分析了一下消息是如何丢失的,但没有提出具体的解决方案. 我们已经知道发生消息丢失的原因大体上分为三个部分: 1.生产者发送消息到MQ这一过程导致消息丢失 2.MQ自己发生故障导致消息丢失 3.消费者拿到消息后,由于操作不当导致消息丢失 接下来我们就针对第一种情况,聊一聊如何解决生产者发送消息过程中的消息丢失问题. 先发送half消息到MQ 针对于这一问题,RocketMQ是自带一套解决方案的,就是事务消息.今天我们就来看一下事务消息的实现流程. 案…
前言 之前我们一起了解了使用RocketMQ事务消息解决生产者发送消息时消息丢失的问题,但使用了事务消息后消息就一定不会丢失了吗,肯定是不能保证的. 因为虽然我们解决了生产者发送消息时候的消息丢失问题,但也只是保证Broker正确的接收到了消息,实际上接收到的消息会保存在os cache中,如果此时broker机器突然宕机,os cache中的消息数据就丢失掉了. 而且就算是os cache中的消息已经刷盘到了磁盘中,如果磁盘突然就坏了,消息是不是也就丢失了. 所以我们还要考虑Broker如何保…
前言 在之前的MQ专题中,我们已经解决了消息中间件的一大难题,消息丢失问题. 但MQ在实际应用中不是说保证消息不丢失就万无一失了,它还有两个令人头疼的问题:重复消费和乱序. 今天我们就来聊一聊这两个常见的问题,看看RocketMQ是如何解决这两个问题的. 为什么会重复消费 首先我们来聊一聊重复消费的问题,要解决一个问题最开始的一步当然是去查找问题发生的原因了. 那出现重复消费的原因到底是什么呢? 我们先来思考一下生产者发送消息这一过程中是不是有可能重复发送消息到MQ呢? 答案是肯定的,比如生产者…
回到目录 关于持久化到Redis的消息格式,主要是说在Broker上把消息持久化的过程中,需要存储哪些类型的消息,因为我们的消息是分topic的,而每个topic又有若干个queue组成,而我们的topic和queue由于redis存储结构的原因,我们需要将它们分区对应存储一下,而不能像关系型数据库那样灵活,所以要额外设计几个数据结构来存储它们. 一 Topic字典 二 Topic对应的Queue字典 三 Queue里的消息 四 某个客户端对应某个Queue的消费进度 以上四个结构是我们要说的,…
本篇在上一篇<消息中间件架构讨论>的基础上分析Broker的模块划分. 上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),几点基础: Broker采用主从结构 Broker负责持久化元数据并汇报到NameServer Client从NameServer获取元数据,然后从Broker读取消息 Broker的模块划分 1 网络模块 Broker需要和NameServer及Client通信,包括Broker之间也需要通信(主从结构),所以Broker会有一个模块(Net&Pack…
持久化消息和非持久化消息的存储原理 正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的.能够存储的最大消息数据在${ActiveMQ_HOME}/conf/activemq.xml文件中的systemUsage节点 ,SystemUsage配置设置了一些系统内存和硬盘容量 <systemUsage> <systemUsage> <memoryUsage> //该子标记设置整个ActiveMQ节点的“可用内存限制”.这个值不能超过ActiveMQ本身设置…