如何降低复杂度,用数据库做消息队列的存储?

一文读懂消息队列 消息队列 消息队列是在消息的传输过程中保存消息的容器,消息队列管理器在将消息从它的源中继到它的目标时充当中间人。 队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。 一、 产生背景: 现今,越来越多的企业面临着各种各样的数据集成和系统整合,CORBA、DCOM、RMI等RPC中间件技术也应运而生, 但由于采用R... 阅读详情

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

大家好,我是【架构摆渡人】,一只十年的程序猿。这是消息队列的第一篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。

今天跟大家聊聊如何用数据库来做消息的存储,这样就可以将消息队列的整体复杂度进行降低,如果后续你们需要自己造更贴近公司业务的轮子,我觉得可以用数据库来存储。

容量设计

假设你们的业务消息量每天是10亿条,数据存储最近7天的量,也就是70亿条。我们以单表2000W条数据作为上限,1个库放10张表,那么总共需要40个库来承载这些数据量。

当然这40个库可以不用40个单独的数据库实例,这样成本有点高,当然主要还是取决于你们消息的读写并发有多高,如果很高的话数据库实例越多,性能肯定越好。不多的话就5个数据库实例,每个实例上建8个库即可。(根据消息读取和写入的量结合数据库规格的性能进行评估)

数据归档

因为我们总共也就能存放80亿条的数据,如果数据量多了必然会影响查询性能或者磁盘空间不够的问题,而且对于已消费的消息,其实后面就没有业务价值了。

所以我们还需要每天进行数据的归档操作,归档你可以将这些数据移到Nosql中,也可以进行删除,看业务场景决定。有了归档,这样就能保持当前的数据库集群能够承载每日的消息容量。

存储设计

接下来聊聊最重要的存储设计,就是我要用数据库来存,我的表该怎么设计?

前面我们也讲到了,我们大概需要400张表来存储这些数据。我们对某个Topic进行消息发送,那么数据必然要落到这400张表中的某一张表里面,所以我们很自然的想以某个字段来分表就行了呗,比如Topic,每个Topic写入的数据必定在同一张表里面。

这样也没啥问题,但是在实际的业务中,必定是有的Topic消息量会很大,有的会很少。对于消息量很大的,可能几个小时就突破2000W的量了,那么这个表必定越来越大。所以我们在设计数据存储的时候一定要考虑到如何将某个Topic下的数据均匀的存储到多张表里面去。

可能有人就会说了,既然不能固定按Topic进行分表,那么就对总的表数量取模好啦,这样数据就会分布在每张表里面。但是这样对于consumer在消费的时候就有影响了,因为consumer压根就不知道自己要消费Topic的数据存在哪,必须得从所有的库表里面进行查询才能拿到数据,性能不太好。

要解决这个问题,我们先回顾下开源的MQ是怎么设计的,以RocketMQ来说,一个Topic下的消息会存储到多个Queue中(也就相当于kafka中的partition),也就是每个Topic下的Queue并不是一定的数量,而是可以在创建Topic时进行指定,所以我们在用表做存储的时候,也可以参考这个设计,本来每个Topic对应的消息量就不同。

所以一张表也就相当于一个Queue,用于存储消息内容。我们可以记录Topic和Queue之间的关系,记录后有如下的作用:

  • 往某个Topic写入消息的时候,就知道这个Topic对应哪些Queue(数据表),可以轮询的写入这些表,这样数据就比较平均。

  • 创建Topic的时候要预估一下数据量,然后指定分配多少个Queue用于存储。(后续也能在线修改Queue的数量)
  • Consumer消费某个Topic消息的时候,同样也知道对应哪些Queue,在Consumer初始化的时候就会分配好哪个Consumer消费哪个Queue,这样每个Consumer只会去固定的一个表中查询数据,性能也非常好。如果后面Consumer增加或者减少,Queue增加或者减少就需要重新分配了,这就是消息队列中经常提到的重平衡的一个概念。

