消息通知模块的设计原理

news2024/11/18 7:30:44

目录

介绍

一、数据库设计

公告消息记录应该全局唯一,还是为每个用户创建一条公告消息? 

用MongoDB存储消息数据 

1. 搞冷热数据分离,热数据定期归档

2. 冷数据存储一段时间后就销毁,释放存储空间 

二、系统消息的发送与收取

三、业务说明

1. 系统登录 

2. 首页定时轮询

3. 修改用户资料 


介绍

        Kafka快,RabbitMQ也不慢,即支持同步收发消息,又支持异步收发消息。队列有五种模式,功能上强于Kafka。综合考虑选择RabbitMQ。

一、数据库设计

        很多人以为消息模块的数据表设计起来很简单,创建一个 消息表 就可以存储系统消息了,我只能说,你把问题想简单了。 

公告消息记录应该全局唯一,还是为每个用户创建一条公告消息? 

        这个问题取决于你是怎么理解系统消息的,如果你不希望系统记录用户是否阅读了某条消息,哪些消息是未读消息,那么一个公告消息在数据表中就是一条唯一的记录,存储起来非常节省空间。但是很少有系统会这么设计,如果系统消息很多,又不告诉用户哪些是已读消息,哪些是未读消息,造成用户体验非常不好。所以系统必须要记录下来,用户阅读了哪些消息,还有哪些消息是未读的。 

        如果一个电商系统有800万注册用户,那么系统发出一条公告消息之后,意味着要在消息表中插入800万条消息记录,每条记录是发给某位用户的公告消息。瞬间数据库的负载达到顶峰,数据库被大量的写入操作占用,导致电商系统正常的业务无法展开。请记住,一条公告消息就能让电商系统濒临崩溃。微信有11亿的日活用户,如果微信给所有用户发出一条公告消息,岂不是微信的服务器就挂了?看来消息模块的数据库架构确实有技术含量。 

 

用MongoDB存储消息数据 

        因为消息模块的要存储的数据量太大,普通MySQL单表超过2000万记录,MySQL数据库就难以支撑,所以我们要换能存储海量数据的数据库产品,于是MongoDB数据库就进入到我的视线里。MongoDB适合存储海量低价值的数据,正好符合消息模块的存储要求。 

        即便MongoDB能存储TB级别的数据,但是消息数据日积月累,MongoDB也会有撑不下来的时候,那该怎么办呢? 

1. 搞冷热数据分离,热数据定期归档

 

        根据数据被使用的频率,可以划分成热数据和冷数据。一年内的数据被看做是热数据,超过一年的数据被当做冷数据。我们编写定时程序,每天凌晨的时候把冷数据从MongoDB_1,转移到另一个MongoDB_2。这样MongoDB_1的数据量减小了,所以CRUD的速度变快了。MongoDB_2存放的是冷数据,即便数据量很大,但是冷数据很少被用到,所以MongoDB_2仅仅充当归档库而已。

2. 冷数据存储一段时间后就销毁,释放存储空间 

        归档库存储的冷数据太多,也难免出现崩溃,所以我们可以定期的删除超期的冷数据。假设五年以上的冷数据就被当成是超期数据,删除超期数据之后,归档库的空间也就腾出来了。

二、系统消息的发送与收取

        刚才说到了,用MongoDB存储消息数据,但是一个大型Web系统,发送一条公告消息要往数据库里面写入大量的数据,即便MongoDB也支撑不下来瞬时写入百万、千万记录的情况,那该怎么办呢?我们可以把海量写入数据写入,变成细水长流,慢慢写入到MongoDB中。 

 

        比如说我们可以引入消息队列MQ,然后在Java后端系统上面,用异步多线程的方法,向消息队列MQ中发送消息,这样Web系统发布公告消息的时候就不占用数据库正常的CRUD操作。

 

        系统消息保存在消息队列中,我们只是用它来做削峰填谷,系统消息最终还是要存储在数据库上面。于是我们可以这样设计,在用户登陆系统的时候,用异步线程从消息队列MQ中,接收该用户的系统消息,然后把系统消息存储在数据库中,最后消息队列MQ中的该条消息自动删除。你看,这么设计之后,所有用户不可能同时登陆Web系统,所以我们就把往数据库中写入系统消息的任务,变成了错峰写入,这种设计非常巧妙是吧。

