一、背景
假设有一个系统的最大并发量有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设计:
-- ----------------------------
-- 手机设备信息表
-- ----------------------------
CREATE TABLE `msg_center_db.device_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`machine_code` char(50) NOT NULL COMMENT '机器码',
`uid` int(11) NOT NULL,
`os_type` tinyint(1) NOT NULL DEFAULT '' COMMENT '系统类型:0安卓,1ios',
`is_login` tinyint(1) NOT NULL,
`device_token` varchar(50) NOT NULL COMMENT '设备token',
`enable_push` tinyint(1) NOT NULL DEFAULT '' COMMENT '接收推送:0关闭,1开启',
`ctime` datetime NOT NULL,
`utime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`,`is_login`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='手机设备信息表'; -- ----------------------------
-- 消息中心模版
-- ----------------------------
CREATE TABLE `msg_center_db.msg_template` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`platform_id` int(11) NOT NULL DEFAULT '' COMMENT '平台ID',
`platform_name` varchar(15) NOT NULL COMMENT '平台名称,冗余字段可取消',
`business_id` int(11) NOT NULL COMMENT '业务线ID',
`business_name` varchar(15) NOT NULL COMMENT '业务线名称,冗余字段可取消',
`tpl_type` int(11) NOT NULL COMMENT '模版类型:0站内,1短信,2邮箱,3微信...',
`tpl_code` int(11) NOT NULL COMMENT '模版代码',
`name` varchar(30) NOT NULL COMMENT '模版名称',
`msg_title` varchar(255) NOT NULL COMMENT '模版内容:标题',
`msg_content` text NOT NULL COMMENT '模版内容',
`msg_suffix` varchar(30) NOT NULL COMMENT '模版后缀',
`channel` tinyint(1) unsigned zerofill NOT NULL DEFAULT '' COMMENT '发送通道优先级:1低,2中,3高',
`owner_id` int(11) NOT NULL DEFAULT '' COMMENT '维护人ID',
`owner` varchar(30) NOT NULL COMMENT '维护人',
`ctime` datetime NOT NULL COMMENT '创建时间',
`operator_id` int(11) NOT NULL DEFAULT '' COMMENT '操作人ID',
`operator` varchar(30) NOT NULL COMMENT '操作人',
`op_memo` varchar(255) NOT NULL COMMENT '操作说明',
`utime` datetime NOT NULL COMMENT '更新时间',
`status` tinyint(1) NOT NULL DEFAULT '' COMMENT '启用状态:0,1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='消息模版'; -- ----------------------------
-- 消息中心模板修改log
-- ----------------------------
CREATE TABLE `msg_center_db.msg_template_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tpl_id` int(11) NOT NULL,
`platform_id` int(11) NOT NULL COMMENT '平台ID',
`platform_name` varchar(15) NOT NULL COMMENT '平台名称,冗余字段可取消',
`business_id` int(11) NOT NULL COMMENT '业务线ID',
`business_name` varchar(15) NOT NULL COMMENT '业务线名称,冗余字段可取消',
`tpl_type` int(11) NOT NULL COMMENT '模版类型:0站内,1短信,2邮箱,3微信...',
`tpl_code` int(11) NOT NULL COMMENT '模版代码',
`name` varchar(30) NOT NULL COMMENT '模版名称',
`msg_title` varchar(255) NOT NULL COMMENT '模版n内容:标题',
`msg_content` text NOT NULL,
`msg_suffix` varchar(30) NOT NULL,
`channel` tinyint(1) unsigned zerofill NOT NULL DEFAULT '' COMMENT '发送通道优先级:1低,2中,3高',
`owner_id` int(11) NOT NULL DEFAULT '' COMMENT '维护人ID',
`owner` varchar(30) NOT NULL COMMENT '维护人',
`ctime` datetime NOT NULL COMMENT '创建时间',
`operator_id` int(11) NOT NULL DEFAULT '' COMMENT '操作人ID',
`operator` varchar(30) NOT NULL COMMENT '操作人',
`op_memo` varchar(255) NOT NULL COMMENT '操作说明',
`utime` datetime NOT NULL COMMENT '更新时间',
`status` tinyint(1) NOT NULL DEFAULT '' COMMENT '启用状态:0,1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='消息模版log'; -- ----------------------------
-- 消息中心参数配置表
-- ----------------------------
CREATE TABLE `msg_center_db.msg_center_setting` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`platform_id` tinyint(1) NOT NULL DEFAULT '' COMMENT '平台ID',
`platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消',
`business_id` tinyint(1) NOT NULL DEFAULT '' COMMENT '业务线ID',
`business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消',
`type` tinyint(1) NOT NULL COMMENT '配置类型:0站内,1短信,2邮箱,3微信...',
`field` varchar(255) NOT NULL COMMENT '参数字段',
`value` varchar(255) NOT NULL COMMENT '参数值',
`name` varchar(255) NOT NULL COMMENT '参数名称',
`desc` varchar(255) NOT NULL COMMENT '参数说明',
`status` tinyint(1) NOT NULL COMMENT '启用状态:0,1',
`type_id` tinyint(2) NOT NULL COMMENT '参数类型,int,json、string、ArrayList等',
`type_desc` varchar(255) NOT NULL COMMENT '参数类型描述',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='消息中心参数配置表'; -- ----------------------------
-- 短信供应商切量配置信息
-- ----------------------------
CREATE TABLE `msg_center_db.sms_provider` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) NOT NULL DEFAULT '',
`rate` tinyint(2) NOT NULL DEFAULT '' COMMENT '切量占比',
`status` tinyint(1) NOT NULL DEFAULT '' COMMENT '启用状态:0,1',
`is_del` tinyint(1) NOT NULL DEFAULT '' COMMENT '是否软删除',
`ctime` datetime NOT NULL COMMENT '创建时间',
`utime` datetime NOT NULL COMMENT '更新时间',
`version` int(11) NOT NULL DEFAULT '' COMMENT '并发版本控制',
`modifyer_id` int(11) NOT NULL DEFAULT '',
`modifier` varchar(10) NOT NULL DEFAULT '' COMMENT '编辑人',
`creater_id` int(11) NOT NULL DEFAULT '' COMMENT '创建人id',
`creater` varchar(10) NOT NULL DEFAULT '' COMMENT '添加人',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信供应商配置'; -- ----------------------------
-- 消息发送总统计表
-- ----------------------------
CREATE TABLE `msg_center_db.msg_send_statistic` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` tinyint(1) NOT NULL DEFAULT '' COMMENT '模版类型:0站内,1短信,2邮箱,3微信...',
`delivery_success_num` int(11) NOT NULL DEFAULT '' COMMENT '投递下发成功数',
`delivery_fail_num` int(11) NOT NULL DEFAULT '' COMMENT '投递下发失败数',
`receive_success_num` int(11) NOT NULL DEFAULT '' COMMENT '接收成功数',
`receive_fail_num` int(11) NOT NULL DEFAULT '' COMMENT '接收次数',
`ctime` datetime NOT NULL COMMENT '添加时间',
`utime` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信发送统计'; -- ----------------------------
-- app下发统计表
-- ----------------------------
CREATE TABLE `msg_center_db.msg_send_statistic_app` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` tinyint(1) NOT NULL DEFAULT '' COMMENT '发送通道:极光、信鸽、APNS',
`delivery_success_num` int(11) NOT NULL DEFAULT '' COMMENT '投递下发成功数',
`delivery_fail_num` int(11) NOT NULL DEFAULT '' COMMENT '投递下发失败数',
`receive_success_num` int(11) NOT NULL DEFAULT '' COMMENT '接收成功数',
`receive_fail_num` int(11) NOT NULL DEFAULT '' COMMENT '接收次数',
`ctime` datetime NOT NULL COMMENT '添加时间',
`utime` datetime NOT NULL COMMENT '更新时间',
`version` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信发送统计'; -- ----------------------------
-- 短信发送统计表
-- ----------------------------
CREATE TABLE `msg_center_db.msg_send_statistic_sms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`provider_id` int(11) NOT NULL DEFAULT '' COMMENT '供应商ID,0系统',
`provider_account` varchar(20) NOT NULL COMMENT '供应商帐号',
`provider_name` varchar(15) NOT NULL COMMENT '供应商名称,冗余',
`delivery_success_num` int(11) NOT NULL DEFAULT '' COMMENT '投递下发成功数',
`delivery_fail_num` int(11) NOT NULL DEFAULT '' COMMENT '投递下发失败数',
`receive_success_num` int(11) NOT NULL DEFAULT '' COMMENT '接收成功数',
`receive_fail_num` int(11) NOT NULL DEFAULT '' COMMENT '接收次数',
`ctime` datetime NOT NULL COMMENT '添加时间',
`utime` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='短信发送统计'; -- ----------------------------
-- 站内消息,登录态用户级消息,百库十表,以uid值sharding
-- ----------------------------
CREATE TABLE `msg_center_notice_#百库#_db.user_notice#十表#uidsharding-登录态` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`title` varchar(30) NOT NULL COMMENT '消息标题',
`content` varchar(255) NOT NULL,
`read_flag` tinyint(1) NOT NULL COMMENT '是否已读:0未读,1已读',
`is_del` tinyint(1) NOT NULL DEFAULT '' COMMENT '是否删除:0,1',
`ctime` datetime NOT NULL,
`utime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ----------------------------
-- 站内消息,非登录态运营类消息,百库十表,以机器码的hash值sharding
-- ----------------------------
CREATE TABLE `msg_center_om_#百库#_db.operate_msg#十表#机器码sharding-非登录态` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`machine_code_hash` int(11) NOT NULL COMMENT '手机机器码hash',
`title` varchar(30) NOT NULL COMMENT '消息标题',
`content` varchar(255) NOT NULL,
`read_flag` tinyint(1) NOT NULL COMMENT '是否已读:0未读,1已读',
`is_del` tinyint(1) NOT NULL DEFAULT '' COMMENT '是否删除:0,1',
`ctime` datetime NOT NULL,
`utime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `machine_code` (`machine_code_hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='运营类非登录态消息'; -- ----------------------------
-- 短信发送log,年库天表
-- ----------------------------
CREATE TABLE `msg_center_sms_log#yyyy#_db.sms_log#mmdd#` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`platform_id` tinyint(1) NOT NULL DEFAULT '' COMMENT '平台ID',
`platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消',
`business_id` tinyint(1) NOT NULL DEFAULT '' COMMENT '业务线ID',
`business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消',
`uid` int(11) NOT NULL DEFAULT '',
`mobile` char(11) NOT NULL COMMENT '手机号',
`msg` varchar(255) NOT NULL COMMENT '短信内容',
`tpl_id` int(11) NOT NULL COMMENT '消息模版ID',
`provider_id` int(11) NOT NULL COMMENT '短信供应商ID',
`provider_account` varchar(30) NOT NULL COMMENT '短信供应商帐号',
`delivery_time` datetime NOT NULL COMMENT '投递供应商时间',
`report_info` varchar(255) NOT NULL COMMENT '短信供应商报告内容',
`report_time` datetime NOT NULL COMMENT '短信供应商报告时间',
`status` tinyint(1) NOT NULL DEFAULT '' COMMENT '短信状态:0投递失败,1投递成功,2下发成功',
`ctime` datetime NOT NULL,
`utime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ----------------------------
-- 邮件发送log,年库天表
-- ----------------------------
CREATE TABLE `msg_center_email_log#yyyy#_db.email_log#mmdd#` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`platform_id` int(11) NOT NULL DEFAULT '' COMMENT '平台ID',
`platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消',
`business_id` int(11) NOT NULL DEFAULT '' COMMENT '业务线ID',
`business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消',
`uid` int(11) NOT NULL DEFAULT '',
`email` varchar(50) NOT NULL COMMENT '手机号',
`tpl_id` int(11) NOT NULL COMMENT '消息模版ID',
`msg` text NOT NULL COMMENT '邮件内容',
`delivery_time` datetime NOT NULL COMMENT '投递时间',
`status` tinyint(1) NOT NULL DEFAULT '' COMMENT '短信状态:0投递失败,1投递成功,2下发成功',
`ctime` datetime NOT NULL,
`utime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ----------------------------
-- 微信消息发送log,年库天表
-- ----------------------------
CREATE TABLE `msg_center_wechat_log#yyyy#_db.wechat_msg_log#mmdd#` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`platform_id` int(11) NOT NULL DEFAULT '' COMMENT '平台ID',
`platform_name` varchar(255) NOT NULL COMMENT '平台名称,冗余字段可取消',
`business_id` int(11) NOT NULL DEFAULT '' COMMENT '业务线ID',
`business_name` varchar(255) NOT NULL COMMENT '业务线名称,冗余字段可取消',
`uid` int(11) NOT NULL DEFAULT '',
`wechat_token_id` varchar(50) NOT NULL,
`tpl_id` int(11) NOT NULL COMMENT '消息模版id',
`wechat_tpl_id` varchar(30) NOT NULL COMMENT '微信消息模版ID',
`msg` varchar(255) NOT NULL COMMENT '消息内容',
`delivery_time` datetime NOT NULL COMMENT '投递时间',
`status` tinyint(1) NOT NULL COMMENT '发送结果:0,1成功',
`ctime` datetime NOT NULL,
`utime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ----------------------------
-- App消息发送记录,年库天表
-- ----------------------------
CREATE TABLE `msg_center_app_log#yyy#_db.app_msg_log#mmdd#` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`platform_id` tinyint(1) NOT NULL DEFAULT '' COMMENT '平台ID',
`platform_name` varchar(255) DEFAULT NULL COMMENT '平台名称,冗余字段可取消',
`business_id` tinyint(1) NOT NULL DEFAULT '' COMMENT '业务线ID',
`business_name` varchar(255) DEFAULT NULL COMMENT '业务线名称,冗余字段可取消',
`uid` int(11) NOT NULL DEFAULT '',
`channel` varchar(10) NOT NULL COMMENT '发送通道:极光、信鸽、APNS',
`device_token` varchar(50) NOT NULL COMMENT '设备码:极光token、Apple_token、信鸽token',
`machine_code` varchar(50) NOT NULL COMMENT '手机机器码',
`tpl_id` int(11) NOT NULL DEFAULT '' COMMENT '消息模版ID',
`msg_type` varchar(30) NOT NULL COMMENT '文本、图片、富文本、语言等',
`msg` text NOT NULL COMMENT '消息内容',
`delivery_time` datetime NOT NULL COMMENT '投递时间',
`delivery_result` varchar(255) NOT NULL COMMENT '投递结果文本',
`status` tinyint(1) NOT NULL DEFAULT '' COMMENT '短信状态:0投递失败,1投递成功,2下发成功',
`ctime` datetime NOT NULL,
`utime` datetime NOT NULL,
PRIMARY KEY (`id`)
) 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:
该方案大致写到这,有问题或建议请留言、拍砖!