基於 SOA 概念 RPC 框架 的 消息中心 雲部署 設計 漫談

1、背景

假設有一個系統的最大併發量有2000TPS左右。同時該系統有閒時和忙時,但願能夠隨時進行拓展和削減服務能力,以節省服務器費用開銷。php

該系統能提供站內消息、短信、app消息、郵箱的一個消息系統,並可實現通用化。ios

 

2、需求分析

1.該系統最大併發有2000TPS左右。redis

處理這麼大併發,能夠經過負載均衡、水平拓展機器數來暴力解決。但咱們能夠找尋一種可在業務層面進行水平擴展或縮容的架構。數據庫

2. 同時該系統有閒時和忙時,但願能夠隨時進行水平拓展和削減服務能力。json

這個需求能夠解讀爲須要對業務服務器進行合理資源分配,閒時進行縮減業務服務器,隨時伸縮服務能力。這個能夠採用雲部署方式。好比騰訊雲、阿里雲等。緩存

要作到這一點,咱們就有必要對業務服務器進行細分,最終落實到具體的服務業務細分上來。安全

這樣才能合理的知道哪些業務服務須要佔多少機器資源,哪些服務業務能夠閒時縮減機器。服務器

3.短信、APP推送供應商提供的服務帶寬有限。微信

這個問題就致使出現了,須要有一個平穩的、可控的流量調度需求。但消息系統同時又會有流量很大、但大部分消息又不須要串行處理的特色。swoole

因此有必要引入MQ中間件來進行分流、削峯、堆積消息,而後穩定速率的進行消費處理。從而不壓垮供應商的帶寬。

4.消息系統須要進行業務數據存儲、日誌記錄。

對於這個必要需求,咱們須要進行水平拆分庫表。同時須要把熱點請求的數據拆分出來創建一個獨立的應用。

好比:系統級別消息,這種消息須要提供給用戶端進行展現。而日誌記錄這種只須要進行歸檔存儲,無需對外提供查詢服務。

那麼就對 用戶級別的消息進行sharding,而日誌記錄又由於量大,雖然只須要歸檔,但咱們從性能上考慮,仍是須要對其進行以年、天的緯度進行切割,以提升存儲性能。

5.做爲一個健全的系統,還應該對發送狀態進行控制、跟蹤、統計等處理,同時實現能夠運營化、配置化處理。

這個需求下,咱們要設計參數配置表、發送統計表、對消息的消費處理實現可控、自動化、跟蹤、控流等處理,日誌跟蹤能夠委託給框架提供的機制處理。

6.消息下發必然有消息模版。

消息模板是爲了對消息統一化處理,同時收緊消息內容的更改窗口。對消息內容進行保護、複用,實現方便統計、跟蹤的目的。

消息模版的創建,也就會有模版不會常更新的特色。在大併發狀況下,消息模板就有必要進行緩存處理了。

因此這裏還要引入緩存中間件,用來存儲模版緩存。

7.消息又分即時消息和異步消息

因消息有發送優先級,因此可細分爲即時系統級、異步營銷級。因此發送通道須要進行消息等級劃分,資源應更多的傾斜至即時系統級別。

實現消費線程的多寡調配,速率限制等。

 

3、系統架構拓撲圖(點擊圖片放大)

消息中心拓撲圖

 

 

經過拓撲圖,能夠了解到,大體有20多個應用對整個系統進行拆分。

1.把須要對外訪問能力的應用放置在前置層,也就是所謂的前置機。不須要外部交互的應用放置在業務層、業務機上。

這種方式方便運維進行網絡劃分、管理、安全處理,減小須要處理的機器。

2.每一個應用職責、業務單一,減小業務複雜度和模塊之間的耦合度。便於開發維護。

應用服務根據具體的業務進行拆分,數據服務根據DB鏈接句柄、所在庫訪問權限拆分,縮小DB賬號的數據庫權限。但缺點也明顯,沒法實現跨庫連表查詢。

業務層垂直單一,實現複雜跨庫業務須要一個聚合服務應用處理。

3.圖中紅色標註部分過於核心,一但出現故障對系統影響很大。

1)由於有這樣的風險,因此在MQ的選型上須要該組件具有分佈式、集羣能力。

比較成熟的MQ組件有ActiveMQ、RocketMQ等。

2)mq_consumer_server在拓撲圖中來看,是過於聚合的。實際狀況下,該應用是須要再度功能剝離的。

好比:專門消費短信MQ、App消息MQ、郵箱MQ等等的專注消費業務應用。

 

4、架構實現具體方案

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消費應用應該實現消費限流、消費暫停(爲發佈應用考慮)、告警、下發統計、消息消費異常致使堆積的處理機制等。

 

5、服務部署

具體部署多少個前置應用,每一個應用部署多少個,這個須要進行壓力測試以後,經過得出的評估報告來計算。

 

1.暫且假設單臺前置機能處理1000併發。那麼一個前置應用除了處理以前設定的2000tps併發,那每一個前置應用至少須要部署兩個。

但咱們的服務能力應該比這個大,姑且認爲服務器資源也有限,那麼至少得提供2.5個應用,多出500tps併發的增幅空間。

2.業務層MQ消費機器的數量,應根據下游,也就是消息推送供應商提供的最大帶寬來計算。好比三個供應商全開,總的併發能力是800TPS。

那麼MQ的消費機的總併發不能超過800TPS,不然會出現消息下發故障或者其餘問題。

3.業務層機器的併發能力也應根據自己壓測而得,同時須要計算上游,也就是MQ消費應用的消費能力,來計算部署個數。

4.根據前置機、業務機的應用個數,內存佔用大小、上下行數據量、日誌和DB容量,來計算出真實物理機所須要的臺數。

或者說咱們須要在雲服務器供應商那裏,購買的計算能力、內存、帶寬、磁盤空間等。

 

 

完!

 

 

 

PS:

該方案大體寫到這,有問題或建議請留言、拍磚!

相關文章
相關標籤/搜索