三、业务说明

        Emos系统中有很多模块都用到了消息模块,我们来看看具体都有哪些业务需要消息模块。 

1. 系统登录 

 

        用户登陆系统的时候,后端Emos系统要创建异步线程,接收消息队列MQ中的消息,然后把消息写到数据库里面。 

2. 首页定时轮询

        大家需要注意,新接收的消息并不等于未读消息。比如上面的截图1,首页显示新接收到1条消息,但是总共的未读消息总共有3条。在数据库中的消息记录里面,我会用 readFlag 和lastFlag 分表标记 未读消息 和 新接收消息 。

 

        Emos小程序的index页面设有定时器,每5分钟发送一次轮询,查询接收到多少条新消息。MessageTask利用异步线程接收MQ中的消息,然后保存到message_ref集合中,并且设置新消息的lastFlag字段为true。 

        Service把message_ref中的某人所有的消息记录的lastFlag字段设置成false,返回的修改记录条数就相当于接收到了多少条新消息,这个结果要返回给小程序的。 

3. 修改用户资料 

        我们修改用户资料之后,Emos系统会自动向该员工发送消息通知。但是消息通知并不直接写入到MongoDB,而是写到MQ消息队列,然后在首页轮询的时候提示用户有新的系统消息。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

肺癌的成因

中国医师协会 2023 年呼吸医师年会暨第二十二届中国呼吸医师论坛(CACP 2023)于 2023 年 6 月 15-18 日在大连如期举行。肺癌是我国目前发病率和死亡率最高的癌症,它的早期筛查和诊断十分关键。 丁香园呼吸时间特邀四川大学华西医院院长、呼吸…

软件测试报告办理解决方案分享,为什么要选择CMA认证或CNAS认可测试报告?

在进行软件测试时,合格的测试报告对于软件产品的质量保障至关重要。那么软件测试报告又该如何办理呢?软件企业为什么要选择CMA认证或CNAS认可的测试报告呢?因为CMA认证的测试报告和CNAS认可的测试报告都具有不可忽视的好处。 一、软件测试报告办理解决方案 1. 测…

我蒙了面试官一上来就说:请你介绍一下你测试过的项目

测试人员在找工作中,基本都会碰到让介绍项目的这种面试题,如何正确介绍自己的项目?需要做哪些技术准备? 今天这篇文章,围绕这些问题,跟大家一起聊一聊。 关于介绍自己的项目? 可以从以下几个方面…

赛效:如何将PDF文件分割成单页的PDF文档

1:打开wdashi点击PDF处理菜单里的“PDF分割”。 2:将本地PDF文件添加上去,在下方选择转换页码,在这里我们选择转换每一页。 3:点击右下角“开始转换”。 4:转换好后,点击绿色下载按钮将分割好的…

七、Docker安装MySQL/Tomcat/Redis等

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、安装步骤二、Docker安装Tomcat2.1 搜索镜像2.2 拉取镜像2.3 查看镜像2.4 启动镜像(端口映射)2.5 停止容器2.6 移除容器 三、Docker安装MySQL…

23年下半年软考软件测评师难考吗?最近考虑要不要考?

软考中级难度是适中的,可以考啊! 因为当代随着各种应用技术层出不穷,随着社会发展,需要大量的软件人才支持,同时软件的更新速度越来越快,市场竞争极其激烈。相关国际认证有微软的,Orical&#…

新西兰访问学者签证申请注意事项

