一、功能概述
1.不同的系统的消息,管理后台,小程序(B/C),微信公众号,短信,邮件等
2.不同业务的消息,充值,提现到账,系统更新,公告等
3.消息的明细,标题,简述,详情,已读未读状态
4.有效时间,失效时间
5.支持界面的接下来操作,跳转按钮
6.语音消息,图片消息,富文本消息
二、设计方案
- 需要考虑三类应用场景
– 1 私有信息,需要告知多个服务平台,需要用一MQ进行解耦
– 2 私有信息,不需要告知多个服务平台,直接调用
– 3 公开信息,一份信息广播给大部分,所有用户时,比如网站公告,banner,活动,系统更新等信息,需要用到MQ及时更新缓存 - 特殊说明
需要考虑做成一个组件,各个应用需要使用时调用即可 - 2.1 用户提现业务时序图-私有信息,需要用到MQ进行解耦类
- 主要思想 利用MQ进行解耦
- 注意事项
因为涉及到资金相关,生产者需要保证消息至少一次成功,所以要有重试逻辑;消费者需要考虑因为重试导致的多次消费问题,所以需要加幂等处理,幂等可以使用redis去做
用户提现业务时序图 - 2.2 员工申请加入企业业务时序图——私有信息直接获取类
- 2.3 系统类公告信息业务时序图——公开信息需本地缓存类
- 主要思想
公共信息的获取主要特性是有大量用户获取的数据是同一份数据,比如网站公告、banner、活动
那么如果每次都从数据库拿,势必会对数据库造成很多流量,再加上这类数据一般修改不频繁,所以放在最外层的服务缓存
当有修改时,MQ通知出去
系统类公告信息业务时序图
三、数据库设计
- 3.1私有消息通知模板表(msg_notify_private_template)
消息通知模板主要是方便在发送通知时可以灵活使用模板,模板主要包括:
【腾讯】您充值的 ${amount} 元已经到账,请及时查看。
【腾讯】您已从${company}公司成功提现${amount}元。
【腾讯】您的KYC认证申请,审核失败,请重新上传身份认证信息。
【腾讯】您的KYC认证申请,已通过审核。
【腾讯】您申请加入${company}公司失败,请登录网站重新申请。
【腾讯】您申请加入${company}公司审核通过。
【腾讯】您的账号【${account}】在【${time}】使用了新的 IP地址【${unusualIp}】登录了腾讯后台管理系统,请确认这是您本人的操作。
【腾讯】尊敬的用户,您已成功注册腾讯。
【腾讯】您的验证码为${code},30分钟内有效,请勿将验证码告诉他人。若非本人操作,请忽略此信息。感谢您的支持与信任。
字段名 |
类型 |
允许空 |
字段说明 |
示例 |
---|---|---|---|---|
id |
bigint(20) |
no |
主键 |
1 |
notify_channel |
varchar(30) |
no |
通知渠道:SMS/PAGE_POPUP/NOTIFY_CENTER |
SMS |
msg_language |
varchar(10) |
no |
消息语言:zh/en |
en |
msg_type |
varchar(30) |
no |
消息类型:对应枚举NotifyTypeEnum#VERIFICATION_CODE(验证码)、REGISTER_SUCCESS(注册成功) 、充值、算税、发薪、到账、系统更新 |
VERIFICATION_CODE |
title |
varchar(300) |
no |
模板标题 |
提现成功 |
content |
varchar(1000) |
no |
模板内容 |
【腾讯】您已从${company}公司成功提现${amount}元。 |
out_template_id |
varchar(60) |
no |
外部模板id,对应第三方的短信id |
162632 |
DROP TABLE IF EXISTS msg_notify_template;
CREATE TABLE msg_notify_template (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
notify_channel varchar(30) NOT NULL COMMENT '通知渠道:SMS/PAGE_POPUP/NOTIFY_CENTER',
msg_language varchar(10) NOT NULL COMMENT '消息语言:zh/en',
msg_type varchar(30) NOT NULL COMMENT '消息类型:对应枚举NotifyTypeEnum#VERIFICATION_CODE(验证码)、REGISTER_SUCCESS(注册成功)',
title varchar(300) DEFAULT NULL COMMENT '模板标题',
content varchar(1000) DEFAULT NULL COMMENT '模板内容,带占位符:【腾讯】您已从${company}公司成功提现${amount}元。',
out_template_id varchar(60) DEFAULT NULL COMMENT '外部模板id,对应第三方的短信id',
GMT_CREATE timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
CREATER varchar(32) DEFAULT NULL COMMENT '创建人',
GMT_MODIFIED timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
MODIFIER varchar(32) DEFAULT NULL COMMENT '修改人',
MEMO varchar(200) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id),
UNIQUE KEY uniq_idx_ntype (notify_type,notify_channel,notify_language)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='消息通知模板表';
- 3.2私有消息通知信息记录表(msg_notify_private_record)
私有信息通知基本都是文本信息,明确下有没有可能有其它类型的信息?
字段名 |
类型 |
允许空 |
字段说明 |
示例 |
---|---|---|---|---|
id |
bigint(20) |
no |
主键 |
1 |
send_sys |
varchar |
no |
发送系统:管家、小程序(B/C),SAAS(PC)、微信公众号、短信、邮件 |
1 |
send_id |
bigint(20) |
no |
发送者id,如果为0则表示是系统发送 |
0 |
rec_id |
bigint(20) |
no |
接受者id |
123 |
language |
|
|
语言 |
语言:zh/en |
title |
varchar(100) |
no |
标题 |
提现成功 |
content |
varchar(500) |
no |
内容 |
【腾讯】您已从腾讯公司成功提现100元。 |
more_content |
varchar(1000) |
no |
更多内容,很多情况下是空 |
null |
status |
varchar(10) |
no |
信息状态:未读、已读 |
未读 |
hyperlink |
varchar(1000) |
yes |
跳转链接 |
url |
DROP TABLE IF EXISTS msg_notify_private_record;
CREATE TABLE msg_notify_record (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
send_sys varchar(10) NOT NULL DEFAULT '1' COMMENT '发送系统:管家、小程序(B/C),SAAS(PC)、微信公众号',
send_id bigint(20) NOT NULL DEFAULT 0 COMMENT '发送者id,如果为0则表示是系统发送',
rec_id bigint(20) NOT NULL DEFAULT 0 COMMENT '接受者id',
title varchar(100) DEFAULT NULL COMMENT '标题',
content varchar(500) DEFAULT NULL COMMENT '内容,带占位符:【腾讯】您已从腾讯公司成功提现100元。',
more_content varchar(1000) DEFAULT NULL COMMENT '更多内容',
status varchar(10) NOT NULL DEFAULT '未读' COMMENT '信息状态:未读、已读、失效',
hyperlink varchar(1000) DEFAULT NULL COMMENT '跳转链接',
GMT_CREATE timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
CREATER varchar(32) DEFAULT NULL COMMENT '创建人',
GMT_MODIFIED timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
MODIFIER varchar(32) DEFAULT NULL COMMENT '修改人',
MEMO varchar(200) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id),
UNIQUE KEY uniq_idx_ntype (notify_type,notify_channel,notify_language)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='消息通知基础信息记录表';
- 3.3 公有消息通知信息记录表(msg_notify_public_record)
公有信息包括文本,图片,语音消息,公有信息一般都是由后台管理员发送出去,主要包括网站公告,banner,活动,系统更新等。
字段名 |
类型 |
允许空 |
字段说明 |
示例 |
---|---|---|---|---|
id |
bigint(20) |
no |
主键 |
1 |
msg_location |
bigint(20) |
no |
信息的显示位置 |
0 |
index |
bigint(20) |
no |
接受者id |
123 |
language |
int |
|
语言 |
|
send_id |
bigint(20) |
no |
发送者id,管理员id |
0 |
display_platform |
int |
|
显示的平台。1- web端, 2-移动端 |
|
msg_type |
int |
no |
信息类型:1-文本、2-图片、3-语音 |
1 |
text_title |
varchar(100) |
|
文本的标题 |
|
text_content |
varchar(500) |
|
文本的内容,支持富文本 |
|
img_desc |
varchar(100) |
|
图片描述 |
|
img_url |
varchar(500) |
|
图片存储地址 |
|
hyperlink |
varchar(500) |
|
超链接 |
|
status |
int |
|
1-有效、0-删除 |
|
drop table if exists msg_notify_public_record;
create table msg_notify_public_record(
id bigint(20) not null auto_increment comment 'id自增',
msg_location int(11) not null default '0' comment '文本的显示位置',
index int(11) not null comment '文本的序号',
language int(11) not null comment '语言',
status varchar(10) not null default '未读' comment '状态:1-有效;0-删除‘,
hyperlink varchar(1000) default null comment '跳转链接',
gmt_create timestamp not null default current_timestamp,
creater varchar(32) default null comment '创建人',
gmt_modifier timestamp not null default current_timestamp,
modifier varchar(32) default null comment '修改人',
memo varchar(200) default null comment '备注',
primary key (id),
) engine=innodb auto_increment=1 default charset=utf8 row_format=dynamic comment = '公有消息通知信息记录表'
- 四、实现方案
1、新建一个基础微服务:base_notify,微服务里面实现手机短信发送,邮件发送,对以上消息通知表的操作,提供发送短信和邮件的RPC接口
2、提供一个基础组件,实现以上三类应用场景的实现,具体实现思路待考虑。