記從0到一周內(nèi)快速上線的項(xiàng)目

記從0到一周內(nèi)快速上線的項(xiàng)目

介紹

最近一周多肝了一個(gè)排疫系統(tǒng),從 0 到正式上線,包括了小程序 + 三個(gè)移動(dòng)端用戶模塊 + 兩個(gè)后臺(tái)管理系統(tǒng),實(shí)在是肝疼。項(xiàng)目的開(kāi)發(fā)就兩個(gè)人從刀耕火種開(kāi)始o(jì)rz。在系統(tǒng)層面,整個(gè)項(xiàng)目保證了業(yè)務(wù)的可用性,并且包含了基本可用的服務(wù)監(jiān)控,日志記錄等功能,同時(shí)支持業(yè)務(wù)量繼續(xù)增大時(shí)的水平橫向擴(kuò)展,還手寫了個(gè)簡(jiǎn)陋的自動(dòng)化部署腳本來(lái)實(shí)現(xiàn)藍(lán)綠發(fā)布。不得不說(shuō),就算是個(gè)人開(kāi)發(fā),沒(méi)有完善的基礎(chǔ)設(shè)施,靠著各種云上的基礎(chǔ)服務(wù)也能基本做到快速迭代上線了,該有的功能都有了。

最近一周手忙腳亂,就記錄一下整個(gè)項(xiàng)目的開(kāi)發(fā)和收獲吧,如何在有限的時(shí)間內(nèi)盡可能的提升開(kāi)發(fā)速度,以及如何快速低成本的方法保證線上服務(wù)的穩(wěn)定性。

技術(shù)選型

開(kāi)發(fā)共計(jì)兩個(gè)人,為了快速開(kāi)發(fā),肯定就選最熟悉的一套技術(shù)棧就完事了,JS 一把梭。前端直接用了 Vue + element-ui,同時(shí)做了一些優(yōu)化來(lái)直接適配移動(dòng)端,后端服務(wù)采用 Node.js + Mongodb + Redis 進(jìn)行快速開(kāi)發(fā)。簡(jiǎn)單的理解需求就是兩個(gè)管理后臺(tái)來(lái)輸入數(shù)據(jù),如通過(guò) excel 導(dǎo)入或直接新增,并且管理各種用戶數(shù)據(jù)。而移動(dòng)端則基于這些數(shù)據(jù)為特定人群提供定制化的服務(wù),此外需求還會(huì)隨著時(shí)間不斷變化,因此該項(xiàng)目無(wú)論是前端還是后端都有較大的工作量。

項(xiàng)目架構(gòu)

項(xiàng)目給配了 SLB,后端給了兩臺(tái) ECS,沒(méi)有 CDN,沒(méi)有 OSS。為了方便項(xiàng)目快速開(kāi)發(fā)迭代,我們考慮直接把完整的前后端應(yīng)用都在 ECS 上部一套,并且寫了個(gè)自動(dòng)化部署的腳本,在保證所有后端服務(wù)無(wú)狀態(tài)的情況下,可以在用戶量增大時(shí)方便的進(jìn)行水平擴(kuò)容。

  • SLB

  • 所有請(qǐng)求走 SLB 做四層負(fù)載均衡到達(dá) ECS。同時(shí) SLB 來(lái)處理 https 協(xié)議的解析和 http 重定向到 https。此外,利用 SLB 的健康檢查機(jī)制,可以在沒(méi)有其他基礎(chǔ)設(shè)施的情況下,很方便的實(shí)現(xiàn)平滑的藍(lán)綠發(fā)布。

  • ECS

  • 每臺(tái) ECS 都部署完整的前后端服務(wù)。通過(guò) Nginx 代理靜態(tài)資源,同時(shí)對(duì) Node.js 服務(wù)做反向代理。簡(jiǎn)單的 node 進(jìn)程性能的監(jiān)控直接用 pm2 monitor 來(lái)查看了,同時(shí)接入了阿里云 SLS 日志服務(wù),收集了每臺(tái) ECS 上的 nginx 日志,同時(shí)在 Node.js 項(xiàng)目中對(duì)關(guān)鍵性操作記錄進(jìn)行日志打點(diǎn)。

  • 實(shí)現(xiàn)了自動(dòng)化的部署腳本,來(lái)配置每臺(tái) ECS 的依賴環(huán)境,拉取 git 代碼,自動(dòng)部署服務(wù)。

  • MongoDB 集群

  • 多節(jié)點(diǎn)副本集保證服務(wù)的高可用,同時(shí)寫了個(gè)定時(shí)腳本,每天定時(shí)備份 MongoDB 數(shù)據(jù)。

  • Redis 集群

  • 主要做熱點(diǎn)數(shù)據(jù)的緩存,以及 Node.js 服務(wù)集群間的狀態(tài)同步,比如手機(jī)驗(yàn)證碼服務(wù),定時(shí)任務(wù),回調(diào)任務(wù)等。

image.png

系統(tǒng)架構(gòu)圖

業(yè)務(wù)快速開(kāi)發(fā)

作為一個(gè)排疫系統(tǒng),開(kāi)發(fā)時(shí)間緊迫,而且政策還老是變,太難了。

前端