当然这里只是说了整体的设计,还有很多细节需要去完善,比如Topic消息量小的如何处理,就算是只分配一个表,但是我们总的表数量是有限的,所以还会涉及到多Topic共用一个表的情况。

大概的我们可能会有下面的一些表:

  • consumer: 消费者,记录当前消费者的信息,比如ip, 进程ID, 应用类型,启动时间等等。
  • consumerGroup: 消费组信息。
  • topic:主题表。
  • queue: 消息表,记录消息内容,对应的Topic等等。
  • topicQueue: Topic和queue的关系。
  • queueOffset: 队列消费偏移量,记录consumer的消费信息。

总结

不同的场景可以选择不同的技术方案,用数据库作为MQ的存储也是一种不错的思路。但为什么开源的都是自己写磁盘呢?其实这也跟架构有关系,因为一旦依赖外部存储,也就是整个架构会比较复杂。而且MQ这种本来就是用来扛大流量的,所以要对底层进行优化,用三方的也就意味着性能其实依赖了三方。

通过数据库来存储MQ的数据,相对来说技术难点会比写磁盘要简单点,大家也可以按照这个思路,自己去设计实现一款MQ。

原创:架构摆渡人(公众号ID:jiagoubaiduren),欢迎分享,转载请保留出处。

推荐一款开源的mock框架:https://github.com/yinjihuan/fox-mock 基于Java Agent实现的自测,联调Mock利器

运动目标成像必学:5分钟搞懂keystone变换原理与避坑指南 本文深入浅出地解析了雷达信号处理中的Keystone变换原理,它是解决运动目标距离徙动问题的关键技术。文章通过直观比喻和简化公式,阐述了该变换如何通过变量代换实现距离与慢时间的解耦合,将倾斜轨迹“掰直”,从而提升成像与检测性能。同时,文中重点指出了实际应用中关于大速度场景、插值误差、多目标处理及高阶运动补偿等关键避坑点,为工程实践提供了宝贵指南。 阅读详情

相关推荐

【无标题】

可以看到这是一个带过滤的rce,并且还需要绕过空格,通过·查询资料得到了${IFS},$IFS$9,<,$IFS。然后f,l,a,g都被过滤了,可以用中括号[]来进行正则匹配,把GET传的参数改为?cmd=uniq /[e-h][k-n][^-b][e-h],就得到了flag。cmd={%0A"cmd":"/bin/cat /home/rceservice/flag"%0A}可以看到l被过滤了ls用不了了可以用dir用GET传参cmd=dir /,POST传参shell=system。

2501_94507425的博客 303

数据库分布式消息队列

数据库分布式消息队列 作者:vincentchma,腾讯 IEG 后台开发工程师 一、消息队列的演进 分布式消息队列中间件是是大型分布式系统中常见的中间件。消息队列主要解决应用耦合、异步消息、流量削锋等问题,具有高性能、高可用、可伸缩和最终一致性等特点。消息队列已经逐渐成为企业应用系统内部通信的核心手段,使用较多的消息队列有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、Pulsar 等,此外,利用数据库(如 Redis、MySQL 等)也可实现消息队列的部分基本功能

1743

华三R4900 G5服务器实战:用PMC P460-B4阵列卡配置RAID1+RAID6,并搞定CentOS 7.9安装(含热备盘设置)

本文详细解析了在华三R4900 G5服务器上使用PMC P460-B4阵列卡配置RAID1+RAID6混合阵列的全过程,包括热备盘设置和CentOS 7.9系统安装。通过实战步骤和性能优化建议,帮助企业IT人员高效部署高可用存储方案,特别适合需要数据冗余和系统稳定性的企业级应用场景。

weixin_29248653的博客 357

数据库学习笔记:消息队列

消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理问上一问。 我问问你你项目中用过消息队列么?你为啥用消息队列? 面试官你好:我们公司本身的业务体量很小,所以直接单机一把梭啥都能搞定了,但是后面业务体量不断扩大,采用微服务的设计思想,分布式的部署方式,所以拆分了很多的服务,随着体量的增加以及业务场景越来越复杂了,很多场景单机的技术栈和中间件以及不够用了...

