2024-07-20|閱讀時間 ‧ 約 27 分鐘

技術筆記-後台實戰001-玩轉系統架構,設計一個背景服務,低成本,可容錯

打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。


下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高,且很類似的工作。這時一個 web app 就是很好的解決方案,所以就要再學 flask 這種東東,寫好程式並部署到雲端後,就可以打開瀏覽器,輸入網址和參數,啟動相關工作,獲得處理結果。


下一步,覺得系統那麼被動實在不夠好,每次都要從網頁發出請求才能得到回應,能不能 24 小時都活著,自動執行一些監控或檢測的任務,遇到特定條件才發出通知,像 Line 或 Email 等方式,這樣連網頁都不用開,直接得到結果,若需執行對應動作也可有所依據。這一步門檻就比較高一些了,多年來摸索多種方式並不斷優化,直到最近突然發現,這些很土炮的方式,竟然也達到高可靠度,幾乎是企業級的水準了。


回想以前在企業內,想要安排「排程作業」,可以有許多伺服器的解決方案,不論是 oracle 資料庫系統或是 sql server 都有相對應的解決方法,有昂貴的硬體和系統管理人員妥善的維護,當然不成問題。若要更靈活的任務內容,也曾用過 dot net 平台的 background service 做過,這裡還一篇 [老文章] 紀錄此事,或用第三方套件如 hangfire。但自從 2020 年底離開企業成為獨立開發者,嚴重感受到精簡技術和控制成本的必要,所以雖知公有雲平台有著許多好用的服務,但是就盡量少用或備而不用,因為用越多付越多,然後沒有經濟效用,玩程式若成為昂貴的興趣,那也無法支持太久,因此到目前為止,只用了 azure 免費層級的 app service,連 SQL server 都砍掉不用了,少數儲存的需求則轉用 google firestore database,且都維持在免費層級。技術方面也已經捨棄 dotnet 這種比厚重的運算平台,只用 python,之前雙軌並進的 nodejs 也逐漸被擺入冷宮,生活簡單一點好。


其實要啟動一個 background service 並不難,隨便問一下 chatgpt 就會了吧,但在實際應用時,光寫出單一程式是遠遠不夠的,因為關鍵是啟動之後能「穩定持續」的維持健康狀態,那就需要好的架構來支持。若是把它寫在 web server 的執行環境,只要 server 活著就可以,其實若花一點雲端費用,這樣就可以了。無奈的是我的免費層級的服務,竟然會在一段時間未使用後休眠,想要保持 always on 必須付費,所以要挑戰極低成本的我,就只好另找出路了。


我的腦筋動到 browser 身上。幾乎所有人都只把 browser 當成 client,但我就是硬要逆向思考,既然 browser 運算能力也是強的很,為何它不能當 server?當然可以!所以我就讓 server 端維持被動等待,由一個特定的 client 端與之搭配,每隔幾分鐘去呼叫 server 一次,這樣也就幾乎達成了我的目的了。如下:

// 此段程式會設定一個​持續監控的程序,每 60 秒執行一次 heartBeat() 子程序
activateHeartbeat(): void {
this.heartBeat();
this.intervalId = setInterval(() => {this.heartBeat();}, 60000);
}

// 網頁關閉時記得清除排程
ngOnDestroy() {
if (this.intervalId) {
clearInterval(this.intervalId);
}
}

搭配簡單的 UI 設計,我就得到了系統心跳的主控台,在排定的時間,系統自動執行抓資料,比較規則,並快取一部分最即時的資料,讓其他的 client 可以分享:

這個 browser 是由家中一台閒置的 windows 電腦擔任的,這樣跑一陣子之後,不意外的經常「死很久後」才發現,不僅是因為 windows 不定時強迫更新,也可能是因為老舊電腦愛當就當。而讓架構失效的主因是,發現時經常就是正需要使用的時候,讓實用性完全喪失。


這樣有一搭沒一搭的一陣子之後,還是手癢想把它改好,想到聖經的話「有人能打勝孤身一人,若有二人便能抵擋他;三股合成的繩子,不容易折斷。」(傳道書 4:12),何不再加入一個 browser,成為鐵三角架構!所以系統架構就變成這樣:

這互相搭配合作的架構,時間戳記非常重要,兩個 browser 每次呼叫時均會在 server 端留下戳記,當時間差不小於本身排程頻率,代表「夥伴罷工了」;這時本身還維持運作,只是架構處於脆弱狀態,需要即時發出警訊:

在此狀態下,只要在方便的時間,去處理第二台 browser,或是緊急時開啟任何一台電腦的 browser,就可恢復兩個衛兵互相確認的架構,消除脆弱警示,整個過程服務都不中斷,哇!這樣可靠度已經超高了耶,兩台同時死掉的機率微乎其微啊,而且手邊任何一台電腦,甚至手機瀏覽器也可以成為 service 鐵三角的一部分,這個架構超穩的。


以上,不知看官們是否有欣賞到其中的美感?在這資訊技術深刻影響人類生活的時代,我相信開發人員擁有的「槓桿」能力是很大的,用單純但適合的技術,搭配不受限的想像力和對領域應用的熱情,也可以做出企業等級的應用。


總有一天我會銷售我的系統,用 app 或是網頁伸出觸角都有可能,只是也許當成功銷售的那一天,我已經不再需要那些營業額了,儘管現在似乎有點需要!但志氣告訴我,唯一要做的只是要證明,我做的東西有價值且有技術內涵,而這產品真正可以幫助我創造出真金白銀的價值。獨立開發超過 1000 個日子,我雖仍微小,但鬥志見增長。


Newman 2024/7/20

導覽頁:紐曼的技術筆記-索引



分享至
成為作者繼續創作的動力吧!
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

newman的沙龍 的其他內容

你可能也想看

發表回應

成為會員 後即可發表留言
© 2024 vocus All rights reserved.