消息中心设计

article/2025/9/1 12:59:18

1 参考文档

产品参考:消息通知系统设计 | 人人都是产品经理 (woshipm.com)

2 消息中心目标职责

  • 消息中心仅作为消息发送使用,跟业务没有任何关系,涉及到业务部分有业务系统自行处理;
  • 消息中心的功能只有消息生产、消息展示、消息推送、消息维护等相关功能;
  • 业务系统想要引用消息,需要先按照消息中心的统一规范注册,消息中心会按照消息类型判断是否需要扩展;

3 设计方案

3.1 方案1:提供sdk没有MQ

在这里插入图片描述

3.2 方案2:提供sdk,借助MQ

在这里插入图片描述

3.3 方案3:不提供sdk,借助MQ

在这里插入图片描述

3.4 比较

3.4.1 无sdk

优点:

  1. 业务系统无需集成sdk,跟消息中心完全解耦;
  2. 无需关注后续sdk升级等问题;
  3. 消息中心不可用时,不影响业务系统正常消息发送;

缺点:

  1. 使用成本高,新业务集成无法知道消息体包装是否正确,中间的调试排查成本高;
  2. 业务系统需要引入mq等配置信息和组件,增加了业务系统的复杂度;
  3. 不利于后期对mq的升级改造;

3.4.2 有sdk

优点:

  1. 集成成本低,只要按照sdk接口封装消息调用即可,便于新手集成以及调试;
  2. 业务系统无需关注消息处理方式,不需要引入mq组件;
  3. 消息中心统一选择mq组件,方便后期升级改造;

缺点:

  1. 业务方需要集成skd,跟消息中心耦合在一起;
  2. 业务系统需要维护sdk的版本;
  3. 消息中心服务不可用时,消息无法正常发送,造成消息丢失;

3.4.3 有mq

优点:

  1. 处理延迟消息时无需借助其他方案,比如定时器或者轮询;
  2. 削峰,有效保证消息中心能够始终稳定处理消息;
  3. 有效保证处理的顺序性;

缺点:

  1. 引入mq后,增加了复杂度;
  2. 需要保证mq的可用性;

3.4.4 无mq

优点:

  1. 降低了系统的复杂度;

缺点:

  1. 需要保证消息中心的并发、高可用等各种复杂场景;

3.5 结论

  • 消息中心1.0用方案1设计,等业务扩展后再用方案2模式;
  • 延迟消息推送可以借助mq来处理;

4 消息类型配置

消息中心设计

4.1 消息分类

说明:用于在消息中心里面展示的一级消息分类

  • 非空字段:类型名称、图标、删除标识、显示标识
  • 初始数据:未删除、不显示
  • 排序规则:降序

4.2 展示端

说明:定义不用的展示端用于区别每个展示端需要拉取什么样的消息分类,例如:企业端和专家端的消息一级分类就有区别

非空字段:端名称、端编码

4.3 展示端与消息分类

它们两为聚合关系非前绑定,又是多对多关系。所以这里引用关联表处理

5 业务系统使用-sdk方式

消息中心设计
消息中心设计

5.1 sdk方法

5.1.1 发送方式

  • 单个发送消息(可以考虑去掉)
  • 批量发送消息

5.1.2 撤回方式

  • 单个消息撤回(可以考虑去掉)
  • 批量消息撤回

5.1.3 发送形式

  • 短信
  • 站内信
  • 极光推送

5.2 消息内容

消息中心设计

名称类型是否必选备注
消息类型1:系统公告,2:政府公告,3:专家问答,4:暂定
发送人类型1:admin-user,2:government-user,3:user
发送人idid
发送人名称个人名称或者单位名称
发送时间为Null 则立即发送,传时间则按时间发送
接收人idid
接收人手机号手机号
消息标题
消息体100个字符
消息图片
触发渠道Null 则默认站内信,1:站内信,2:短信,3:电话,4:其他
操作反馈类型1:无,2:详情,3:站内跳转,4:外链
操作反馈内容无:不跳转,详情:id,站内跳转:请求连接,外链:对应的外链连接
重要性Null则默认为1,1:低(未读显示点),2:中(未读显示数字),3:高

6 消息处理

6.1 数据表字典

在这里插入图片描述
在这里插入图片描述

6.2 核心功能

6.2.1 1.0 直接落库

消息中心设计
延迟推送消息借助mq处理

6.2.2 2.0 借助MQ处理

消息生产

统一接收业务系统推送过来的消息,并全部往mq服务中push,考虑到后期并发等问题这里不做落库处理;

  • 短信
  • 极光推送
  • 站内的

