> 文档中心 > 如何打造一个抗住千万级流量短信服务(续)

如何打造一个抗住千万级流量短信服务(续)


前言

在之前写过一篇博文《短信服务设计》当时讲述了设计的思路,有很多读者朋友反馈说想了解具体的设计思路;今天又重新回顾下当时的具体实现细节发现当时实现的还是有一些巧妙的地方,值得大家参考,于是有了今天这篇续文

全景一张图

在这里插入图片描述

系列&你的收获

千万级短信服务系列

如何打造一个抗住千万级流量短信服务

如何打造一个抗住千万级流量短信服务(续)

支撑千万量级服务稳定性利剑-灰度发布系列

海量任务调度-定时任务的选型及改造实战

灵活的短信模板-巧用占位符?

学完本博文,你的收获

  • 深入的了解如何打造一个抗住千万流量短信平台
  • 可以自己动手一步一步实现一个具备千万级短信服务平台

功能列表&服务列表&实现

功能列表

在这里插入图片描述

服务列表

服务中文名称 服务应用名称
短信发送服务 sms-core
接收第三方回调 sms-callback
短信发送服务 sms-core
定时任务 sms-send-job
短信发送服务 sms-core
管理后台 sms-admin

发送核心服务

发送核心架构图

在这里插入图片描述

  • 说明:
    • 业务场景是根据具体的业务所定(如:登录注册等)
    • 其中还支持定时短信,如:场景三
    • 定时任务说明
      • 短信模板中前两条,因验证码有实效性故是实时发送,其他的均由sms-send-job定时任务发送
    • 发送服务定时任务
      • 将sms_core表中需要发送的数据调用sms-core服务进行发送,待发送条件(以下条件均满足):
        a.expect_send_time (预计发送时间)<=当前时间
        b.status(发送状态)= 0(待发送)或 3(发送失败)
        c.retry_time(重试次数)< 2
      • 执行频率 每五分钟执行一次
    • 清理数据定时任务
      • 将sms_core中需要清理数据放到sms_core_hist表中,需要清理条件(以下条件均满足)
        a.expect_send_time(预计发送时间)< = 当前时间 -1 天
        b.status(发送状态) = 1发送成功
      • 执行频率 每二十分钟执行一次

核心发送数据库表

  • 实时短信发送表(热数据)
