一、背景

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

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

基于 SOA 概念 RPC 框架 的 消息中心 云部署 设计 漫谈的更多相关文章

  1. 这样基于Netty重构RPC框架你不可能知道

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365天原创计划”第5天. 今天呢!灯塔君跟大家讲: 基于Netty重构RPC框架 一.CyclicBarrier方法说明 1. ...

  2. 基于Netty重构RPC框架

    下面的这张图,大概很多小伙伴都见到过,这是Dubbo 官网中的一张图描述了项目架构的演进过程.随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在 ...

  3. 基于APM实现RPC服务和消息队列的指定消费

    本文内容是基于公司现有框架整理的一篇专利文章.该框架包含完整的一套DevOps流程,包括工单系统(容器申请.服务部署等)\配置中心\路由配置中心\服务治理平台\消息治理平台\葛朗台(基于Docker+ ...

  4. 《Java 编写基于 Netty 的 RPC 框架》

    一 简单概念 RPC: ( Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO :当阻塞 ...

  5. java编写基于netty的RPC框架

    一 简单概念 RPC:(Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO:当阻塞I/O ...

  6. 基于netty实现rpc框架-spring boot服务端

    demo地址 https://gitee.com/syher/grave-netty RPC介绍 首先了解一下RPC:远程过程调用.简单点说就是本地应用可以调用远程服务器的接口.那么通过什么方式调用远 ...

  7. 基于RabbitMQ的Rpc框架

    参考文档:https://www.cnblogs.com/ericli-ericli/p/5917018.html 参考文档:RabbitMQ 实现RPC MQ的使用场景大概包括解耦,提高峰值处理能力 ...

  8. 基于netty实现rpc框架-spring boot客户端

    上篇讲了RPC服务端的实现.原理就是解析netty通道数据拿到类.方法及入参等信息,然后通过java反射机制调用本地接口返回结果.没有用到很复杂的技术. 这篇我们将客户端的实现.说白了客户端的任务很简 ...

  9. 手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc

    前言     一直以来对内部服务间使用RPC的方式调用都比较赞同,因为内部间没有这么多限制,最简单明了的方式就是最合适的方式.个人比较喜欢类似Dubbo的那种使用方式,把接口层单独出来,作为服务的契约 ...

随机推荐

  1. 使用PrerenderSpaPlugin预渲染插件没有成功渲染

    问题 在已有vue项目里使用prerender-spa-plugin插件时,遇到了build出来的页面是白屏或者出现{"statusCode":404,"error&qu ...

  2. SpringMVC知识点

    一.SpringMVC 1.HelloWorld案例 ①步骤: 加jar包 在web.xml文件中配置DispatcherServlet 加入SpringMVC的配置文件 编写处理请求的处理器,并标识 ...

  3. Spring quartz 单机、集群+websocket集群实现文本、图片、声音、文件下载及推送、接收及显示

    相关环境 Nginx,Spring5.x当前(要选择4.0+),tomcat9.x或8.x都可以,Quartz 2.x集群(实际运用是Quartz的集群模式和单机模式共存的) 测试面页:http:// ...

  4. 开发入门,学Java还是学大数据?

    经常有人问,我想学习开发,到底是学Java好还是学大数据好?或者是,学习大数据还有必要学Java吗?      依我说,这个提问的标准答案是:两者都学.      先来甩两张图.      一张是腾讯 ...

  5. Android:如何生成自己的keystore(zz)

    keystore不设置的话默认使用的是C:\Users\Fly\.Android下面的debug.keystore,每台电脑的都不一样,所以导致了无法安装的情况. 如何生成自己的keystore呢?这 ...

  6. js实现图片旋转

    1.以下代码适用ie9版本 js代码如下: function rotate(o,p){ var img = document.getElementById(o); if(!img || !p) ret ...

  7. Python3爬虫实例 代理的使用

    现在爬虫越来越难了,一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问. 所以我们需要设置一些代理服 ...

  8. ubuntu 安装jdk 的两种方式:

    :通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用ppa/源方式安装 1.添加ppa sudo ...

  9. t-io 集群解决方案以及源码解析

    t-io 集群解决方案以及源码解析 0x01 概要说明 本博客是基于老谭t-io showcase中的tio-websocket-showcase 示例来实现集群.看showcase 入门还是挺容易的 ...

  10. Docker 管理工具 Portainer部署

    Docker 管理工具 Portainer部署 一.官网 官网:http://www.portainer.io 演示地址:http://demo.portainer.io 用户名:admin 密码:t ...