仿微博消息中心的系统设计与实现

article/2025/9/1 12:57:16

最近在实现一个类似于微博、网易云的消息中心模块。主要实现的功能是,将系统中的点赞、评论、@等消息做汇合。今天跟大家分享下,我们的设计和实现思路。

首先说明,我们目前是微服务的架构。所以本篇文章中对于消息中心的设计也是建立在微服务的基础上,消息中心与其他模块是互相独立的。

分析需求后,我们能会发现消息中心的角色如下图(以点赞消息为例):
在这里插入图片描述

针对需求,我们有如下两种存储方案。

方案一:

消息表:message。字段如下:
user_id【消息归属用户】,sender_id【发送消息的用户】,src_type【消息对应的内容来源】,src_id【帖子id】,action【动作】,content_json【内容】,create_time【消息创建时间】

字段说明:

src_type 与 src_id 主要用来标识该笔消息的来源,点击进入详情的时候需要用到。

action 字段主要用于存储操作的类型,用于区分该消息是点赞还是评论还是其他类型。

content_json 字段用来存储该笔消息展示时需要的所有内容,其中需要包括帖子内容,帖子图片,帖子创建者等等信息。

方案二:

消息表:message。字段如下:

user_id【消息归属用户】,sender_id【发送信息的用户】,src_type【消息对应的来源】,src_id【帖子id】,action【动作】,action_id【动作id】,create_time【消息创建时间】

action_id 字段主要用来查找动作的内容。当动作是点赞或评论时,不需要存该字段。当动作是评论时,通过该字段可以到消息内容表中取值。

消息内容表:message_content,字段如下:

src_type【内容来源:帖子,评论等】,src_id【内容id】,content【内容】,status【内容状态】

有人可能会奇怪,为何需要 message_content 表?其实一开始我们就有提到过,我们是微服务的架构。消息中心与其他模块是相互独立的,所以消息中心不会去各模块取值,也不应该去各模块取值,它是一个相对独立的模块。所以就需要有一个内容库去存储我们系统中的内容。方案一中的 content_json 字段,之所以需要存这么多的内容,也是同理。

接下来我们看一下两个方案的对比情况。

方案一:

优势:1.拓展性高,无论何种消息都可以扔进 message 表里 2.与其他项目的耦合度低
劣势:1.更新动作复杂 2.冗余数据较多

方案二:

优势:1.更新动作简单 2.与其他项目的耦合度低
劣势:1.拓展性较低,对存入 message_content 表中的内容,有格式要求

综合实际的业务需求,建议大家使用方案二。因为在实际场景中,我们删除帖子或删除评论等操作,都需要影响到消息中的内容状态。方案二在更新内容上具有绝对优势。假如使用方案一,更新消息内容会是一件相当头疼的事情。

如果大家有疑问或有更好的建议,欢迎讨论~


http://chatgpt.dhexx.cn/article/UcuHyBXr.shtml

相关文章

消息中心构架设计说明书

目录 1 1. 文档介绍.... 4 1.1 文档目的... 4 1.2 文档范围... 4 1.3 读者对象... 4 1.4 参考文献... 4 1.5 术语与缩写解释... 4 2 系统概述.... 5 3 设计约束.... 6 4 设计策略.... 7 5 系统总体结构.... 8 6 …

04_消息中心(MessageCenter)

