天天看點

.net core實踐系列之短信服務-架構設計

上篇《.net core實踐系列之短信服務-為什麼選擇.net core(開篇)》簡單的介紹了(水了一篇).net core。這次針對短信服務的架構設計和技術棧的簡析。

源碼位址:https://github.com/SkyChenSky/Sikiro.SMS

有人會問短信服務也要架構設計?不就寫個service封裝個send方法就得了嗎?幹嘛還要大動幹戈。

如果在單塊應用的情況下,以上面的做法是無可厚非的。

然而架構設計解決的是應用複雜度,架構設計的大還是小取決于業務規模,技術的使用是要落實到應用場景。

以我們公司作為例子:

已擁有多套系統,營運背景、資金平台、賬單平台、APP API等;

需接入多個短信營運商,避免某個出異常後随時切換;

及時發送、定時發送;

從上面場景分析出,要由多系統、多平台接入需要單獨抽離出來進行服務化,而且随着接入的系統越多,性能将成為瓶頸,是以需要良好的橫向拓展能力。定時發送需要排程任務系統進行解決。

是以下面為我設計的架構圖

.net core實踐系列之短信服務-架構設計

以HTTP協定RESTful風格JSON格式提供給其他系統(服務)接入,以swagger作為服務描述提供對外檢視。

接口主要功能有:

發送短信

查詢短信清單

發送短信支援批量,接口接受到請求後将資料先持久化到MongoDB。

如果及時發送則立刻發送RabbitMQ,再由Sikiro.SMS.Bus訂閱隊列進行統一發送;

如果定時發送則等待Sikiro.SMS.Job進行輪循MongoDB,輪詢到時的消息則發送到RabbitMQ,再由Sikiro.SMS.Bus訂閱隊列進行統一發送。

此服務以Quartz.NET架構為基礎,通過設計可以随意增加Trigger或者服務,使其多線程或多個程序同時運作,避免資料量大了後成為發送瓶頸。

此服務不直接做短信發送,隻是觸發器的存在,通過RabbitMQ進行解耦,避免執行過程過長如果停止服務時則中斷。

無論定時、及時短信都由該服務進行發送,如果接入了新的短信營運商,隻需要停止該服務進行更新即可。停止了服務消息不會丢失,将暫存在RabbitMQ,因需對RabbitMQ的消息做持久化。

可以在不同的伺服器上部署服務,因為訂閱同一個隊列,良好的橫向擴充保證了高可用、高性能

可伸縮性指在不改變系統軟硬體設計,僅僅通過新增伺服器的情況下,就能提升系統的處理能力。

HTTP API的無狀态,在排程任務裡的MongoDB原子操作FindOneAndUpdate的使用,多消費者的訂閱都是為了可伸縮性。同時通過部署多台伺服器也可以提高高性能與高可用。

我選擇MongoDB主要原因是聚合一緻性、無模式。

雖說不需要ACID但不代表沒有一緻性,而MongoDB展現的聚合一緻性,以聚合做操作。

一組具有内聚關系的相關對象的稱為集合

則以下面兩表通過SmsId關聯讀取,寫入則兩表作為一個事務

.net core實踐系列之短信服務-架構設計

則以下面聚合方式表示,以聚合取,以聚合寫

.net core實踐系列之短信服務-架構設計

MongoDB一大特點則是無模式,意思是無需預先定義集合結構與字段類型,這展現了良好的拓展性。這是優點也是缺點,假如别的服務對該集合進行操作,在他不知情的情況下随意寫入不同類型的值,則會影響已運作的服務。

是以需要将此作為應用服務資料庫,也就是服務化,把對集合的操作(讀與寫)以服務形式提供接口給其他服務使用。

有些人會問為什麼不把三個營運商Service也拆出來作為獨立的API服務?

回顧下現在執行流程,一次短信發送最長的調用鍊為:請求SmsApi,Sikiro.SMS.Job輪詢資料,Sikiro.SMS.Bus消費隊列消息并請求短信營運商服務。

架構上的擴充性的本質的确是拆,但是拆得過細将出現三個問題:

調用鍊過長影響性能

調用鍊過長難以定位問題

增加開發、維護成本

假如哪天短信沒發送成功,首先看看API日志看看是不是調用成功了,如果沒問題那可能JOB出問題了。如果JOB正常跑,難道是隊列問題?假如再加多一層,那就定位更加的複雜了。

就如開始所說的如果添加一個短信營運商隻需要添加一個Service利用工廠模式,就可以良好的拓展了。而添加一個服務的開發、部署、維護成本無疑是比在元件内擴充的成本高。

該篇描述我的架構設計,下篇會正式對各個服務的實作進行講解。如果您有更好的建議可以在下方評論回報給我。

我的部落格即将搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=jjdhw6o619ra

作  者:

陳珙

出  處:http://www.cnblogs.com/skychen1218/

關于作者:專注于微軟平台的項目開發。如有問題或建議,請多多賜教!

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。

聲援部落客:如果您覺得文章對您有幫助,可以點選文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!