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

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

强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan


前言


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


全景一张图


12a500687aa245efb47f4d1f925febf7.png


系列&你的收获


千万级短信服务系列


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

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

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

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

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


学完本博文,你的收获


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


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


功能列表


0bf20793341144209fd29c2a8ee51fd2.png


服务列表


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


发送核心服务


发送核心架构图


bb69e34410314693b0e5ff59310bf9af.png


  • 说明:
  • 业务场景是根据具体的业务所定(如:登录注册等)
  • 其中还支持定时短信,如:场景三
  • 定时任务说明
  • 短信模板中前两条,因验证码有实效性故是实时发送,其他的均由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='自定义短信错误信息表';


管理后台


管理后台流程图


image.png


管理后台数据库表


  • 配置表
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='短信路由表';


总结


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

相关文章
|
Java 存储 jvm-sandbox
海量流量下,淘宝如何进行稳定的流量回放?
随着业务的不断发展, 整个淘系的服务端已经有数千个应用,在淘宝已经有非常大的应用数量和变更次数的基础上, 对流量回放也有更高的要求。那么在不断尝试流量的录制与回放的过程中,我们遇到了什么问题?那么在不断尝试的过程中,我们遇到了什么问题?我们由从中得到了什么启示?流量录制回放又能给我们带来多少收益?
9907 0
|
1天前
|
人工智能 监控 安全
百万并发,API 网关抗住了亚运会流量高峰
本文主要介绍作为亚运会所有核心流量的入口,阿里云推出了一款百万并发规格的 API 网关,抗住了亚运会流量高峰,为亚运会提供强大的技术支持。
|
10月前
阿里云短信--0.032元/条起,99%到达率,秒级触达
阿里云短信--0.032元/条起,99%到达率,秒级触达,阿里云短信服务价格表,阿里云短信0.032元一条,阿里云短信价格?阿里云短信怎么收费?阿里云短信多少钱一条,阿里云短信价格0.032元一条
|
8月前
|
消息中间件 负载均衡 Java
5分钟轻松打造应对流量洪峰的稳定商城交易系统
本实验通过SAE极速部署一个微服务电商商城,同时结合RocketMQ异步解耦、削峰填谷的能力,带大家体验面对流量洪峰仍旧稳定可靠的商城交易系统!
229 1
|
10月前
[阿里短信云平台] -短信包套餐36元1000条-秒级触达!
[阿里短信云平台] -短信包套餐36元1000条-秒级触达!阿里云短信服务价格表,阿里云短信0.032元一条,阿里云短信价格?阿里云短信怎么收费?阿里云短信多少钱一条,阿里云短信价格0.032元一条
240 0
EMQ
|
弹性计算 负载均衡 监控
EMQX+阿里云飞天洛神云网络 NLB:MQTT 消息亿级并发、千万级吞吐性能达成
近日,EMQ与阿里云旗下飞天洛神云网络展开合作,与NLB产品合作构建了新一代支持「亿级并发、千万级吞吐」的物联网消息服务系统。
EMQ
363 0
EMQX+阿里云飞天洛神云网络 NLB:MQTT 消息亿级并发、千万级吞吐性能达成
|
Arthas 存储 SQL
线上接口流量突增,扛不住了
线上接口流量突增,扛不住了
214 0
线上接口流量突增,扛不住了
|
视频直播 定位技术 UED
支撑千万级实时并发,阿里云助力快速提升视频直播可靠性
如果您计划使用阿里云的视频直播产品进行一场在线直播,并且此次直播活动对您非常关键,想最大程度避免直播中出现任何质量问题,本文将为您介绍较为通用的提升直播可靠性的方案。
557 0
支撑千万级实时并发,阿里云助力快速提升视频直播可靠性
|
存储 运维 架构师
在线教育流量暴涨 阿里云PolarDB分钟级扩容保障教育平台不“卡顿”
疫情期间,停课不停学,在线课堂成为首选模式,由此带来流量洪峰。2月17日,开学第一天,包括学习通、慕课网等在内的多家在线教育平台出现“卡顿”和“死机”,而阿里云数据库通过分钟级扩容,保障了沪江教育、猿辅导、VIPKID、洋葱学院等多家教育平台的平稳。
323 0
在线教育流量暴涨 阿里云PolarDB分钟级扩容保障教育平台不“卡顿”
|
弹性计算 网络安全 UED
在线教育流量洪峰最佳实践
在线教育等行业在业务峰值时段,客户查课、选课、约课、下单、上课、答题、运营报表等环节均会遇到平日数倍甚至数十倍的流量洪峰压力。任何一个环节应对不当都会造成业务卡顿、服务质量降低等问题,极大影响用户体验。问题的瓶颈又往往产生在数据库架构以及产品性能上。本文介绍阿里云数据库在解决这些问题的最佳实践。
在线教育流量洪峰最佳实践
http://www.vxiaotou.com