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

閱讀時間約 6 分鐘

打開 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

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



11會員
90內容數
漫步,悠閒自在的隨意行走!是行為,是態度,也是一種境界。
留言0
查看全部
發表第一個留言支持創作者!
newman的沙龍 的其他內容
查景點,美食,導航,這些功能已經深深融入我們的生活了,背後著要的技術支柱就是科技巨頭所提供的龐大全球地圖資料庫,和隨身手機上的 GPS 定位功能,這是 App 的強項,非玩不可。 需求情境: 在陌生的城市探索,最常用到的地圖功能是什麼?找星巴克是我的第一名,第二是享受更多功能的便利商店,再其次就
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
需求情境: 一般的看盤軟體,雖然都能針對一籃子自選股票,列出其即時行情和當天漲幅,但若要看「五日漲幅」呢?那就少見了,但這對我很重要。因為小部位的波段性價差交易是個好策略,這時候若能排序好一整排看下來,可以節省大量點來點去的成本,很有價值,所以就來自己刻。 解決方案: 從大處著眼,UI 最外層
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
技術筆記-用 python 操作 google firestore 的基本方法 (2023/12/26) 技術筆記-以 nodejs 為後台,以 google sheet 充當資料庫 (2022/11/29)
查景點,美食,導航,這些功能已經深深融入我們的生活了,背後著要的技術支柱就是科技巨頭所提供的龐大全球地圖資料庫,和隨身手機上的 GPS 定位功能,這是 App 的強項,非玩不可。 需求情境: 在陌生的城市探索,最常用到的地圖功能是什麼?找星巴克是我的第一名,第二是享受更多功能的便利商店,再其次就
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
需求情境: 一般的看盤軟體,雖然都能針對一籃子自選股票,列出其即時行情和當天漲幅,但若要看「五日漲幅」呢?那就少見了,但這對我很重要。因為小部位的波段性價差交易是個好策略,這時候若能排序好一整排看下來,可以節省大量點來點去的成本,很有價值,所以就來自己刻。 解決方案: 從大處著眼,UI 最外層
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
技術筆記-用 python 操作 google firestore 的基本方法 (2023/12/26) 技術筆記-以 nodejs 為後台,以 google sheet 充當資料庫 (2022/11/29)
你可能也想看
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
對於熱愛寫作與閱讀的你,數位轉化手寫筆記是一種提升思考深度和連結性的方法。透過將書目卡上的想法轉存到數位筆記庫,如Obsidian,你的思考將更加結構化且相互關聯。這不僅是一種技術操作,而是一種深思熟慮後的策略,讓每一張書目卡成為你智識成長的催化劑。下面,我將分享三個因數位轉化筆記後心態上的變化,這
Thumbnail
新手投資理財看過來,想要財富自由先從寫「賺錢筆記」開始,不需要多專業的知識,只要做到基本的「儲蓄」、「節約、「投資」就能成功,任何人在任何情況下,都有辦法輕鬆實踐,只要每天花一分鐘紀錄筆記,就能幫助你脫胎換骨,變成一個會理財的人。
Thumbnail
卡片筆記的標題,對應著卡片筆記的類型,與卡片內容的資訊顆粒度。 卡片筆記的標題,也決定了我們的Obsidian筆記庫的生長是否有序。 好的卡片筆記標題,能讓Obsidian的連結功能更加強大,讓我們的知識工作完成得更快更好。 在我製作了7600+份Osidian的數位筆記以後,我總結出最實用的3種卡
Thumbnail
看書時常常看不懂作者想表達什麼嗎? 我在16年前,還是一個高中生的時候,也是都看不懂書的內容。 但我最近這半年發現了一個超強的閱讀筆記作法,就是 用「前因+做法+後果」梳理資訊與論據 具體而言,讀任何一段文字,一本書的一個段落,我們都能用 前因:這段文字的作者,為何而寫? 改變:這段文字的作者,提供
Thumbnail
華爾街股市4大指數開盤走跌,不料隨後上演「大奇蹟之日」嚇壞投資人。 美國13日公布最新通膨數據,高於預期,引發市場憂心聯準會將擴大升息,對抗通膨。華爾街股市隨後開盤低,4大指數皆挫跌。美股道瓊工業指數開盤下跌1.56%;標準普爾500指數下挫2.1%;那斯達克指數挫跌2.74%點;費城半導體指數則下
Thumbnail
曾經我收到任務經常會一股腦兒地先列起來,將其安排到每一天,再逐一完成它,然而用這樣的方式做筆記,時常遇到「事情做不完,或是記了資訊後,過幾天卻看不懂,對生活或工作沒有實質上的幫助」。「待辦清單之所以變成壓力清單,是因為你的筆記缺少了『轉化』」老師說道,因此接下來我將要分享讓我受益良多的重點。
Thumbnail
互惠(The Reciprocity) 為何你不該讓人請喝東西? 人類其實很難抵擋虧欠感,接受過別人的恩惠後,總是會想著改天有機會要回報對方。例如:熱情的鄰居特別上門送你自己烘烤的點心,事後你心中總是會惦記這件事,特別找了時間回贈禮物,即使當初你不是很喜歡這家鄰居。 為何你不該留戀過往。 例如:
Thumbnail
IG: meltycrys.art 什麼是藝術筆記呢? 原來這外國玩意,和一般的治療活動, 有相同功效。就是art journal,本身可以透過圖案模 片、墨水、壓克力,以及印章、發黃書紙、蝶古巴特的昂貴物料, 製作成表達內心世界的日記。它並不限制,如何畫出任何如 充滿稚氣、或意境優美等,的手法和物
Thumbnail
今年二度強勢回歸登場,短短四天(2020.1.16~1.19)的展期中,以五大展區規畫及呈現,並輔以多場藝術家與資深產業人主講的座談、以及安排14場長度40分鐘的中/英文公眾導覽;讓這場藝術盛宴的參與者得以更聚焦、深入地充實並汲取當代藝術的潮流及養分。
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
對於熱愛寫作與閱讀的你,數位轉化手寫筆記是一種提升思考深度和連結性的方法。透過將書目卡上的想法轉存到數位筆記庫,如Obsidian,你的思考將更加結構化且相互關聯。這不僅是一種技術操作,而是一種深思熟慮後的策略,讓每一張書目卡成為你智識成長的催化劑。下面,我將分享三個因數位轉化筆記後心態上的變化,這
Thumbnail
新手投資理財看過來,想要財富自由先從寫「賺錢筆記」開始,不需要多專業的知識,只要做到基本的「儲蓄」、「節約、「投資」就能成功,任何人在任何情況下,都有辦法輕鬆實踐,只要每天花一分鐘紀錄筆記,就能幫助你脫胎換骨,變成一個會理財的人。
Thumbnail
卡片筆記的標題,對應著卡片筆記的類型,與卡片內容的資訊顆粒度。 卡片筆記的標題,也決定了我們的Obsidian筆記庫的生長是否有序。 好的卡片筆記標題,能讓Obsidian的連結功能更加強大,讓我們的知識工作完成得更快更好。 在我製作了7600+份Osidian的數位筆記以後,我總結出最實用的3種卡
Thumbnail
看書時常常看不懂作者想表達什麼嗎? 我在16年前,還是一個高中生的時候,也是都看不懂書的內容。 但我最近這半年發現了一個超強的閱讀筆記作法,就是 用「前因+做法+後果」梳理資訊與論據 具體而言,讀任何一段文字,一本書的一個段落,我們都能用 前因:這段文字的作者,為何而寫? 改變:這段文字的作者,提供
Thumbnail
華爾街股市4大指數開盤走跌,不料隨後上演「大奇蹟之日」嚇壞投資人。 美國13日公布最新通膨數據,高於預期,引發市場憂心聯準會將擴大升息,對抗通膨。華爾街股市隨後開盤低,4大指數皆挫跌。美股道瓊工業指數開盤下跌1.56%;標準普爾500指數下挫2.1%;那斯達克指數挫跌2.74%點;費城半導體指數則下
Thumbnail
曾經我收到任務經常會一股腦兒地先列起來,將其安排到每一天,再逐一完成它,然而用這樣的方式做筆記,時常遇到「事情做不完,或是記了資訊後,過幾天卻看不懂,對生活或工作沒有實質上的幫助」。「待辦清單之所以變成壓力清單,是因為你的筆記缺少了『轉化』」老師說道,因此接下來我將要分享讓我受益良多的重點。
Thumbnail
互惠(The Reciprocity) 為何你不該讓人請喝東西? 人類其實很難抵擋虧欠感,接受過別人的恩惠後,總是會想著改天有機會要回報對方。例如:熱情的鄰居特別上門送你自己烘烤的點心,事後你心中總是會惦記這件事,特別找了時間回贈禮物,即使當初你不是很喜歡這家鄰居。 為何你不該留戀過往。 例如:
Thumbnail
IG: meltycrys.art 什麼是藝術筆記呢? 原來這外國玩意,和一般的治療活動, 有相同功效。就是art journal,本身可以透過圖案模 片、墨水、壓克力,以及印章、發黃書紙、蝶古巴特的昂貴物料, 製作成表達內心世界的日記。它並不限制,如何畫出任何如 充滿稚氣、或意境優美等,的手法和物
Thumbnail
今年二度強勢回歸登場,短短四天(2020.1.16~1.19)的展期中,以五大展區規畫及呈現,並輔以多場藝術家與資深產業人主講的座談、以及安排14場長度40分鐘的中/英文公眾導覽;讓這場藝術盛宴的參與者得以更聚焦、深入地充實並汲取當代藝術的潮流及養分。