新西兰是一个美丽而富有文化多样性的国家,许多学者都梦想着前往这里进行学术交流和研究。如果你计划申请新西兰的访问学者签证,以下是知识人网小编整理的一些你需要注意的事项: 1. 确认申请资格:在开始申请之前,确保你…

旧手机不要轻易扔掉,将其设置为无线网卡,不消耗流量

如果你有一部旧手机正在闲置着,或者正考虑要将其丢弃,那么请暂停一下。因为这个旧手机可以成为你的无线网卡,帮助你在家中或出行时实现更快的网络下载速度,而且毫不费流量。接下来,我将告诉你如何将旧手机变成无线网卡…

安装 Prometheus 指标存储 观测 dubbo /windows_exporter指标 windows 版本 其他系统换个语法思路一样

目录 下载 Prometheus 访问Prometheus Targets 发现服务 对应的 dubbo 指标就出来了 Dubbo脚手架生成个最简单的项目 导入 Prometheus 相关包 或者使用这个包即可 启动后就自动上报指标了 Windows_exporter or node_exporter 端口 9182 Prometheus 配置 windows_exp…

基于SpringBoot+vue的旧物置换网站设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【产品应用】一体化步进电机在全自动纸张分切机的应用

全自动纸张分切机是现代印刷业中的重要设备之一,它能够将大的纸张切割成相同大小的小纸张,并具有高精度、高速度和高效率等优点。一体化步进电机作为全自动纸张分切机的重要部件,其应用对于提高设备的性能和稳定性具有重要意义。 01.设备简介…

【Java.SE】数组的练习

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用&…

Servlet从入门到精通

概述: Servlet(Server Applet)是Java Server的简称,称为小服务程序或服务网连接器,用Java编写的服务器端服务,具有独立于平台和协议的特性,主要功能在于交互式的浏览和生成数据,生成…

【Linux】线程同步(互斥锁和读写锁)

概念 线程同步是指多个线程之间协调和管理彼此的执行顺序,以避免竞态条件和不确定的结果。线程同步的目的是确保共享资源的正确访问和保护临界区的完整性。 作用 避免竞态条件:当多个线程同时访问和修改共享资源时,可能会导致竞态条件的发生…

初创企业办公室租赁现状

概述: 随着创业生态的不断发展,越来越多的初创企业开始涌现。租赁办公室是初创企业成立和运营的必要条件之一,然而,由于各种原因,租赁办公室对于初创企业来说仍然存在一些挑战和难点。本文将探讨初创企业租赁办公室的…

功能测试的技术

目录 前言: 1) 基于最终用户/系统测试 2) 等价测试 3) 边界值测试 4) 基于决策的测试 5) 备用流量测试 6) 临时测试 前言: 功能测试是软件测试中最常见的一种测试类型,它旨在验证系统的功能是否符合设计要求和预期行为。在进行功能测…

a==1a==2a==3 与 a===1a===2a===3如何实现?

前言 首先,我们来看个demo let a {value: 1,toString() {// console.log("toString")return this.value;} }看一下输出结果: console.log(a 1 && a 2 && a 3) // falseconsole.log(a 1 && a 2 && a …

PHP 旅游信息管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 旅游信息管理系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为PHP APACHE,数据库 为mysql5.0,使用php语言开发。 …

nerf-studio初体验

前言 整个安装过程非常简单,运行得也很丝滑,最大的难点在于中文资料太少,英文看得头痛。本文也是参考了许多链接,有些链接比我写得详细多了,各位选择性看吧 安装 安装过程参考github链接,按顺序一步一步…

使用 ZBrush 和 Substance 3D中创建逼真的露西(p2)

今天瑞云渲染小编给带来了Rafael Benedicto 分享的 Lucy 项目背后工作流程,解释了头发是如何设置的,并回顾了在 Substance 3D Painter 中完成的纹理化过程。篇幅较长,分上下两篇来阐述幕后花絮。接下来接着讲述Lucy项目的纹理和渲染方面内容。…