假設有一個系統的最大併發量有2000TPS左右。同時該系統有閒時和忙時,但願能夠隨時進行拓展和削減服務能力,以節省服務器費用開銷。php
該系統能提供站內消息、短信、app消息、郵箱的一個消息系統,並可實現通用化。ios
1.該系統最大併發有2000TPS左右。redis
處理這麼大併發,能夠經過負載均衡、水平拓展機器數來暴力解決。但咱們能夠找尋一種可在業務層面進行水平擴展或縮容的架構。數據庫
2. 同時該系統有閒時和忙時,但願能夠隨時進行水平拓展和削減服務能力。json
這個需求能夠解讀爲須要對業務服務器進行合理資源分配,閒時進行縮減業務服務器,隨時伸縮服務能力。這個能夠採用雲部署方式。好比騰訊雲、阿里雲等。緩存
要作到這一點,咱們就有必要對業務服務器進行細分,最終落實到具體的服務業務細分上來。安全
這樣才能合理的知道哪些業務服務須要佔多少機器資源,哪些服務業務能夠閒時縮減機器。服務器
3.短信、APP推送供應商提供的服務帶寬有限。微信
這個問題就致使出現了,須要有一個平穩的、可控的流量調度需求。但消息系統同時又會有流量很大、但大部分消息又不須要串行處理的特色。swoole
因此有必要引入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:
該方案大體寫到這,有問題或建議請留言、拍磚!