EQueue文件持久化消息关键点设计思路

要持久化的关键数据有三种

  1. 消息;
  2. 队列,队列中存放的是消息索引信息,即消息在文件中的物理位置(messageOffset)和在队列中的逻辑位置(queueOffset)的映射信息;
  3. 队列消费进度,表示当前队列中的消息消费到第几个了;

发送消息的设计

  1. producer将消息的二进制数据发送到broker;
  2. broker做的事情:
    • 单线程持久化消息到内存映射文件;
    • 将当前消息的索引信息放入缓冲区,可以使用disruptor的ringbuffer实现,单线程写,无锁。
    • 单线程从缓冲区读取消息索引信息,并将索引信息写入内存映射文件;
    • 消息的内存映射文件、消息索引的内存映射文件都定时刷新到磁盘,比如每隔1s刷新一次,可配置;
  3. broker将当前消息的索引信息放入缓冲区后,就立即返回了,然后producer就收到了消息发送的结果;

其他说明:

  1. 因为不可能用一个文件来保存所有的消息,所以肯定是用多个文件的方式。也就是说,无论是保存消息还是保存消息索引,都用多个文件。另外,由于队列有多个,所以每个队列都对应多个内存映射文件。队列文件的目录命名规则:rootPath / topic / queueId / queue mapped files
  2. broker在将消息的索引信息放入缓冲区时,要检查缓冲区是否到达一定的水位,比如ringbuffer总大小100W个槽,假如水位是80%,那就是当现在ringbuffer中可用的槽不到20%时,应该要做流控,比如sleep 100s;理论上应该不会到达水位,因为写消息索引肯定比写消息本身要快;

消费消息的设计

  1. consumer告诉broker当前需要拉取哪个topic下的哪个队列里的第几个位置(queueOffset)开始的消息,并告诉要最多拉取多少个消息;
  2. broker根据topic和queueId找到对应的队列;
  3. 根据queueOffset从队列拿到消息在文件中的物理位置,即messageOffset;
  4. 根据messageOffset从消息的内存映射文件获取消息二进制数据;
  5. 将消息二进制数据写入临时的内存流里,该内存流里包含了所有要返回的消息;
  6. 消息拉取数量达到要求或没有新的消息可以拉取后,将内存流对应的二进制数据返回给consumer;
  7. consumer解析二进制数据,得到所有的消息对象;

broker定时清理过期的消息和消息索引

  1. 每隔10s扫描是否有过期的消息文件,过期时间可配置,比如三天;扫描时,发现文件的最后修改时间是3天前,则删除;
  2. 每隔10s扫描是否有过期的消息索引文件,判断是否过期的依据是扫描每个消息索引文件,判断该文件中的最后一个消息索引的messageOffset是否比最小的messageOffset还要小;如果小,就说明这个消息索引文件已经无意义了,可以删除;

broker启动时的逻辑

  1. 扫描磁盘上所有的消息的存储文件,为每个文件建立内存映射;
  2. 扫描磁盘上所有的队列(消息索引)的存储文件,为每个文件建立内存映射;
  3. 对每个队列,预恢复几个文件(比如最后的3个文件)的数据到内存,剩余的用到时再恢复;
  4. 同理,对于存储消息的文件,也预恢复几个(比如最后的3个文件)到内存;一般大部分消息者只要消费进度不是太慢,总是应该已经赶上了最后那三个文件了;
  5. 关于异常关闭broker时的逻辑,暂时还没想清楚,还需要再细思;
时间: 2024-11-01 05:20:40

EQueue文件持久化消息关键点设计思路的相关文章

ENode 1.0 - 消息队列的设计思路

开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architecture的思想.通过前一篇文章,我们知道了enode内部有两种队列:command queue.event queue:用户发送的command会进入command queue排队,domain model产生的domain event会进入event queue,然后等待被dispatch到所有的

enode框架入门:消息的重试机制的设计思路

上一篇文章,简单介绍了enode框架中消息队列的设计思路,本文介绍一下enode框架中关系消息的重试机 制的设计思路. 对于一个EDA架构为基础的框架,核心就是消息驱动,然后基于最终一致性的原则.所 以,非常重要的一点是,如果消息一次执行不成功,那该怎么办?我能想到的对策就是消息的重试.我发现, 这篇文章比较难写,因为感觉要把复杂的事情清晰的表达出来,感觉确实不容易.说到重试,那什么是消息的 重试呢?怎么重试呢?我这里提到的重试是指,一个消息,从消息队列取出来后,要处理,但是处理失败了, 然后要

