一、背景
假设有一个系统的最大并发量有2000TPS左右。同时该系统有闲时和忙时,希望可以随时进行拓展和削减服务能力,以节省服务器费用开销。
该系统能提供站内消息、短信、app消息、邮箱的一个消息系统,并可实现通用化。
二、需求分析
1.该系统最大并发有2000TPS左右。
处理这么大并发,可以通过负载均衡、水平拓展机器数来暴力解决。但我们可以找寻一种可在业务层面进行水平扩展或缩容的架构。
2. 同时该系统有闲时和忙时,希望可以随时进行水平拓展和削减服务能力。
这个需求可以解读为需要对业务服务器进行合理资源分配,闲时进行缩减业务服务器,随时伸缩服务能力。这个可以采用云部署方式。比如腾讯云、阿里云等。
要做到这一点,我们就有必要对业务服务器进行细分,最终落实到具体的服务业务细分上来。
这样才能合理的知道哪些业务服务需要占多少机器资源,哪些服务业务可以闲时缩减机器。
3.短信、APP推送供应商提供的服务带宽有限。
这个问题就导致出现了,需要有一个平稳的、可控的流量调度需求。但消息系统同时又会有流量很大、但大部分消息又不需要串行处理的特点。
所以有必要引入MQ中间件来进行分流、削峰、堆积消息,然后稳定速率的进行消费处理。从而不压垮供应商的带宽。
4.消息系统需要进行业务数据存储、日志记录。
对于这个必要需求,我们需要进行水平拆分库表。同时需要把热点请求的数据拆分出来建立一个独立的应用。
比如:系统级别消息,这种消息需要提供给用户端进行展示。而日志记录这种只需要进行归档存储,无需对外提供查询服务。
那么就对 用户级别的消息进行sharding,而日志记录又因为量大,虽然只需要归档,但我们从性能上考虑,还是需要对其进行以年、天的纬度进行切割,以提高存储性能。
5.作为一个健全的系统,还应该对发送状态进行控制、跟踪、统计等处理,同时实现可以运营化、配置化处理。
这个需求下,我们要设计参数配置表、发送统计表、对消息的消费处理实现可控、自动化、跟踪、控流等处理,日志跟踪可以委托给框架提供的机制处理。
6.消息下发必然有消息模版。
消息模板是为了对消息统一化处理,同时收紧消息内容的更改窗口。对消息内容进行保护、复用,实现方便统计、跟踪的目的。
消息模版的建立,也就会有模版不会常更新的特点。在大并发情况下,消息模板就有必要进行缓存处理了。
所以这里还要引入缓存中间件,用来存储模版缓存。
7.消息又分即时消息和异步消息
因消息有发送优先级,所以可细分为即时系统级、异步营销级。所以发送通道需要进行消息等级划分,资源应更多的倾斜至即时系统级别。
实现消费线程的多寡调配,速率限制等。
三、系统架构拓扑图(点击图片放大)
通过拓扑图,可以了解到,大致有20多个应用对整个系统进行拆分。
1.把需要对外访问能力的应用放置在前置层,也就是所谓的前置机。不需要外部交互的应用放置在业务层、业务机上。
这种方式方便运维进行网络划分、管理、安全处理,减少需要处理的机器。
2.每个应用职责、业务单一,减少业务复杂度和模块之间的耦合度。便于开发维护。
应用服务根据具体的业务进行拆分,数据服务根据DB连接句柄、所在库访问权限拆分,缩小DB帐号的数据库权限。但缺点也明显,无法实现跨库连表查询。
业务层垂直单一,实现复杂跨库业务需要一个聚合服务应用处理。
3.图中红色标注部分过于核心,一但出现故障对系统影响很大。
1)因为有这样的风险,所以在MQ的选型上需要该组件具备分布式、集群能力。
比较成熟的MQ组件有ActiveMQ、RocketMQ等。
2)mq_consumer_server在拓扑图中来看,是过于聚合的。实际情况下,该应用是需要再度功能剥离的。
比如:专门消费短信MQ、App消息MQ、邮箱MQ等等的专一消费业务应用。
四、架构实现具体方案
1.选型:
如上拓扑图中,各个环节都对服务进行了细分。体现了一种服务即应用的概念即SOA。该拓扑图中各个应用都相对独立,适用进行Socket通讯,故可采用rpc通讯框架。
我们来谈下技术选型:
RPC框架:常用的有Dubbo、Spring cloud、Tars,亦或使用phprpc,yar, thrift, gRPC, swoole, hprose这种框架进行定制开发。
KV缓存:redis、memcache。
MQ:可以使用ActiveMQ、RocketMQ。
DB:使用MySQL即可。
那么该说到语言选择了,具体的语言选择当然是要根据当前团队对RPC框架的了解程度来决定。
一个大型系统,如果无法hold住系统核心通讯框架,那么在此之上开发的上层应用出现问题后,排查追踪问题将无从下手。
假如团队中是以Java语言为主,那么我们可以采用Dubbo、Spring cloud。
具体如何还是根据实际团队成员技术栈、组件文档、技术社区、技术支持等来选择。
我接触过的方案是:
RPC框架:Dubbo。
KV缓存:redis
MQ:RocketMQ。
DB:MySQL 。
一套Dubbo体系的架构。
2.DB设计:
1 -- ---------------------------- 2 -- 手机设备信息表 3 -- ---------------------------- 4 CREATE TABLE `msg_center_db.device_info` ( 5 `id` int(11) NOT NULL AUTO_INCREMENT, 6 `machine_code` char(50) NOT NULL COMMENT '机器码', 7 `uid` int(11) NOT NULL, 8 `os_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '系统类型:0安卓,1ios', 9 `is_login` tinyint(1) NOT NULL, 10 `device_token` varchar(50) NOT NULL COMMENT '设备token', 11 `enable_push` tinyint(1) NOT NULL DEFAULT '1' COMMENT '接收推送:0关闭,1开启', 12 `ctime` datetime NOT NULL, 13 `utime` datetime NOT NULL, 14 PRIMARY KEY (`id`), 15 KEY `uid` (`uid`,`is_login`) USING BTREE 16 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='手机设备信息表'; 17 18 -- ---------------------------- 19 -- 消息中心模版 20 -- ---------------------------- 21 CREATE TABLE `msg_center_db.msg_template` ( 22 `id` int(11) NOT NULL AUTO_INCREMENT, 23 `platform_id` int(11) NOT NULL DEFAULT '0' COMMENT '平台ID', 24 `platform_name` varchar(15) NOT NULL COMMENT '平台名称,冗余字段可取消', 25 `business_id` int(11) NOT NULL COMMENT '业务线ID', 26 `business_name` varchar(15) NOT NULL COMMENT '业务线名称,冗余字段可取消', 27 `tpl_type` int(11) NOT NULL COMMENT '模版类型:0站内,1短信,2邮箱,3微信...', 28 `tpl_code` int(11) NOT NULL COMMENT '模版代码', 29 `name` varchar(30) NOT NULL COMMENT '模版名称', 30 `msg_title` varchar(255) NOT NULL COMMENT '模版内容:标题', 31 `msg_content` text NOT NULL COMMENT '模版内容', 32 `msg_suffix` varchar(30) NOT NULL COMMENT '模版后缀', 33 `channel` tinyint(1) unsigned zerofill NOT NULL DEFAULT '2' COMMENT '发送通道优先级:1低,2中,3高', 34 `owner_id` int(11) NOT NULL DEFAULT '0' COMMENT '维护人ID', 35 `owner` varchar(30) NOT NULL COMMENT '维护人', 36 `ctime` datetime NOT NULL COMMENT '创建时间', 37 `operator_id` int(11) NOT NULL DEFAULT '0' COMMENT '操作人ID', 38 `operator` varchar(30) NOT NULL COMMENT '操作人', 39 `op_memo` varchar(255) NOT NULL COMMENT '操作说明', 40 `utime` datetime NOT NULL COMMENT '更新时间', 41 `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '启用状态:0,1', 42 PRIMARY KEY (`id`) 43 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='消息模版'; 44 45 -- ---------------------------- 46 -- 消息中心模板修改log 47 -- ---------------------------- 48 CREATE TABLE `msg_center_db.msg_template_log` ( 49 `id` int(11) NOT NULL AUTO_INCREMENT, 50 `tpl_id` int(11) NOT NULL, 51 `platform_id` int(11) NOT NULL COMMENT '平台ID', 52 `platform_name` varchar(15) NOT NULL COMMENT '平台名称,冗余字段可取消', 53 `business_id` int(11) NOT NULL COMMENT '业务线ID', 54 `business_name` varchar(15) NOT NULL COMMENT '业务线名称,冗余字段可取消', 55 `tpl_type` int(11) NOT NULL COMMENT '模版类型:0站内,1短信,2邮箱,3微信...', 56 `tpl_code` int(11) NOT NULL COMMENT '模版代码', 57 `name` varchar(30) NOT NULL COMMENT '模版名称', 58 `msg_title` varchar(255) NOT NULL COMMENT '模版n内容:标题', 59 `msg_content` text NOT NULL, 60 `msg_suffix` varchar(30) NOT NULL, 61 `channel` tinyint(1) unsigned zerofill NOT NULL DEFAULT '2' COMMENT '发送通道优先级:1低,2中,3高', 62 `owner_id` int(11) NOT NULL DEFAULT '0' COMMENT '维护人ID', 63 `owner` varchar(30) NOT NULL COMMENT '维护人', 64 `ctime` datetime NOT NULL COMMENT '创建时间', 65 `operator_id` int(11) NOT NULL DEFAULT '0' COMMENT '操作人ID', 66 `operator` varchar(30) NOT NULL COMMENT '操作人', 67 `op_memo` varchar(255) NOT NULL COMMENT '操作说明', 68 `utime` datetime NOT NULL COMMENT '更新时间', 69 `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '启用状态:0,1', 70 PRIMARY KEY (`id`) 71 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='消息模版log'; 72 73 -- ---------------------------- 74 -- 消息中心参数配置表 75 -- ---------------------------- 76 CREATE TABLE `msg_center_db.msg_center_setting` ( 77 `id` int(11) NOT NULL AUTO_INCREMENT, 78 `platform_id` tinyint(1) NOT NULL DEFAULT '0' COMMENT '平台ID', 79 `platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消', 80 `business_id` tinyint(1) NOT NULL DEFAULT '0' COMMENT '业务线ID', 81 `business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消', 82 `type` tinyint(1) NOT NULL COMMENT '配置类型:0站内,1短信,2邮箱,3微信...', 83 `field` varchar(255) NOT NULL COMMENT '参数字段', 84 `value` varchar(255) NOT NULL COMMENT '参数值', 85 `name` varchar(255) NOT NULL COMMENT '参数名称', 86 `desc` varchar(255) NOT NULL COMMENT '参数说明', 87 `status` tinyint(1) NOT NULL COMMENT '启用状态:0,1', 88 `type_id` tinyint(2) NOT NULL COMMENT '参数类型,int,json、string、ArrayList等', 89 `type_desc` varchar(255) NOT NULL COMMENT '参数类型描述', 90 PRIMARY KEY (`id`) 91 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='消息中心参数配置表'; 92 93 -- ---------------------------- 94 -- 短信供应商切量配置信息 95 -- ---------------------------- 96 CREATE TABLE `msg_center_db.sms_provider` ( 97 `id` int(11) NOT NULL AUTO_INCREMENT, 98 `name` varchar(15) NOT NULL DEFAULT '', 99 `rate` tinyint(2) NOT NULL DEFAULT '0' COMMENT '切量占比', 100 `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '启用状态:0,1', 101 `is_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否软删除', 102 `ctime` datetime NOT NULL COMMENT '创建时间', 103 `utime` datetime NOT NULL COMMENT '更新时间', 104 `version` int(11) NOT NULL DEFAULT '0' COMMENT '并发版本控制', 105 `modifyer_id` int(11) NOT NULL DEFAULT '0', 106 `modifier` varchar(10) NOT NULL DEFAULT '' COMMENT '编辑人', 107 `creater_id` int(11) NOT NULL DEFAULT '0' COMMENT '创建人id', 108 `creater` varchar(10) NOT NULL DEFAULT '' COMMENT '添加人', 109 PRIMARY KEY (`id`) 110 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信供应商配置'; 111 112 -- ---------------------------- 113 -- 消息发送总统计表 114 -- ---------------------------- 115 CREATE TABLE `msg_center_db.msg_send_statistic` ( 116 `id` int(11) NOT NULL AUTO_INCREMENT, 117 `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '模版类型:0站内,1短信,2邮箱,3微信...', 118 `delivery_success_num` int(11) NOT NULL DEFAULT '0' COMMENT '投递下发成功数', 119 `delivery_fail_num` int(11) NOT NULL DEFAULT '0' COMMENT '投递下发失败数', 120 `receive_success_num` int(11) NOT NULL DEFAULT '0' COMMENT '接收成功数', 121 `receive_fail_num` int(11) NOT NULL DEFAULT '0' COMMENT '接收次数', 122 `ctime` datetime NOT NULL COMMENT '添加时间', 123 `utime` datetime NOT NULL COMMENT '更新时间', 124 PRIMARY KEY (`id`) 125 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信发送统计'; 126 127 -- ---------------------------- 128 -- app下发统计表 129 -- ---------------------------- 130 CREATE TABLE `msg_center_db.msg_send_statistic_app` ( 131 `id` int(11) NOT NULL AUTO_INCREMENT, 132 `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发送通道:极光、信鸽、APNS', 133 `delivery_success_num` int(11) NOT NULL DEFAULT '0' COMMENT '投递下发成功数', 134 `delivery_fail_num` int(11) NOT NULL DEFAULT '0' COMMENT '投递下发失败数', 135 `receive_success_num` int(11) NOT NULL DEFAULT '0' COMMENT '接收成功数', 136 `receive_fail_num` int(11) NOT NULL DEFAULT '0' COMMENT '接收次数', 137 `ctime` datetime NOT NULL COMMENT '添加时间', 138 `utime` datetime NOT NULL COMMENT '更新时间', 139 `version` int(11) NOT NULL, 140 PRIMARY KEY (`id`) 141 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信发送统计'; 142 143 -- ---------------------------- 144 -- 短信发送统计表 145 -- ---------------------------- 146 CREATE TABLE `msg_center_db.msg_send_statistic_sms` ( 147 `id` int(11) NOT NULL AUTO_INCREMENT, 148 `provider_id` int(11) NOT NULL DEFAULT '0' COMMENT '供应商ID,0系统', 149 `provider_account` varchar(20) NOT NULL COMMENT '供应商帐号', 150 `provider_name` varchar(15) NOT NULL COMMENT '供应商名称,冗余', 151 `delivery_success_num` int(11) NOT NULL DEFAULT '0' COMMENT '投递下发成功数', 152 `delivery_fail_num` int(11) NOT NULL DEFAULT '0' COMMENT '投递下发失败数', 153 `receive_success_num` int(11) NOT NULL DEFAULT '0' COMMENT '接收成功数', 154 `receive_fail_num` int(11) NOT NULL DEFAULT '0' COMMENT '接收次数', 155 `ctime` datetime NOT NULL COMMENT '添加时间', 156 `utime` datetime NOT NULL COMMENT '更新时间', 157 PRIMARY KEY (`id`) 158 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信发送统计'; 159 160 161 -- ---------------------------- 162 -- 站内消息,登录态用户级消息,百库十表,以uid值sharding 163 -- ---------------------------- 164 CREATE TABLE `msg_center_notice_#百库#_db.user_notice#十表#uidsharding-登录态` ( 165 `id` int(11) NOT NULL AUTO_INCREMENT, 166 `uid` int(11) NOT NULL, 167 `title` varchar(30) NOT NULL COMMENT '消息标题', 168 `content` varchar(255) NOT NULL, 169 `read_flag` tinyint(1) NOT NULL COMMENT '是否已读:0未读,1已读', 170 `is_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除:0,1', 171 `ctime` datetime NOT NULL, 172 `utime` datetime NOT NULL, 173 PRIMARY KEY (`id`), 174 KEY `uid` (`uid`) 175 ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 176 177 -- ---------------------------- 178 -- 站内消息,非登录态运营类消息,百库十表,以机器码的hash值sharding 179 -- ---------------------------- 180 CREATE TABLE `msg_center_om_#百库#_db.operate_msg#十表#机器码sharding-非登录态` ( 181 `id` int(11) NOT NULL AUTO_INCREMENT, 182 `machine_code_hash` int(11) NOT NULL COMMENT '手机机器码hash', 183 `title` varchar(30) NOT NULL COMMENT '消息标题', 184 `content` varchar(255) NOT NULL, 185 `read_flag` tinyint(1) NOT NULL COMMENT '是否已读:0未读,1已读', 186 `is_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除:0,1', 187 `ctime` datetime NOT NULL, 188 `utime` datetime NOT NULL, 189 PRIMARY KEY (`id`), 190 KEY `machine_code` (`machine_code_hash`) 191 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='运营类非登录态消息'; 192 193 -- ---------------------------- 194 -- 短信发送log,年库天表 195 -- ---------------------------- 196 CREATE TABLE `msg_center_sms_log#yyyy#_db.sms_log#mmdd#` ( 197 `id` int(11) NOT NULL AUTO_INCREMENT, 198 `platform_id` tinyint(1) NOT NULL DEFAULT '0' COMMENT '平台ID', 199 `platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消', 200 `business_id` tinyint(1) NOT NULL DEFAULT '0' COMMENT '业务线ID', 201 `business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消', 202 `uid` int(11) NOT NULL DEFAULT '0', 203 `mobile` char(11) NOT NULL COMMENT '手机号', 204 `msg` varchar(255) NOT NULL COMMENT '短信内容', 205 `tpl_id` int(11) NOT NULL COMMENT '消息模版ID', 206 `provider_id` int(11) NOT NULL COMMENT '短信供应商ID', 207 `provider_account` varchar(30) NOT NULL COMMENT '短信供应商帐号', 208 `delivery_time` datetime NOT NULL COMMENT '投递供应商时间', 209 `report_info` varchar(255) NOT NULL COMMENT '短信供应商报告内容', 210 `report_time` datetime NOT NULL COMMENT '短信供应商报告时间', 211 `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '短信状态:0投递失败,1投递成功,2下发成功', 212 `ctime` datetime NOT NULL, 213 `utime` datetime NOT NULL, 214 PRIMARY KEY (`id`) 215 ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 216 217 -- ---------------------------- 218 -- 邮件发送log,年库天表 219 -- ---------------------------- 220 CREATE TABLE `msg_center_email_log#yyyy#_db.email_log#mmdd#` ( 221 `id` int(11) NOT NULL AUTO_INCREMENT, 222 `platform_id` int(11) NOT NULL DEFAULT '0' COMMENT '平台ID', 223 `platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消', 224 `business_id` int(11) NOT NULL DEFAULT '0' COMMENT '业务线ID', 225 `business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消', 226 `uid` int(11) NOT NULL DEFAULT '0', 227 `email` varchar(50) NOT NULL COMMENT '手机号', 228 `tpl_id` int(11) NOT NULL COMMENT '消息模版ID', 229 `msg` text NOT NULL COMMENT '邮件内容', 230 `delivery_time` datetime NOT NULL COMMENT '投递时间', 231 `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '短信状态:0投递失败,1投递成功,2下发成功', 232 `ctime` datetime NOT NULL, 233 `utime` datetime NOT NULL, 234 PRIMARY KEY (`id`) 235 ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 236 237 -- ---------------------------- 238 -- 微信消息发送log,年库天表 239 -- ---------------------------- 240 CREATE TABLE `msg_center_wechat_log#yyyy#_db.wechat_msg_log#mmdd#` ( 241 `id` int(11) NOT NULL AUTO_INCREMENT, 242 `platform_id` int(11) NOT NULL DEFAULT '0' COMMENT '平台ID', 243 `platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消', 244 `business_id` int(11) NOT NULL DEFAULT '0' COMMENT '业务线ID', 245 `business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消', 246 `uid` int(11) NOT NULL DEFAULT '0', 247 `wechat_token_id` varchar(50) NOT NULL, 248 `tpl_id` int(11) NOT NULL COMMENT '消息模版id', 249 `wechat_tpl_id` varchar(30) NOT NULL COMMENT '微信消息模版ID', 250 `msg` varchar(255) NOT NULL COMMENT '消息内容', 251 `delivery_time` datetime NOT NULL COMMENT '投递时间', 252 `status` tinyint(1) NOT NULL COMMENT '发送结果:0,1成功', 253 `ctime` datetime NOT NULL, 254 `utime` datetime NOT NULL, 255 PRIMARY KEY (`id`) 256 ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 257 258 -- ---------------------------- 259 -- App消息发送记录,年库天表 260 -- ---------------------------- 261 CREATE TABLE `msg_center_app_log#yyy#_db.app_msg_log#mmdd#` ( 262 `id` int(11) NOT NULL AUTO_INCREMENT, 263 `platform_id` tinyint(1) NOT NULL DEFAULT '0' COMMENT '平台ID', 264 `platform_name` varchar(255) DEFAULT NULL COMMENT '平台名称,冗余字段可取消', 265 `business_id` tinyint(1) NOT NULL DEFAULT '0' COMMENT '业务线ID', 266 `business_name` varchar(255) DEFAULT NULL COMMENT '业务线名称,冗余字段可取消', 267 `uid` int(11) NOT NULL DEFAULT '0', 268 `channel` varchar(10) NOT NULL COMMENT '发送通道:极光、信鸽、APNS', 269 `device_token` varchar(50) NOT NULL COMMENT '设备码:极光token、Apple_token、信鸽token', 270 `machine_code` varchar(50) NOT NULL COMMENT '手机机器码', 271 `tpl_id` int(11) NOT NULL DEFAULT '0' COMMENT '消息模版ID', 272 `msg_type` varchar(30) NOT NULL COMMENT '文本、图片、富文本、语言等', 273 `msg` text NOT NULL COMMENT '消息内容', 274 `delivery_time` datetime NOT NULL COMMENT '投递时间', 275 `delivery_result` varchar(255) NOT NULL COMMENT '投递结果文本', 276 `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '短信状态:0投递失败,1投递成功,2下发成功', 277 `ctime` datetime NOT NULL, 278 `utime` datetime NOT NULL, 279 PRIMARY KEY (`id`) 280 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
3.应用说明:
app_device_info:负责处理app设备信息的上报数据接收、下发通知db应用存储设备信息。处理app通知成功上报回调,更新下发统计。
msg_center: 负责提供站内消息、app消息、运营消息的获取、更新处理。
msg_center_gateway: 负责消息的发送,提供对应消息发送接口。如短信、邮箱等消息的发送入口。
mq_consumer_server: 负责MQ消费,对消息的组装,消息的下发,流控、告警、下发统计、日志记录处理等。
供应商应用: 负责对第三方供应商的API进行实际的调用,和第三方供应商的通知回调处理,并对回调数据进行回写、下发统计更新。
其他db服务: 负责对DB的插入、查询、更新、删除,是DB、缓存能力的一种包装。
4.前置层无需对外访问网络资源、需要对外提供http服务的应用,可以使用netty开发,提供http服务。或者再接入一层转发层。
5.MQ消费应用应该实现消费限流、消费暂停(为发布应用考虑)、告警、下发统计、消息消费异常导致堆积的处理机制等。
五、服务部署
具体部署多少个前置应用,每个应用部署多少个,这个需要进行压力测试之后,通过得出的评估报告来计算。
1.暂且假设单台前置机能处理1000并发。那么一个前置应用除了处理之前设定的2000tps并发,那每个前置应用至少需要部署两个。
但我们的服务能力应该比这个大,姑且认为服务器资源也有限,那么至少得提供2.5个应用,多出500tps并发的增幅空间。
2.业务层MQ消费机器的数量,应根据下游,也就是消息推送供应商提供的最大带宽来计算。比如三个供应商全开,总的并发能力是800TPS。
那么MQ的消费机的总并发不能超过800TPS,否则会出现消息下发故障或者其他问题。
3.业务层机器的并发能力也应根据本身压测而得,同时需要计算上游,也就是MQ消费应用的消费能力,来计算部署个数。
4.根据前置机、业务机的应用个数,内存占用大小、上下行数据量、日志和DB容量,来计算出真实物理机所需要的台数。
或者说我们需要在云服务器供应商那里,购买的计算能力、内存、带宽、磁盘空间等。
完!
PS:
该方案大致写到这,有问题或建议请留言、拍砖!