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

更新於 發佈於 閱讀時間約 7 分鐘

打開 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 可以分享:

raw-image

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


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

raw-image

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

raw-image

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


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


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


Newman 2024/7/20

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



留言
avatar-img
留言分享你的想法!
avatar-img
newman的沙龍
25會員
119內容數
漫步是一種境界。
newman的沙龍的其他內容
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2025/03/01
Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告
Thumbnail
2025/03/01
Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
從 JavaScript 到 Python
Thumbnail
從 JavaScript 到 Python
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
Widgets 服務平台 如果你不喜歡程式碼,想要快速使用,可以參考以下的服務平台,有些是免費的,有些要付費,不妨嘗試看看: Apption.co → 種類眾多,可以慢慢看、慢慢選 Indify → 我喜歡他的時鐘,很好看 (有免費數目限制) WidgetBox
Thumbnail
Widgets 服務平台 如果你不喜歡程式碼,想要快速使用,可以參考以下的服務平台,有些是免費的,有些要付費,不妨嘗試看看: Apption.co → 種類眾多,可以慢慢看、慢慢選 Indify → 我喜歡他的時鐘,很好看 (有免費數目限制) WidgetBox
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
其實要為專案建立操作介面的方式很多,除了網頁之外,還能另外寫個專門的手機 APP 連線,或是乾脆升級算法,讓我們能隨口喊一聲「嘿OO!」就搞定,不過⋯
Thumbnail
其實要為專案建立操作介面的方式很多,除了網頁之外,還能另外寫個專門的手機 APP 連線,或是乾脆升級算法,讓我們能隨口喊一聲「嘿OO!」就搞定,不過⋯
Thumbnail
介紹 類似Windows排程的一個套件,不過他有Dashboard可以看 可以用在商業用途 使用情境 簡單來說如果你需要定時的執行某一段程式就可以使用這個套件來幫你完成。 優點 Simple 開發簡易、安裝簡單、方便部署 Persistent 工作任務可存放於多種儲存裝置 任務執行方式 版本 📷
Thumbnail
介紹 類似Windows排程的一個套件,不過他有Dashboard可以看 可以用在商業用途 使用情境 簡單來說如果你需要定時的執行某一段程式就可以使用這個套件來幫你完成。 優點 Simple 開發簡易、安裝簡單、方便部署 Persistent 工作任務可存放於多種儲存裝置 任務執行方式 版本 📷
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News