VUE + Element-ui 可以很方便的開(kāi)發(fā)管理后臺(tái)的項(xiàng)目。但是項(xiàng)目的管理員也會(huì)有用手機(jī)操作管理后臺(tái)的需求,因此我們對(duì) Element-ui 做了一些移動(dòng)端的優(yōu)化。此外,基于 VUE,可以快速的實(shí)現(xiàn)一些業(yè)務(wù)功能,而整個(gè)系統(tǒng)沒(méi)有非常復(fù)雜的前端業(yè)務(wù)邏輯,因此可以保證一定的開(kāi)發(fā)速度。

小程序

顯而易見(jiàn),小程序如果再單獨(dú)做一套原生的,一周肯定來(lái)不及,所以直接內(nèi)嵌 WebVIew 做了個(gè)首頁(yè)導(dǎo)航頁(yè)面來(lái)實(shí)現(xiàn)。

后端

直接用了我比較熟悉的 Node.js。之前我也有寫過(guò)一個(gè)基于 KOA 的輪子 koa-swagger-decorator(https://github.com/Cody2333/koa-swagger-decorator) 集成了接口參數(shù)校驗(yàn)和 swagger 接口文檔生成。

不得不說(shuō)這個(gè)庫(kù)非常適合這種需要光速開(kāi)發(fā)的項(xiàng)目,同時(shí)還能提供實(shí)時(shí)同步的接口文檔,大大提升了開(kāi)發(fā)的效率。采用 MongoDB 主要也是因?yàn)樗姆奖?,沒(méi)什么復(fù)雜事務(wù)的需求,業(yè)務(wù)中的字段還會(huì)不斷增刪改,修改起來(lái)方便了很多。

Node.js 服務(wù)水平擴(kuò)容

文件上傳下載

實(shí)現(xiàn)水平擴(kuò)容核心就是保證服務(wù)的無(wú)狀態(tài)。項(xiàng)目沒(méi)有提供 OSS 數(shù)據(jù)存儲(chǔ),本身也只有上傳導(dǎo)出 excel 的文件功能,因此基于 stream 的上傳下載文件就能滿足需求。

下載流時(shí)序圖
image.png

定時(shí)任務(wù)

分布式集群的 Node.js 服務(wù)需要依賴外部的服務(wù)來(lái)做各個(gè)進(jìn)程間的狀態(tài)同步。對(duì)于集群部署的 Node.js 應(yīng)用,我們需要保證每次只有一個(gè)進(jìn)程執(zhí)行一次定時(shí)任務(wù)即可,防止定時(shí)任務(wù)的重復(fù)執(zhí)行。最簡(jiǎn)單的解決方法就是引入 Redis 的分布式鎖(redlock)來(lái)保證只有一個(gè)進(jìn)程來(lái)執(zhí)行定時(shí)任務(wù)。

線上發(fā)布流程

項(xiàng)目不僅上線的很匆忙,功能需求還會(huì)變,所以基本上每天都得發(fā)布多個(gè)版本。所以要簡(jiǎn)單解決這幾個(gè)問(wèn)題:

線上服務(wù)的平滑升級(jí)

由于有兩臺(tái) ECS 全量部署了我們的服務(wù),所以我們可以來(lái)做藍(lán)綠部署,先下線一臺(tái) ECS 部署新服務(wù),部署完成后再加入 SLB,保證線上服務(wù)在發(fā)布升級(jí)的時(shí)候不會(huì)中斷。

部署流程圖
image.png

我采用了最方便的方法,利用 SLB 的健康檢查接口來(lái)做平滑的升級(jí)部署。如果直接停掉一臺(tái)服務(wù)器,那么 SLB 依然需要多次的健康檢查判斷才會(huì)摘除下線服務(wù)器,這會(huì)導(dǎo)致有一部分流量的請(qǐng)求產(chǎn)生 502 錯(cuò)誤。此外,就算沒(méi)有新的流量,我們依然要等待現(xiàn)有連接的請(qǐng)求處理完再優(yōu)雅的下線服務(wù)。因此,先將健康檢查接口返回錯(cuò)誤,等待一段時(shí)間后再停服務(wù)就算是一種簡(jiǎn)單的實(shí)現(xiàn)了。

線上服務(wù)監(jiān)控

項(xiàng)目的服務(wù)商給了服務(wù)器,但沒(méi)有給控制臺(tái)的權(quán)限,所以就只做了一些簡(jiǎn)單的監(jiān)控,這部分還很不完善。 Node 應(yīng)用就用了 PM2 自帶的 monitor 來(lái)監(jiān)控。主要接了阿里云的 SLS 來(lái)做日志的收集和分析,保證出現(xiàn)異常的時(shí)候能快速定位問(wèn)題。

  • PM2 Monitor
  • SLS 日志
  • TODO

存在的問(wèn)題

  • 緩存問(wèn)題。因?yàn)榘l(fā)版很快,功能變化頻繁,而微信瀏覽器和小程序 webview 中的緩存比較頑固,這個(gè)短時(shí)間沒(méi)找到很好的解法,只能盡量保證服務(wù)升級(jí)時(shí)對(duì)于原有業(yè)務(wù)的兼容性,保證后端服務(wù)可回滾可灰度。
  • 瀏覽器兼容性問(wèn)題。依然時(shí)間所限,也沒(méi)有那么多設(shè)備測(cè)試,只能提個(gè)問(wèn)題解決一個(gè)。

最后

隨便想到什么就寫了點(diǎn)東西。感謝隊(duì)友。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容