目录
随着公司发展,消息量和推送渠道越来越多,需要有一个对各类消息进行统一发送处理的平台。有利于对功能的收拢,以及提高业务需求开发的效率。
整体架构
消息流转流程介绍
发送方将消息内容和消息对象发送到媒介方,媒介方通过消息策略触达消息,最终产生回执到发送方。
消息中台业务能力
消息清洗:清洗特殊词、敏感词以及潜在的威胁词句
消息过滤:过来不符合规则的消息 例如:内容为空或格式不正确
消息组装:根据消息模板组装消息体
消息去重:与历史同类型消息对撞,去掉重复发送的消息
消息分发:根据消息接收方及发送方式,将消息正确送到正确渠道
消息管理:提供消息撤回、消息重发、消息合并以及消息模板维护功能
消息统计:统计各维度消息,并衍生出更多有价值数据,比如通道覆盖率、折损分析 、发送趋势、点击率等等
智能处理:根据各消息类型及行为,生成智能处理策略(组装、发送、运维),简化处理流程
消息发送方式
没有消息模板时,存储消息内容及对象后,依照发送策略直接发送。
有消息模板时,根据消息模板生成发送对象。
消息模板创建方式有两种:
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 | 未读数 |