消息平台设计

  • Post author:
  • Post category:其他



目录


整体架构


消息流转流程介绍


消息中台业务能力


消息发送方式


消息发送策略


1.0版本设计


消息流程


发送/存储消息


更新消息已读/未读


拉取消息


消息存储策略


关系型模型设计


用户表 user


用户组表group


模板表template


策略表strategy


消息统计表 msg_stat


参数模型设计


发送消息


拉取消息


更新消息已读/未读


查询消息数量


随着公司发展,消息量和推送渠道越来越多,需要有一个对各类消息进行统一发送处理的平台。有利于对功能的收拢,以及提高业务需求开发的效率。

整体架构

消息流转流程介绍

发送方将消息内容和消息对象发送到媒介方,媒介方通过消息策略触达消息,最终产生回执到发送方。

消息中台业务能力

消息清洗:清洗特殊词、敏感词以及潜在的威胁词句

消息过滤:过来不符合规则的消息 例如:内容为空或格式不正确

消息组装:根据消息模板组装消息体

消息去重:与历史同类型消息对撞,去掉重复发送的消息

消息分发:根据消息接收方及发送方式,将消息正确送到正确渠道

消息管理:提供消息撤回、消息重发、消息合并以及消息模板维护功能

消息统计:统计各维度消息,并衍生出更多有价值数据,比如通道覆盖率、折损分析 、发送趋势、点击率等等

智能处理:根据各消息类型及行为,生成智能处理策略(组装、发送、运维),简化处理流程

消息发送方式

没有消息模板时,存储消息内容及对象后,依照发送策略直接发送。

有消息模板时,根据消息模板生成发送对象。

消息模板创建方式有两种:

1、在管理后台配置

2、在第一次发送该消息时根据消息渠道、消息内容以及消息对象自动生成消息模板,下次发送同类型消息直接使用已创建的消息模板发送

消息发送策略

即时发送、定时发送、定速发送(例如:每秒推送条数)、并发发送(同时发送给多渠道)、补发消息(未送达补发/未点击补发)

1.0版本设计

目标:可以支持大部分消息发送场景,支持大部分数据查询场景

消息流程

发送/存储消息

更新消息已读/未读

拉取消息

消息存储策略

存储工具:mongo

大前提:按业务类型分表存储,各业务类型根据业务场景建立查询索引

存储结构:

字段名 类型 可以为空 备注
msgId Long N 消息编号(雪花算法或递增生成)
userId Long N 用户编号
groupId Long N 分组编号
bizCode int N 业务类型
templateId Long Y 模板编号
status int N 消息状态(0-初始待处理/1-处理中/2-组装待发送/3-发送成功/4-发送失败)
fail_reason String Y 失败原因
read int N 已读/未读(0-未读 1-已读)
content String N

发送的消息

消息json对象 jsonObject Y 消息内容解析的jsonObject

关系型模型设计

用户表 user

字段名 类型 可以为空 备注
Id bigInt N 用户编号
enable tinyint N 是否可用
contact json Y

联系方式

{

“email”:xxx,

“wechat”:xxx,

“alipay”:xxx,

“wecom”:xxx,

“dingTalk”:xxx,

“mobile”:xxx

}

created_date dateTime N 创建时间
last_modified_date dateTime N 最后更新时间

用户组表group

字段名 类型 可以为空 备注
Id bigInt N 组编号
name varchar Y 组名称
biz_code tinyint N 业务类型
user_id Long N 用户编号
enable tinyint N 是否可用
created_date dateTime N 创建时间
last_modified_date dateTime N 最后更新时间

模板表template

字段名 类型 可以为空 备注
Id bigInt N 模板编号
name varchar Y 模板名称
biz_code tinyint N 业务类型
strategy_id bigInt Y 发送策略编号
channel varchar N 发送渠道(默认只存储不发送)
content varchar Y 消息内容 占位符用{$var}表示
enable tinyint N 是否可用
created_date dateTime N 创建时间
last_modified_date dateTime N 最后更新时间

策略表strategy

字段名 类型 可以为空 备注
Id bigInt N 策略编号
name varchar Y 策略名称
biz_code tinyint N 业务类型
type tinyint N

策略类型

1-即时发送、2-定时间隔发送、4-定时时间发送 8-定速发送(例如:每秒推送条数)

组合策略:发送策略之和

detail json Y

策略详情(json形式存储发送详情)

即时发送 detail 为空

定时间隔

间隔(S){“interval”:20}

定时时间(每日固定时间发送精确到分钟):{“time”:”10:10″}

定速发送为每秒/没分/每时发送条数 如10条每秒 {“times”:10/S}

组合策略是多个策略组合 如:定时间隔发送+定时时间发送{“interval”:20,”time”:”10:10″}

enable tinyint N 是否可用
created_date dateTime N 创建时间
last_modified_date dateTime N 最后更新时间

消息统计表 msg_stat

字段名 类型 可以为空 备注
userId bigInt N 用户编号
biz_code tinyint N 业务类型
sum bigInt N 消息总数
read bigInt N 已读数
unread bigInt N 未读数
success bigInt N 成功数
fail bigInt N 失败数
created_date dateTime N 创建时间
last_modified_date dateTime N 最后更新时间

参数模型设计

发送消息

sendRequest

字段名 类型 可以为空 备注
userIds List<Long> Y 用户编号
groupIds List<Long> Y 分组编号
bizCode int N 业务类型
templateId Long Y 模板编号(模板编号为空只存储不发送)
content String N

消息内容

模板id为空传最终发送消息内容

模板id不为空传占位符json 注:占位符不可与字段名重复

说明:


用户编号和分组编号都没有值时,发送业务类型下所有用户


用户编号和分组编号都有值时,使用分组编号

sendResponse

字段名 类型 可以为空 备注
success Boolean Y 成功

拉取消息

pullRequest

字段名 类型 可以为空 备注
userIds List<Long> Y 用户编号
groupIds List<Long> Y 分组编号
bizCode int N 业务类型
templateId Long Y 模板编号
read boolean Y 已读/未读
condition String Y

查询条件(sql String)

scrollId Long Y

第一页查询不需要传

size Long Y 每次拉取数量(默认50,最大1000)


pullResponse

字段名 类型 可以为空 备注
contents List<msg> Y

消息集合

scrollId Long Y

滚动查询编号,继续查询下一页需要带上

msg

字段名 类型 可以为空 备注
msgId Long N

消息编号

content String N

消息内容

status int N 消息状态
read boolean N 已读/未读

更新消息已读/未读

updateRequest

字段名 类型 可以为空 备注
msgId Long N

消息编号

bizCode int N 业务类型
read boolean N 已读/未读

updateResponse

字段名 类型 可以为空 备注
success Boolean Y 成功

查询消息数量

queryCountRequest

字段名 类型 可以为空 备注
userId Long Y 用户编号
groupId Long Y 分组编号
bizCode int N 业务类型
read boolean Y 已读/未读

queryCountResponse

字段名 类型 可以为空 备注
sum Long Y 消息总数
read Long Y 已读数
unread Long Y 未读数



版权声明:本文为wang92424原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。