zoukankan      html  css  js  c++  java
  • 基于 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:

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

  • 相关阅读:
    kafka中配置细节
    kafka原理
    storm中的基本概念
    Spring装配Bean的过程补充
    Spring装配Bean的过程
    java中被遗忘的native关键字
    水塘抽样
    js常用总结
    HttpServletResponse status对应的状态信息
    mongoDB常用命令总结
  • 原文地址:https://www.cnblogs.com/phpdragon/p/8271213.html
Copyright © 2011-2022 走看看