CREATE TABLE `sms_send_log` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `sl_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `company_no` varchar(32) DEFAULT NULL COMMENT '所属公司(主体)编码',  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',  `content` varchar(255) DEFAULT NULL COMMENT '内容【以;为分割】',  `info_type` int(2) DEFAULT NULL COMMENT '业务场景类型:0登录注册,1场景N',  `mod_no` varchar(32) DEFAULT NULL COMMENT '模板编码',  `sms_sign` varchar(128) DEFAULT NULL COMMENT '短信签名',  `sms_count` int(2) DEFAULT NULL COMMENT '每条短信实际占用几条短信',  `status` int(2) DEFAULT NULL COMMENT '发送状态:0 待发送,1 成功 , 2 发送中 3失败',  `result` varchar(1024) DEFAULT NULL COMMENT '第三方接口返回数据json',  `return_no` varchar(64) DEFAULT NULL COMMENT '第三方返回业务号',  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT '0' COMMENT '0用户发送短信  1内部自测短信',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_send_log_slno` (`sl_no`),  KEY `key_sms_send_log_cno` (`company_no`),  KEY `key_sms_send_log_chpno` (`channel_product_no`),  KEY `key_sms_send_log_mobile` (`mobile`),  KEY `key_sms_send_log_mod_no` (`mod_no`),  KEY `key_sms_send_log_status` (`status`),  KEY `key_sms_send_log_create_time` (`create_time`),  KEY `key_sms_send_log_return_no` (`return_no`),  KEY `key_sms_send_log_status_rn` (`status`,`return_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送记录表';
  • 实时短信发送历史表(冷数据)
CREATE TABLE `sms_send_log_hist` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `sl_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `company_no` varchar(32) DEFAULT NULL COMMENT '所属公司(主体)编码',  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',  `content` varchar(255) DEFAULT NULL COMMENT '内容【以;为分割】',  `info_type` int(2) DEFAULT NULL COMMENT '业务场景类型:0登录注册,1场景N',  `mod_no` varchar(32) DEFAULT NULL COMMENT '模板编码',  `sms_sign` varchar(128) DEFAULT NULL COMMENT '短信签名',  `sms_count` int(2) DEFAULT NULL COMMENT '每条短信实际占用几条短信',  `status` int(2) DEFAULT NULL COMMENT '发送状态:0 待发送,1 成功 , 2 发送中 3失败',  `result` varchar(1024) DEFAULT NULL COMMENT '第三方接口返回数据json',  `return_no` varchar(64) DEFAULT NULL COMMENT '第三方返回业务号',  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT '0' COMMENT '0用户发送短信  1内部自测短信',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  KEY `uk_sms_send_log_slno` (`sl_no`),  KEY `key_sms_send_log_cno` (`company_no`),  KEY `key_sms_send_log_chpno` (`channel_product_no`),  KEY `key_sms_send_log_mobile` (`mobile`),  KEY `key_sms_send_log_mod_no` (`mod_no`),  KEY `key_sms_send_log_status` (`status`),  KEY `key_sms_send_log_create_time` (`create_time`),  KEY `key_sms_send_log_return_no` (`return_no`),  KEY `key_sms_send_log_mobile_status_rn` (`mobile`,`status`,`return_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送记录历史表';
  • 定时短信发送表(热数据)
CREATE TABLE `sms_core` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `core_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `company_no` varchar(32) DEFAULT NULL COMMENT '所属公司(主体)编码(1.查找短信路由,2.查找记录是否在此表中已记录)',  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',  `content` varchar(255) DEFAULT NULL COMMENT '内容【以;为分割】',  `info_type` int(2) DEFAULT NULL COMMENT '业务场景类型:0登录注册,1场景N',  `mod_no` varchar(32) DEFAULT NULL COMMENT '模板编码',  `sms_sign` varchar(128) DEFAULT NULL COMMENT '短信签名',  `expect_send_time` timestamp NULL DEFAULT NULL COMMENT '预计发送时间',  `reality_send_time` timestamp NULL DEFAULT NULL COMMENT '实际发送时间',  `status` int(2) DEFAULT NULL COMMENT '发送状态:0 待发送,1 成功 , 2 发送中,3 失败',  `retry_time` int(2) DEFAULT NULL COMMENT '重试次数',  `return_no` varchar(64) DEFAULT NULL COMMENT '第三方返回业务号',  `result` varchar(1024) DEFAULT NULL COMMENT '第三方接口返回数据json',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_core_cno` (`core_no`),  KEY `key_sms_core_company_no` (`company_no`),  KEY `key_sms_core_mobile` (`mobile`),  KEY `key_sms_core_mod_no` (`mod_no`),  KEY `key_sms_core_est` (`expect_send_time`),  KEY `key_sms_core_re_time` (`retry_time`),  KEY `key_sms_core_status` (`status`),  KEY `key_sms_core_cpno_status_rn` (`channel_product_no`,`status`,`return_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送表';
  • 定时短信发送历史表(冷数据)
CREATE TABLE `sms_core_hist` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `core_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `company_no` varchar(32) DEFAULT NULL COMMENT '所属公司(主体)编码(1.查找短信路由,2.查找记录是否在此表中已记录)',  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',  `content` varchar(255) DEFAULT NULL COMMENT '内容【以;为分割】',  `info_type` int(2) DEFAULT NULL COMMENT '业务场景类型:0登录注册,1场景N',  `mod_no` varchar(32) DEFAULT NULL COMMENT '模板编码',  `sms_sign` varchar(128) DEFAULT NULL COMMENT '短信签名',  `expect_send_time` timestamp NULL DEFAULT NULL COMMENT '预计发送时间',  `reality_send_time` timestamp NULL DEFAULT NULL COMMENT '实际发送时间',  `status` int(2) DEFAULT NULL COMMENT '发送状态:0 待发送,1 成功 , 2 发送中,3 失败',  `retry_time` int(2) DEFAULT NULL COMMENT '重试次数',  `return_no` varchar(64) DEFAULT NULL COMMENT '第三方返回业务号',  `result` varchar(1024) DEFAULT NULL COMMENT '第三方接口返回数据json',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_core_cno` (`core_no`),  KEY `key_sms_core_company_no` (`company_no`),  KEY `key_sms_core_mobile` (`mobile`),  KEY `key_sms_core_mod_no` (`mod_no`),  KEY `key_sms_core_est` (`expect_send_time`),  KEY `key_sms_core_re_time` (`retry_time`),  KEY `key_sms_core_status` (`status`),  KEY `key_sms_core_cpno_status_rn` (`channel_product_no`,`status`,`return_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送历史表';
  • 自定义短信发送表(热数据)
CREATE TABLE `sms_diy` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `bu_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `sms_order_no` varchar(32) DEFAULT NULL COMMENT '短信订单编号',  `company_no` varchar(32) DEFAULT NULL COMMENT '所属公司(主体)编码',  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `sms_sign` varchar(20) DEFAULT NULL COMMENT '短信签名',  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',  `content` varchar(1024) DEFAULT NULL COMMENT '短信内容',  `info_type` int(2) DEFAULT '1' COMMENT '消息分类:1  召回短信(默认为1)',  `expect_send_time` timestamp NULL DEFAULT NULL COMMENT '预计发送时间',  `reality_send_time` timestamp NULL DEFAULT NULL COMMENT '实际发送时间',  `sms_count` int(2) DEFAULT NULL COMMENT '每条短信实际占用几条短信',  `status` int(2) DEFAULT '-1' COMMENT '发送状态:-1预置(未经操作人确定) 0待发送  1成功   2发送中 3失败  4短信不符合规范',  `retry_time` int(2) DEFAULT '0' COMMENT '重试次数(默认为0)',  `return_no` varchar(64) DEFAULT NULL COMMENT '第三方返回业务号',  `result` varchar(1024) DEFAULT NULL COMMENT '第三方接口返回数据json',  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT '0' COMMENT '0用户发送短信  1内部自测短信',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_diy_buno` (`bu_no`),  KEY `key_sms_diy_expect_send_time` (`expect_send_time`),  KEY `key_sms_diy_cn_status_rn` (`company_no`,`status`,`return_no`),  KEY `key_sms_diy_chpno` (`channel_product_no`),  KEY `key_sms_diy_sms_order_no` (`sms_order_no`),  KEY `key_sms_diy_create_time` (`create_time`),  KEY `key_sms_diy_status` (`status`),  KEY `key_sms_diy_mobile` (`mobile`),  KEY `index_sms_diy_reon` (`return_no`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='自定义短信发送表';
  • 自定义短信发送历史表(冷数据)
CREATE TABLE `sms_diy_hist` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `bu_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `sms_order_no` varchar(32) DEFAULT NULL COMMENT '短信订单编号',  `company_no` varchar(32) DEFAULT NULL COMMENT '所属公司(主体)编码',  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `sms_sign` varchar(20) DEFAULT NULL COMMENT '短信签名',  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',  `content` varchar(1024) DEFAULT NULL COMMENT '短信内容',  `info_type` int(2) DEFAULT '1' COMMENT '消息分类:1  召回短信(默认为1)',  `expect_send_time` timestamp NULL DEFAULT NULL COMMENT '预计发送时间',  `reality_send_time` timestamp NULL DEFAULT NULL COMMENT '实际发送时间',  `sms_count` int(2) DEFAULT NULL COMMENT '每条短信实际占用几条短信',  `status` int(2) DEFAULT '-1' COMMENT '发送状态:-1预置(未经操作人确定) 0待发送  1成功   2发送中 3失败  4短信不符合规范',  `retry_time` int(2) DEFAULT '0' COMMENT '重试次数(默认为0)',  `return_no` varchar(64) DEFAULT NULL COMMENT '第三方返回业务号',  `result` varchar(1024) DEFAULT NULL COMMENT '第三方接口返回数据json',  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT '0' COMMENT '0用户发送短信  1内部自测短信',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  KEY `key_sms_diy_hist_buno` (`bu_no`),  KEY `key_sms_diy_hist_expect_send_time` (`expect_send_time`),  KEY `key_sms_diy_hist_cn_status_rn` (`company_no`,`status`,`return_no`),  KEY `key_sms_diy_hist_chpno` (`channel_product_no`),  KEY `key_sms_diy_hist_sms_order_no` (`sms_order_no`),  KEY `key_sms_diy_hist_create_time` (`create_time`),  KEY `key_sms_diy_hist_status` (`status`),  KEY `key_sms_diy_hist_mobile` (`mobile`),  KEY `index_sms_diy_reon` (`return_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自定义短信发送历史表';
  • 自定义短信发送错误记录表
CREATE TABLE `sms_diy_error` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',  `bu_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `company_no` varchar(32) DEFAULT NULL COMMENT '所属公司(主体)编码',  `sms_order_no` varchar(32) DEFAULT NULL COMMENT '短信订单编号',  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',  `content` varchar(1024) DEFAULT NULL COMMENT '短信内容',  `info_type` int(2) DEFAULT '1' COMMENT '消息分类:1召回短信(默认为1)',  `sms_count` int(2) DEFAULT NULL COMMENT '每条短信实际占用几条短信',  `sms_sign` varchar(20) DEFAULT NULL COMMENT '短信签名',  `error_status` int(2) DEFAULT '-1' COMMENT '错误状态:1手机号错误 2、内容错误 3、占用条数错误 4、签名值错误',  `error_remark` varchar(255) DEFAULT NULL COMMENT '具体错误信息',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_diy_error_buno` (`bu_no`),  KEY `key_sms_diy_error_cno` (`company_no`),  KEY `key_sms_diy_error_sono` (`sms_order_no`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='自定义短信错误信息表';

管理后台

管理后台流程图

在这里插入图片描述

管理后台数据库表

  • 配置表
CREATE TABLE `config` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `config_code` varchar(32) DEFAULT NULL COMMENT '配置编号',  `category` int(2) DEFAULT '0' COMMENT '所属分类:0代表短信类配置',  `type` int(2) DEFAULT NULL COMMENT '类型:0代表开关配置 1代表阈值配置',  `config_name` varchar(20) DEFAULT NULL COMMENT '配置名称',  `config_value` varchar(255) DEFAULT NULL COMMENT '配置值',  `config_status` int(2) DEFAULT NULL COMMENT '配置状态 0表示开启 1关闭',  `remark` varchar(64) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_config_config_code` (`config_code`),  KEY `key_config_category` (`category`),  KEY `key_config_type` (`type`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置表';
  • 平台基础信息配置
CREATE TABLE `sa_basic_info` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `pb_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `category` int(2) DEFAULT NULL COMMENT '平台分类:0短信平台,1推送平台,2活体平台',  `type` int(2) DEFAULT '0' COMMENT '业务场景:0短信业务场景分类',  `code` int(2) DEFAULT NULL COMMENT '数据库中记录值',  `display_message` varchar(32) DEFAULT NULL COMMENT '展示内容',  `status` int(2) DEFAULT '0' COMMENT '状态(0启用 1停用 2作废)',  `remark` varchar(64) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_platform_basic_info_pb_no` (`pb_no`),  KEY `key_platform_basic_info_code` (`code`),  KEY `key_platform_basic_info_category` (`category`),  KEY `key_platform_basic_info_type` (`type`),  KEY `key_platform_basic_info_status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台配置基础信息表';
  • 国家表
CREATE TABLE `country` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `country_no` varchar(32) DEFAULT NULL COMMENT '国家编码',  `country_name` varchar(20) DEFAULT NULL COMMENT '国家名称',  `sms_pre` varchar(10) DEFAULT NULL COMMENT '短信前缀',  `region` int(2) DEFAULT '0' COMMENT '所属区域 0亚太',  `status` int(2) DEFAULT '0' COMMENT '是否启用:0启用  1停用 2作废',  `remark` varchar(64) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '国家自定义短信中短信签名是否必填:0必填 1非必填',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_country_no_name_status` (`country_no`,`country_name`,`status`),  KEY `uk_country_status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='国家表';
  • 国家渠道关联表
CREATE TABLE `sms_country_channel` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',  `bu_no` varchar(32) NOT NULL COMMENT '业务编号',  `country_no` varchar(32) NOT NULL COMMENT '国家编号',  `channel_no` varchar(32) NOT NULL COMMENT '短信渠道编码',  `channel_product_no` varchar(32) NOT NULL COMMENT '短信渠道产品编码',  `status` int(2) NOT NULL DEFAULT '0' COMMENT '类型 0:启用 1:停用',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_country_channel_bu_no` (`bu_no`),  KEY `key_sms_country_channel_country_no` (`country_no`) USING BTREE COMMENT '国家编号',  KEY `key_sms_country_channel_channel_no` (`channel_no`) USING BTREE COMMENT '短信渠道编码',  KEY `key_sms_country_channel_channel_product_no` (`channel_product_no`) USING BTREE COMMENT '短信渠道产品编码') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信渠道与国家关联表';
  • 国家主体对应关系
CREATE TABLE `country_company` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `sl_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `country_no` varchar(32) DEFAULT NULL COMMENT '国家编码',  `company_no` varchar(32) DEFAULT NULL COMMENT '主体编码',  `status` int(2) DEFAULT '0' COMMENT '是否启用:0启用  1停用 2作废',  `remark` varchar(64) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_country_company_slno` (`sl_no`),  UNIQUE KEY `uk_country_company_cou_com_status` (`company_no`,`status`),  KEY `key_country_company_couno` (`country_no`),  KEY `key_country_company_comno` (`company_no`),  KEY `key_country_company_status` (`status`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='国家主体对应表';
  • 短信渠道表
CREATE TABLE `sms_channel` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `channel_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `sort` decimal(4,2) DEFAULT NULL COMMENT '排序(越大越靠前);支持正负数,支持两位整数两位小数',  `channel_name` varchar(64) DEFAULT NULL COMMENT '通道名称',  `status` int(2) DEFAULT '0' COMMENT '状态(0启用 1停用 2作废)',  `channel_info` varchar(64) DEFAULT NULL COMMENT '通道信息',  `sms_sign_status` int(2) DEFAULT NULL COMMENT '是否支持短信签名:1支持,2不支持',  `remark` varchar(128) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为 -1',  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID 系统修改为 -1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT NULL COMMENT '时区加减值',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '时区名称',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `key_sms_channel_cno` (`channel_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信渠道表';
  • 短信渠道产品表
CREATE TABLE `sms_channel_product` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `channel_product_name` varchar(64) DEFAULT NULL COMMENT '渠道产品名称',  `channel_no` varchar(32) DEFAULT NULL COMMENT '所属渠道编码',  `sort` decimal(4,2) DEFAULT NULL COMMENT '排序(越大越靠前);支持正负数,支持两位整数两位小数',  `third_product_no` varchar(20) DEFAULT NULL COMMENT '我们平台在第三方产品编号',  `call_url_common` varchar(128) DEFAULT NULL COMMENT '非自定义短信调用第三方平台地址',  `call_url_diy` varchar(128) DEFAULT NULL COMMENT '自定义短信调用第三方平台地址',  `call_back_url` varchar(128) DEFAULT NULL COMMENT '第三方平台回调我们的地址',  `def_sms_sign` varchar(20) DEFAULT NULL COMMENT '默认使用的短信签名',  `account` varchar(20) DEFAULT NULL COMMENT '第三方平台为我们分配的用户名',  `passord` varchar(64) DEFAULT NULL COMMENT '第三方平台为我们分配的密码',  `item_count` int(2) DEFAULT NULL COMMENT '每条短信所占字符个数',  `surplus_num` int(20) DEFAULT NULL COMMENT '剩余条数',  `consumer_num` int(20) DEFAULT NULL COMMENT '总共消耗短信条数',  `low_warn_num` int(11) DEFAULT NULL COMMENT '最低预警阈值条数',  `low_switch_num` int(11) DEFAULT NULL COMMENT '最低切换渠道产品阈值条数',  `status` int(2) DEFAULT '0' COMMENT '状态(0启用 1停用 2作废)',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为 -1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID 系统修改为 -1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_channel_product_cpno` (`channel_product_no`),  KEY `key_sms_channel_product_cno` (`channel_no`),  KEY `key_sms_channel_product_status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信渠道产品表';
  • 短信渠道产品明细表
CREATE TABLE `sms_channel_product_detail` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `channel_product_no` varchar(32) DEFAULT NULL COMMENT '渠道产品编码',  `pre_surplus_num` int(20) DEFAULT NULL COMMENT '上次剩余条数',  `oper_surplus_num` int(20) DEFAULT NULL COMMENT '本次操作量 正数为增加 负数为减少',  `now_surplus_num` int(20) DEFAULT NULL COMMENT '本次剩余条数',  `low_warn_num` int(11) DEFAULT NULL COMMENT '最低预警阈值条数',  `low_switch_num` int(11) DEFAULT NULL COMMENT '最低切换渠道产品阈值条数',  `consumer_num` int(20) DEFAULT NULL COMMENT '总共消耗短信条数',  `status` int(2) DEFAULT '1' COMMENT '状态:1 开启,2关闭',  `operator_type` int(2) DEFAULT NULL COMMENT '1 修改短信剩余条数 2 修改短信预警值',  `remark` varchar(128) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为 -1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID 系统修改为 -1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(20) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  KEY `key_sms_channel_product_detail_cpno` (`channel_product_no`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='短信渠道产品明细表';
  • 模板表
CREATE TABLE `sms_mod` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `mod_no` varchar(32) DEFAULT NULL COMMENT '模板编码',  `title` varchar(64) DEFAULT NULL COMMENT '标题',  `status` int(2) DEFAULT '0' COMMENT '状态(0启用 1停用 2作废)',  `content` varchar(512) DEFAULT NULL COMMENT '短信模板内容',  `content_chinese` varchar(512) DEFAULT NULL COMMENT '短信模板内容对应中文',  `info_type` int(2) DEFAULT NULL COMMENT '业务场景类型:0登录注册,1场景N',  `send_type` int(2) DEFAULT NULL COMMENT '发送类型【1实时 2定时】',  `send_purpose` varchar(64) DEFAULT NULL COMMENT '短信模板说明',  `remark` varchar(64) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '预留字段4',  `param5` varchar(64) DEFAULT NULL COMMENT '预留字段5',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_mod` (`mod_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信模板表';
  • 短信公司模板对应表
CREATE TABLE `sms_company_mod` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `bu_no` varchar(32) DEFAULT NULL COMMENT '业务编码',  `company_no` varchar(32) DEFAULT NULL COMMENT '公司(主体)编码',  `mod_no` varchar(32) DEFAULT NULL COMMENT '短信模板编码',  `type` int(2) DEFAULT NULL COMMENT '业务场景类型:0登录注册 1:场景N',  `status` int(2) DEFAULT '0' COMMENT '状态(0启用 1停用 2作废)',  `remark` varchar(64) DEFAULT NULL COMMENT '备注',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '预留字段1',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '主体名称',  `param5` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_company_mod_bu_no` (`bu_no`),  UNIQUE KEY `uk_sms_company_mod_cno_mno_ty_st` (`company_no`,`mod_no`,`type`,`status`),  KEY `key_sms_company_mod_company_no` (`company_no`),  KEY `key_sms_company_mod_status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信的公司模板对应表';
  • 路由表
CREATE TABLE `sms_routing` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',  `routing_no` varchar(32) NOT NULL COMMENT '路由编号',  `company_no` varchar(32) NOT NULL COMMENT '公司(主体)编号',  `channel_product_no` varchar(32) NOT NULL COMMENT '短信渠道产品编号',  `weight` int(4) NOT NULL DEFAULT '1' COMMENT '权重 如果一个公司(主体)配置2个渠道产品且每个渠道产品的占比为该渠道产品权重除以两个权重之和',  `sort` decimal(4,2) DEFAULT NULL COMMENT '排序(越大越靠前);支持正负数,支持两位整数两位小数',  `status` int(2) DEFAULT '0' COMMENT '状态(0启用 1停用 2作废)',  `create_uid` varchar(32) DEFAULT NULL COMMENT '创建人ID 系统初始化为-1',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_uid` varchar(32) DEFAULT NULL COMMENT '修改人ID  系统初始化为-1',  `update_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',  `param1` int(2) DEFAULT NULL COMMENT '短信类型:0验证类 1非验证类',  `param2` int(4) DEFAULT NULL COMMENT '预留字段2',  `param3` int(11) DEFAULT NULL COMMENT '预留字段3',  `param4` varchar(32) DEFAULT NULL COMMENT '国家编码',  `param5` varchar(64) DEFAULT NULL COMMENT '主体名称',  `param6` varchar(128) DEFAULT NULL COMMENT '预留字段6',  PRIMARY KEY (`id`),  UNIQUE KEY `uk_sms_routing_rt_no` (`routing_no`),  UNIQUE KEY `uk_sms_routing_cno_cpno_status_type` (`company_no`,`channel_product_no`,`status`,`param1`) USING BTREE,  KEY `key_sms_routing_cno` (`company_no`),  KEY `key_sms_routing_cpno` (`channel_product_no`),  KEY `key_sms_routing_status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信路由表';

总结

  • 本文给大家设计一个千万级短信服务设计提供一个参考,这个系统经过多个版本迭代已在我们项目中稳定运行多年
  • 限于本篇篇幅,后续还会针对 自定义短信,短信发送量和第三方对账,消息优先级,渠道按比例等优化点再为大家进行深入的分享
  • 系统架构是不断的演进而来,在不同的量级下考虑的问题不同;当达到千万级流量时需要仔细考虑到边界极端情况,不然一个疏忽可能会导致毁灭性的灾难