薛定谔的猫-前端领域 883

BEVFormer vs BEVFusion:5个关键差异点帮你选对环视感知方案

本文深入对比了自动驾驶领域两大主流环视感知方案BEVFormer与BEVFusion。BEVFormer作为纯视觉BEV感知的标杆,通过注意力机制隐式学习深度,成本较低;而BEVFusion作为多模态融合典范,融合激光雷达与摄像头数据,在性能、小目标检测及极端环境鲁棒性上优势显著。文章从计算效率、部署成本、数据依赖性等五个核心维度提供选型指南,帮助技术决策者根据自身算力预算与传感器配置做出明智选择。

weixin_29306011的博客 123

YOLOv8剪枝 稀疏训练+slim剪枝测试精度仅掉1.6个点,速度提高10.3fps!

摘要 本文介绍了YOLOv8剪枝方法Slim(Network Slimming),通过L1正则化作用于BN层的缩放因子(γ),自动识别并剪除冗余通道,实现模型轻量化。核心步骤包括:稀疏训练(引入L1正则化)、通道剪枝(按γ阈值裁剪)、微调恢复精度。实验表明,该方法能有效压缩模型大小、减少计算量,且支持通过调整speed_up等超参数控制剪枝强度。移植代码需修改C2F模块以适配剪枝,并配置稀疏训练参数(如reg、sl_epochs)。最终剪枝模型需移除优化器以减小体积,但不支持多卡训练。

FJN110的博客 861

使用Mysql实现消息队列