消息发送流程:
消息中心设计

消息消费

统一从mq中pull消息并进行计算,落库处理

备注:

考下延迟消息处理方案:轮询,再往mq发送延迟消息

落库计算和发送渠道是2部分

  • 短信

    在这里插入图片描述

  • 极光推送

    在这里插入图片描述

  • 站内
    在这里插入图片描述

7 消息管理

消息类型列表接口

根据端标识来展示消息类型列表

列表中要包含:类型信息+最新消息+未读数量

消息类型下消息列表分页接口

查询消息类型下的所有消息,需要分页展示、排序

未读数量接口-总合计

查询用户所有未读的消息合计

已读接口

修改消息阅读状态

删除接口

消息逻辑删除

总结

每种方案都有特殊场景需要,具体选择哪种还要看当前项目实际场景来;
如果是着急用消息中心,并发量和处理能力没有要求,则可以选择方案1有开发周期短,接入成本低优势;
如果业务对消息中心要求高,承载的责任大,并发量大等场景,则选择用方案2,借助MQ来处理;
如果还有一些复杂的场景,或者老项目使用,老项目又无法集成当前消息中心的sdk,则直接考虑用方案3;

我在使用时,是先通过方案1实现了消息中心的基本功能,确保当前消息中心承载着应有的功能职责。随着业务系统的发展和消息发送量的增加通过方案2对消息中心进行升级,不影响sdk的正常使用,所以说是一个迭代的过程。

最后感悟一下:所有的设计一定要根据公司和当前项目状况,你的设计很可能非常完美,但是不一定符合公司当前现状。


http://chatgpt.dhexx.cn/article/8iqj3ZjT.shtml

相关文章

如何设计一个消息中心

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

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

厌烦被消息打扰,又怕突然间的安静; 一、业务背景 微服务的架构体系中,会存在很多基础服务,提供一些大部分服务都可能需要的能力,比如文件管理、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 数组名 【常量表达式】 …

Stata:嵌套Logit模型(NestedLogit)

原文链接&#xff1a;https://www.lianxh.cn/news/d5e00bfb17a7c.html 致谢&#xff1a; 这篇推文的核心内容主要来自陈强老师编著的《高级计量经济学及 Stata 应用》一书&#xff0c;特此致谢。 1. 简介 此前&#xff0c;连享会发布了一系列离散选择模型相关的推文&#xff0…

MNL——多项Logit模型学习笔记(二)

本节将会通过案例举例&#xff0c;介绍Logit模型的建模思路和过程 内容为摘抄他人学习资料的个人学习笔记&#xff0c;如有侵权则删 1.正确打开/解读Logit模型系数的方式 本节的具体内容在笔记里不详细表示了&#xff0c;大家在软件里拟合Logit模型时&#xff0c;对于其中的参…

logit回归模型的参数估计过程_【DCM07】Random Parameter(随机参数)Logit模型及其Nlogit实现...

本文是离散选择模型系列的第7篇原创文章,将详细介绍随机参数Logit模型,并利用Nlogit软件进行实操演示。【关注本公众号,可以获取数据和代码】本文公式较多,建议电脑端享用。 目录 1、随机参数Logit模型介绍 2、数据描述 3、随机参数Logit模型的参数估计 1 随机参数Logit模型…

MNL——多项Logit模型学习笔记(三)二项Logit模型、Gumble分布以及Logistic分布

上一节最后一部分&#xff0c;介绍了Provit模型&#xff0c;从建模的角度来说&#xff0c;Probit模型假设随机项服从正态分布&#xff0c;这是具有一定的合理性的——也是其优点&#xff1b;但是Probit模型没有闭合解——每次算P(n)i 的值的时候都需要求积分&#xff0c;这就给…

模型与logit_互助问答第33期:条件logit模型相关问题

问题: 尊敬的老师,您好!我最近在做一个条件logit模型的实证研究,因为是非线性的二元响应模型,查了很久的文献和Stata资料也没找到检查这类模型异方差的方法以及处理异方差的办法,请您们帮忙分析下,谢谢!如果可以的话,希望您能给出Stata命令,再次感谢! 答案: 第一,…

logit模型应用实例_互助问答第240期:面板Logit模型

您好老师,我是暨南大学国际商务专业的一名应届毕业生,有一个问题思考了很久都没办法解决,所以想要向你们求助。具体情况如下:我的论文采用的是面板logit模型,在判断使用固定效应和随机效应的过程中,我分别用命令xtlogit y x1 x2 x3,fe和xtlogit y x1 x2 x3,re得到了固定…