目錄:
專案架構介紹
感言跟後記
這邊主要是針對專案做整個概覽,之後的其他篇章會紀錄學習筆記跟遇到的一些困難,開發大約2週多,邊做邊學。
專案架構概覽
主要功能:推文以及跟推文的互動、通知系統
小目錄
* 測試
* 服務一覽
* 資料庫架構一覽
* 資料同步--Event Bus
* 通知系統
測試
我很討厭手動測試,所以我在開發的時候就會同時把測試搞定,這樣可以幫我省下超多麻煩,之前在實習有寫過Jest,這邊直接沿用:
資料夾架構:
-- 某服務資料夾
-- routes
-- __test__
-- test
-- setup.ts
-- subscribes
-- __test__
github:
善用git action自動在Pull Request時幫我們運行測試,確保測試皆通過無虞
服務一覽
資料庫架構 Redis/MySQL/MongoDB
資料同步 — Event Bus
不同服務之間的資料同步,採用async的方式,減少不同服務之間的依賴性,這邊選用RabbitMQ來實作,選用Direct的Exchange,用Broadcast子集的方式把同一個訊息發給所有感興趣的服務:
以下是整個專案中會有的所有事件:
為了解決concurrency問題,使用版本來控制,只會處理後一個版本的任務,否則不ack,請rabbitmq之後在push一次。
findByVersionOrder(event: {
id: string;
version: number;
}): Promise<TweetDoc | null>;
通知系統
Build-notification server會subscribe一些資源的增刪改,並做3件事:
- 整理要通知的userIds
- 整理成統一格式
- Publish to notification:created queue
接著,Notify Server來接力,這個服務主要處理通知的即時互動,還有通知的歷史資料,這邊使用Socket.io,當收到notification:created的任務後,會做3件事:
- 根據userIds 找出對應要通知的socketIds
- 將通知存在資料庫,用於記錄通知歷史資料
- Emit給這些socketIds對應的通知訊息
這台Server處理的事可以直接看下圖:
K8S
算是為了學這個來做這個專案吧,還記得出國前跟一位IBM的架構師聊天,他提到DevOps對於後端是未來的趨勢,必學的,一直放在心上XD
為了更好的管理不同服務,這邊使用了K8S的各種物件:
- 管理Container:Deployment
- 開放內部訪問:Service
- 開放外部訪問、Routing:Ingress
- 處理敏感資訊(Credential)跟服務需要使用的環境變數:Secret, ConfigMap
而為了簡化繁瑣的rebuild image, push image, rollout restart deployment…使用了skaffold。
感言跟後記
感謝Microservices-with-nodejs-and-react這堂課讓我對微服務有一個基本的認識,也太迫不及待想要練習看看了,所以這個專案就誕生了,每次都可以發現自己的不足還有好多,好多好深的東西都需要時間跟經驗去慢慢累積,不過有趣的地方就是在於還有很多的進步空間,雖然看起來有點可怕,看到其他大神對於他們產品遇到的問題寫的解決方案Blog也是甘拜下風,真希望我也可以像他們一樣厲害,總覺得自己好像缺少了什麼,有時會因為學的越多而越感到自己的不足,但是回頭看自己確實不斷地在進步跟成長!
剛從Alpha Camp畢業的時候Typescript正開始要在台灣軟體業普及,當時我只有聽過而已,但沒想到不到一個月我找到了實習,而實習的時候就是直接用TS來開發,也讓我大愛他,現在根本不是沒有他不行..
實習的時候我感覺好像沒有時間做有深度的學習,雖然能夠根據需求把東西做出來,像是產生結帳報表、串接Lalamove Webhook,但我好像沒有做到真的去搞懂整個背後的全部東西,這也是我不斷在反省跟警惕自己的部分,但我困惑的是,要了解多少?串接Webhook的時候要去了解整個Webhook的運作原理嗎?要了解到哪?
其實還是要回到選擇,要先排序好想要研究的東西,一步一步來,雖然有些人會崇尚所謂的multiple task skill,但對於我來說,我喜歡專注在研究一個東西上,研究完再換下一個,Otherwise I will feel overwhelming.. 就像Context switch一樣是很耗能又耗時的..
但是礙於時間的緊迫,我又會沒耐心,學習果然是一個哲學..但經驗告訴我一次專注在一個會更有效率><
好像離題了XD拉回正題,這次的專案給我的感覺大概是:
while ("not finish project")
do
OMG WTF?!
Ohhhhh interesting
end
感覺像是撿到了新的天賦頁,拿到了解鎖天賦的資格,但是還要往下挖深..(大家應該都蠻有感的吧?對吧!?
總之蠻開心的啦,可以把他寫完,又學到新東西!!!!像是如何用Jest的Mock(我還學到腦袋很煩就跑去stackoverflow回答別人對jest mock的疑難雜症XD)
之前完全不會什麼Docker, 更不用說K8S了,好好笑,當初想說來拆成微服務吧!結果一開始超好笑的,雖然蠻正常的也很多人在探討這個,就是多個服務存取同一個資料庫,我那時還很開心想說Ya我用Docekr compose弄完了誒!
Oh Not cool,Access same Database?
Mmm.. What can I do? -> Start research… N年之後..
之後就是你看到的結果了><
這邊列出3可以優化方向,之後可以來做做,當然這個專案實在有太多的進步空間了拉腦袋一下就蹦出一堆了,所以為了收斂就先列三個吧:
- 利用Volume (K8S PV, PVC)來做到資料永久化
- 部署到雲端
- 付費內容(練習串接金流)