一、背景
作为公司的基础服务之一,发送消息是必不可少的功能之一,包括发送手机短信、企业微信、钉钉消息和电子邮件等。
二、目标
- 1、支持多种消息类型,包括手机短信、企业微信、钉钉消息和电子邮件等。
- 2、同一类型的消息发送,需支持多个发送渠道。比如发送短信,既支持阿里云短信,也支持华为云短信等其他三方渠道。
- 3、保证渠道的高可用,防止某个渠道被停用的时候(可能是欠费、也可以是封禁等外部原因),可以快速切换至其他可用渠道。
- 4、业务方对接发送渠道,需要做到便捷,快速接入。
三、数模设计
image.png四、业务对接流图
image.png五、关键术语
1、消息类型
指的是短信、企业微信、电子邮件等。
2、短信模板
image.png消息平台定义好合法的短信模板,明确定义模板变量和编号,然后到第三方渠道申请短信模板。
- mapping字段:支持的第三方渠道类型及模板号,这里设计它的数据格式为json,方便扩展。
数据结构示例:
/* 平台的短信编号是SMS_0001,
短信类型区分验证码类和通知类,
这里维护的第三方模板编号包括阿里云和华为云
*/
{
"_id" : ObjectId("5fab859e2073d196c7c175bf"),
"type" : "VERIFY",
"name" : "验证码",
"code" : "SMS_0001",
"content" : "您的验证码:${code},十分钟内有效。",
"mapping" : "{\"SMS_ALIYUN\":\"SMS_205443030\",\"SMS_HUAWEIYUN\":\"ff5ba781be91472cac79178d1132df88\"}",
"remark" : "",
"createTime" : ISODate("2020-12-23T00:00:00.000Z"),
"createBy" : "1",
"modifiedTime" : ISODate("2020-12-23T00:00:00.000Z"),
"modifiedBy" : "1"
}
image.png
3、渠道
渠道,也作第三方渠道,上层是应用(和渠道是一对多的关系)。
查询条件包括:消息类型和应用ID
// 查询应用是zpms,消息类型是手机短信的渠道列表
db.getCollection('channel').find({
"supportMessageType" : "SMS",
"applicationId" : "zpms",
})
属性设计说明:
- channelId : 主键ID,不能重复
- applicationId:对应application中的applicationId
- enabled:开关
- supportMessageType:消息类型:SMS-短信,EMAL-电子邮件,WX-企业微信。
- providerId: 包括SMS_ALIYUN、SMS_HUAWEIYUN等,对应的是第三方渠道的简称。在定义短信模板的时候,sms_template.mapping字段里的key就是对应该字段。
-
properties:渠道的属性,为了可扩展性好,存储的格式是json,不会因为不同的渠道属性不一样而设计成了一张宽表。
image.png
4、应用
image.png区分不同的签名,一个企业对应一个应用。当是发送短信的时候,应用的名称就是签名。
六、接口设计
1、消息发送记录
image.png2、发送消息
// account 是手机号、邮箱等账号
// applicationId 对应application中的applicationId
// payload 传入消息模板的变量及值,json格式支持多个
// templateCode 模板编号
// subject 消息主题,类似于模板名称、邮件主题
{
"messageType": "SMS",
"subject": "验证码",
"templateCode":"SMS_0001",
"payload": "{\"code\":\"123456\"}",
"account": "150xxxxxxx",
"applicationId": "zpms"
}
网友评论