通信-C#基于TCP的局域网聊天工具 不知道怎么接收消息部分怎么写 求设计思路

问题描述 C#基于TCP的局域网聊天工具 不知道怎么接收消息部分怎么写 求设计思路 我之所以问这个问题是因为我说的接收消息不是那种两个窗口都开着 发送或接收的 而是当接收的用户不在场时 聊天窗口并未打开也能接收 只是好友列表里的好友在闪 然后等用户回来 点击好友时聊天窗口,好友发送过来的那些信息还有 然后用户也能回复 说白了就是qq那样的 我只能做到发送信息 和当发送消息,接收方的用户里对应的好友在闪(只是在闪 也不能接收消息和打开窗口) 想问问大侠们 如果是你们大概会怎么设计这一块 .....

HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo

26 集群使用初步 HDFS的设计思路 l 设计思想   分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析:   l 在大数据系统中作用: 为各类分布式运算框架(如:mapreduce,spark,tez,--)提供数据存储服务   l 重点概念:文件切块,副本存放,元数据 26.1 HDFS使用 1.查看集群状态 命令:   hdfs  dfsadmin –report 可以看出,集群共有3个datanode可用 也可打开web控制台查看

WIN8设计特性浅谈和腾讯微博MS首版设计思路分享

中介交易 SEO诊断 淘宝客 云主机 技术大厅 作者:dengxuecui(崔登学) miaotong(佟淼) 10月,一个收获的季节,微软的新一代操作系统window8悄然而至,同时,我们的微博客户端团队,也搭上了第一波win8应用的末班车,设计并推出了腾讯微博MS版本.本文将结合腾讯微博MS版本的设计过程以及对win8系统特性的认识,聊聊win8操作的平台的应用设计. 文章很长,请选择有价值的部分阅读,或许你敢把它读完呢- 本文索引: 1. Windows8-再构想 2. Win8的系统特性

ENode框架单台机器在处理Command时的设计思路

设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保证命令.事件处理的顺序性,先来的先处理,先产生的先处理: 保证一个聚合根的事件只有一个线程在持久化,并按事件产生的顺序持久化: 持久化事件时如果遇到并发冲突时(聚合根ID+事件版本号出现重复)的处理代价要轻: 要能利用多核的优势: 总体设计思路 先将命令根据聚合根ID路由到CommandMailBo

iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计

iOS简易蓝牙对战五子棋游戏设计思路之一--核心蓝牙通讯类的设计 一.引言     本系列博客将系统的介绍一款蓝牙对战五子棋的开发思路与过程,其中的核心部分有两个,一部分是蓝牙通讯中对战双方信息交互框架的设计与开发,一部分是五子棋游戏中棋盘逻辑与胜负判定的算法实现.本篇博客将介绍游戏中蓝牙通讯类的设计思路 二.设计通讯类的核心想法    在前篇的一篇博客中,我们有详细的介绍iOS中蓝牙4.0技术的应用与系统框架CoorBluetooth.framework中提供的编程接口的用法.博客地址如下,如

“产品经理”丁磊的易信设计思路

文/冀勇庆微信.飞信.有信.沃信--已经种类繁多的即时通讯(IM)市场上又出了个新产品:易信.8月19日,许久没有公开露面的网易CEO丁磊与中国电信董事长王晓初一起,隆重推出了"易信",双方将合资成立浙江翼信科技有限公司,开发和运营这款产品.众多周知,作为互联网老兵的丁磊有着非常好的产品感觉.据老冀了解,这些年来他虽然不怎么公开露面,但却参与了几乎所有的网易新产品的研发.这些年来大热的互联网新产品如微博.微信等,丁磊也都 长时间地"潜水"体验过.不过,如今即时通讯时

至顶而下的设计思路:QQ空间V6.0版

文章描述:设计中的继承与颠覆:以QQ空间V6设计产品升级为例. 空间诞生6年了,终于再一次升级,迎来了革新的V6.0版,它是近年来最重要的版本升级,肩负着空间的战略转型,促进平台开放,提升营收与活跃用户的重任.所以这一版本的升级,我们改变从前自细节入手,直接优化流程与表现的设计思路.而是从全局的角度切入,重新思考平台的定位策略,进一步整合信息架构,颠覆表现层的交互体验,提升用户对QQ空间的品牌认知与情感认同.改变过去每一次升级后,新增加的特性与功能为空间造成的臃肿复杂的现状 所以引入了Jesse