基于 SOA 概念 RPC 框架 的 消息中心 云部署 设计 漫谈

一、背景

假设有一个系统的最大并发量有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;
View Code

 

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:

该方案大致写到这,有问题或建议请留言、拍砖!

 

posted @ 2018-01-12 01:43  phpdragon  阅读(1199)  评论(0编辑  收藏  举报