实现起来就是 消息 带 状态 和 版本号 字段。 更新时用 版本号 做乐观锁。操作逻辑就是个状态机。 UPDATE mq SET mq.status=new_status mq.version = mq.version + 1 WHERE mq.version = old_version 实现 mysql mq 表结构设计 CREATE TABLE `mq` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `msg` varchar(102.

Spaceack的专栏 3394

Odoo 入门 | 什么是 Odoo?

Odoo是一套全球开源的ERP/CRM系统,最初的名字为TinyERP,08年5月之后称之为OpenERP,之后又改为Odoo。

洛阳泰山的博客 6207

unipush解决华为、小米、魅族收不到厂商推送的问题

保证厂商推送设置AppID,AppKey,AppSecret正确 在uniapp程序入口加入以下代码: var pinf = plus.push.getClientInfo(); var cid = pinf.clientid;//客户端标识 console.log('cid=='+cid) plus.push.addEventListener("receive", function(msg) { if ( ms

jinguo888的专栏 3761

【时空图神经网络 & 交通】相关模型3:STFGNN | 空间-时间依赖性 | 基于数据驱动的方法来生成“时间图” | 时空融合图模块,门控卷积模块 | 动态时间规整 | 顶会文章解析

STFGNN(时空融合图神经网络)在交通流量预测中的优势主要体现在以下几个方面:首先,它提出了一种数据驱动的方法生成“时间图”,弥补了传统空间图可能无法反映的某些相关性。其次,STFGNN通过并行处理不同时间段的空间图和时间图,有效地学习隐藏的时空依赖关系。此外,它将融合图模块与门控卷积模块整合到一个统一层中,通过层层堆叠处理长序列,进一步增强了模型的表达能力。实验结果表明,STFGNN在多个交通数据集上表现出色,优于其他基准方法,展示了其在实际应用中的强大潜力。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 383

让 VK31 的条件维护树长出你想要的分支:用 ABAP SE43 扩展定价 Area Menu COND_AV

摘要:本文深入解析了SAP系统中价格条件维护(VK31/VK32)的菜单结构优化方法。通过分析Area Menu(COND_AV)的三层架构(菜单对象、节点、报表),提出将业务语言融入菜单设计的解决方案。重点介绍了使用SE43事务码扩展标准菜单的具体步骤:创建Enhancement ID、新增业务节点、挂接定价报表,并强调需同步验证条件表映射关系。文章还提供了常见问题排查思路,建议从岗位视角重构菜单结构,最终实现高效、精准且符合业务语义的价格维护入口体系。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 87

HStreamDB vs 传统消息队列:为什么选择流数据库的终极指南

在当今数据驱动的时代,实时数据处理已经成为企业数字化转型的核心需求。对于新手和普通用户来说,选择合适的数据处理架构至关重要。HStreamDB作为一款开源的云原生流数据库,为物联网和实时应用提供了全新的解决方案,与传统消息队列相比具有显著优势。 ## 什么是HStreamDB?为什么需要流数据库? HStreamDB是一款专为实时数据流设计的云原生流数据库,它将消息队列、流处理和数据库的功能完

gitblog_00889的博客 1077

MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件

MIKE的模拟结果dfsu文件的数据是可以导出的,导出格式为xyz,我们也可以将其改后缀改为txt文本格式,其中包含了某一时刻下所有网格坐标点的数据。

晏长街的博客 4406

高并发系统设计十七-消息队列,如何降低消息队列系统中消息的延迟

消息队列,如何降低消息队列系统中消息的延迟 当项目中引入了消息队列时,增加了系统的复杂度。需要考虑如何保证消息不会丢失、如何避免消息重复带来的影响、还需要考虑消息延迟情况,即消费性能的问题。 场景:上游服务器产生订单数据,并将数据放入消息队列服务中,但是下游系统消费较慢,造成消息队列出现大量堆积。下游系统处理消息出现了延迟。 如何来解决这个问题呢? 监控消息的延迟 减少消息延迟的正确做法 1、如何监控消息延迟 监控消息的延迟有两种方式: 使用消息队列提供的工具,通过监控消息的堆积来完成监控 通过生成监

wmd看海的博客 948

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

消息队列

消息队列前言什么是消息队列为什么要使用消息队列通过异步处理提高系统性能降低系统耦合性利用消息队列实现事件驱动结构使用消息队列带来的问题 前言 “ActiveMQ?”“Kafka?”“RocketMQ?”“RabbitMQ?”…在日常学习与开发过程中,我们常常听到消息队列这个关键词。我也在多篇文章中提到了这个概念。可能你是熟练使用消息队列的老手,又或者你是不懂消息队列的新手,不论你了不了解消息队列,...

JustinNeil的博客 1408

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

21 利用分布式消息队列降低系统耦合性

经常听到各种场合中对扩展性和伸缩性的误用,包括许多资深网站架构师也常常混淆两者,用扩展性表示伸缩性。在此,我们澄清下这两个概念。指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。表现在系统 基础设施稳定不需要经常变更,应用之间较少依赖和耦合,对需求变更可以敏捷响应。它是系统架构设计层面的开闭原则(对扩展开放,对修改关闭),架构设计考虑未来功能 扩展,当系统增加新功能时,不需要对现有系统的结构和代码进行修改。指系统能够通过增加(减少)自身资源规模的方式增强(减少)自己计算处理事务的能力。

2501_90254378的博客 737

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

消息队列(MQ)

1)、中小型软件公司,建议选RabbitMQ因为erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便。正所谓,成也萧何,败也萧何!他的弊端也在这里,虽然RabbitMQ是开源的,然而国内有几个能定制化开发erlang的程序员呢?所幸,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要不考虑kafka的原因是,中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka排除。

m0_71086628的博客 2210

消息队列_消息队列(为什么要用消息队列,常见消息队列对比,JMS和AMQP谁更好用?)...

消息队列其实很简单“RabbitMQ?”“Kafka?”“RocketMQ?”…在日常学习与开发过程中,我们常常听到消息队列这个关键词。我也在我的多篇文章中提到了这个概念。可能你是熟练使用消息队列的老手,又或者你是不懂消息队列的新手,不论你了不了解消息队列,本文都将带你搞懂消息队列的一些基本理论。如果你是老手,你可能从本文学到你之前不曾注意的一些关于消息队列的重要概念,如果你是新手,相信本文将是你...

weixin_42187487的博客 358