一介绍 该消息中心是基于委托和事件(观察者模式)设计的,是 MxFramework框架 的一个子模块。 主要是为了处理消息的收发。 二、消息处理中心(代码如下) /**** * Title: MXFramework* 主题: 消息中心* …

实际项目中的消息中心

前一篇文章讲到我们项目的工作流,这一篇我们扒一扒项目中的消息中心,msgcenter。消息可以分成很多种消息:留存可重复查看的DB消息,短暂保存在redis的comet消息,短信形式的msg消息,推送到手机的push消息等等…

消息中心

1 系统结构 消息中心体系结构如下图所示: 图中红色线表示移动消息的推送路径。 此结构适用于企业消息中心,也适用于平台,消息推送代理的消息推送服务接口(Web Service)可以作为开放服务。 本地服务器是消息源。…

消息中心(系统消息)实现

需求 用户能即时的收到来自系统或者其他用户发来的消息,在web界面右下角弹窗提醒,用户还能标记消息是否已阅状态。 即时通讯 概念:即时通讯(实时通信,Instant Messaging,简称IM)是一个实时通…

消息中心设计

1 参考文档 产品参考:消息通知系统设计 | 人人都是产品经理 (woshipm.com) 2 消息中心目标职责 消息中心仅作为消息发送使用,跟业务没有任何关系,涉及到业务部分有业务系统自行处理;消息中心的功能只有消息生产、消息展示、消息推…

如何设计一个消息中心

如今的内容型产品,不管提供的是什么类型的内容,在其主功能之外,不可避免的会有另一个十分重要的功能——消息中心。 而无论是信息流、论坛、信箱,还是私聊、群聊、通知,推拉模型是内容型(包括:社…

聊聊消息中心的设计与实现逻辑

厌烦被消息打扰,又怕突然间的安静; 一、业务背景 微服务的架构体系中,会存在很多基础服务,提供一些大部分服务都可能需要的能力,比如文件管理、MQ队列、缓存机制、消息中心等等,这些服务需要提供各种可以复…

4. 消息中心的设计与实现

消息中心的设计与实现 一、引言 运用场景: 1、消息的主动提醒(客户端被动接收) 2、客户模块(及时通讯) 3、单一登录(一个账号只能在一个设备登录) 消息中心的实现方案: 1、客户端轮…

mysql格式化数字去掉千分位

前言 使用format格式化数字时,超过1000就会有千分位,但有时我们不希望有这个千分位,那怎么去掉呢? 1. select format(11111.123,2) 2. select convert(11111.123,decimal(12,2))

upper mysql_MySQL函数

MySQL函数 Lower 转换小写 upper 转换大写 substr 取子串(substr(被截取的字符串,起始下标,截取的长度)) length 取长度 trim 去空格 str_to_date 将字符串转换成日期 date_format 格式化日期 format 设置千分位 round 四舍五入 rand() 生成随机数 Ifnull 可以将null转换成一个…

MySql FORMAT 去掉千位分隔符,

加上墨西哥的地区参数即可 SELECT FORMAT(35555566.8, 2, es_MX) AS value; 结果

MySQL知识总结

目录 知识点条件查询排序常见单行处理函数(可嵌套)多行处理函数分组查询distinct去重 连接查询⭐⭐⭐⭐⭐内连接外连接多表连接(两张表以上) 子查询where子句中的子查询from 子句中的子查询select后面出现的子查询 union合并查询结…

MySQL知识点

总结汇总MySQL数据库面试题(2020最新版)_ThinkWon的博客-CSDN博客_mysql数据库面试题 1. 索引 (1)主键索引 唯一非空,属于聚簇索引 (2)唯一索引 unique 可为空(多个null也可) (3&…

mysql 处理金额_MYSQL处理金额相关函数

1.FORMAT()数字千分位分割 FORMAT(X,D) 1.X需要格式化的数字 2.D保留小数位数 例:SELECT FORMAT(12334555.213,2) 2.ABS() 求绝对值 ABS(X) SELECT ABS(-23); SELECT ABS(21-23); SELECT ABS(23); 3.四舍五入保留小数 ROUND(X,D) 1.X需要格式化的数字 2.D保留小数位数(不写时默…

C语言字符数组的输入和输出

字符数组的输入输出有两种方法&#xff1a; &#xff08;1&#xff09;逐个字符输入输出。用格式符“%c”输入或输出一个字符。例如 int main() {char c[6]; //定义一个字符串for (int i 0; i < 5; i){scanf("%c", &c[i]); //输入字符串}for (int i 0; …

C语言 | 字符数组

C语言字符数组的定义 字符数组是用来存放字符数据的数组&#xff0c;字符数组中的一个元素存放一个字符&#xff0c;定义字符数组的方法和定义数值型数组的方法类似。 //例子&#xff1a;char character[10];C语言字符数组的初始化 C语言对字符数组初始化&#xff0c;最容易理解…

C语言,字符数组与字符串

文章目录 字符数组基本介绍字符串注意事项字符串的访问和遍历字符串的表示形式用字符数组存放一个字符串&#xff1a; 用字符数组存放一个字符串,用字符指针指向一个字符串使用字符指针变量和字符数组两种方法表示字符串的讨论 字符串相关函数常用字符串函数一览字符串函数应用…

浅谈字符数组

文章目录 一、什么是字符数组二、字符数组的定义和赋值1. 先定义一个数组&#xff0c;再为挨个元素进行赋值2. 在定义的同时给该字符数组进行初始化2.1 错误的初始化方式2.2 正确的初始化方式 3. 特别注意&#xff01;&#xff01;&#xff01;3.1 字符数组和整型数组一样不支持…

字符数组

字符数组 用来存放字符数据的数组是字符数组。字符数组中的每一个元素存放一个字符&#xff0c;其定义和使用方法与其他类型的数据基本相似。 1.1字符数组的定义和使用 字符数组的定义与其他类型的数组类似&#xff0c;标准形式如下&#xff1a; Char 数组名 【常量表达式】 …