21 利用分布式消息队列降低系统耦合性,java后端项目实战

开发低耦合系统是软件设计的终极目标之一,这一目标驱动着软件开发技术的创新 与发展,从软件与硬件的第一次分离到操作系统的诞生;从汇编语言到面向过程的开发语言,再到面向对象的编程语言;从各种软件工具集到各种开发框架;无不体现着降低 软件系统耦合性这一终极目标。可以说,度量一个开发框架、设计模式、编程语言优劣 的重要尺度就是衡量它是不是让软件开发过程和软件产品更加低耦合。 显而易见,低耦合的系统更容易扩展,低耦合的模块更容易复用,一个低耦合的系 统设计也会让开发过程和维护变得更加轻松和容易管理。一个复杂度为100

m0_63102494的博客 237

消息队列其实很简单

本文内容思维导图: 消息队列其实很简单 “RabbitMQ?”“Kafka?”“RocketMQ?”…在日常学习与开发过程中,我们常常听到消息队列这个关键词。我也在我的多篇文章中提到了这个概念。可能你是熟练使用消息队列的老手,又或者你是不懂消息队列的新手,不论你了不了解消息队列,本文都将带你搞懂消息队列的一些基本理论。如果你是老手,你可能从本文学到你之前不曾注意的一些关于消息队列的重要概念,如果你是新手,相信本文将是你打开消息队列大门的一板砖。 一 什么是消息队列 我们可以把消息队列比作是一个存放消息的容

吴朋个人博客 536

消息队列基础理论

RabbitMQ、Kafka、RocketMQ...在日常学习与开发过程中,我们常常听到消息队列这个关键词。 1、什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,Rab...

Lonely passerby 280

消息队列 面试题 整理

镜像集群模式:在镜像集群模式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。顺序消息的一种,正常情况下可以保证完全的顺序消息,但是一旦发生异常,Broker 宕机或重启,由于队列总数发生发化,消费者会触发负载均衡,而默认地负载均衡算法采取哈希取模平均,这样负载均衡分配到定位的队列会发化,使得队列可能分配到别的实例上,则会短暂地出现消息顺序不一致。

程序员小刘 2144

消息队列学习

消息队列的本质就是一种先进先出的数据结构 使用在分布式开发中,常见的应用场景:解耦、异步、削峰 1、为什么要使用消息队列? 解耦:开发中追求高内聚低耦合,系统的耦合度越高,容错率就越低。也就是一个系统中一个子系统出现了问题,会影响其他子系统 异步:如果用户对A系统发起请求后,A系统需要去调用BCD系统,如果A系统对用户的响应不需要BCD系统的返回数据,那么如果不适用MQ,A系统会依次请求BCD系统,直到全部请求完后,将数据返回个用户,如果使用MQ,A系统发送3条信息分别请求BCD系统并存储到MQ中,

Lucky_Qxk的博客 3133

隐藏在大象背后:利用Redis与Kafka降低系统复杂度的架构策略

在软件架构设计中,合理利用成熟技术组件是降低系统复杂度的核心思路。这一理念基于单一职责原则,通过将非核心功能委托给专业系统处理,使业务逻辑保持简洁。从技术价值看,这种策略能显著提升系统稳定性、加速开发进程并降低维护成本。在实际应用场景中,Redis作为高性能缓存可有效解决数据读取性能瓶颈,Kafka则提供了可靠的异步消息处理能力。本文聚焦的'隐藏在大象背后'架构策略,正是通过具体代码示例展示了如何将Redis缓存集成和Kafka消息队列等成熟组件优雅地融入企业级应用开发,帮助开发者在微服务架构中实现复杂度治

weixin_34049948的博客 422

消息队列的本质思考

消息队列的本质思考

daweias的博客 710
上一篇: 设计模式存在哪些关联关系,六种关系傻傻分不清--- UML图示详解
下一篇: 8┃音视频直播系统之 WebRTC 信令系统实现以及通讯核心并实现视频通话
pythonxxoo
博客等级 码龄5年 337粉丝 670原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值