[FollowMe8][B01] 設計這樣的系統,第一步該想什麼?

設計這樣的系統,第一步該想什麼?

上一篇把設計條件想清楚了:不需帳號、掃碼加入、只傳當下位置、活動結束資料消失。

聽起來只有四條,但攤開來看,每一條都在排除我們習慣的做法。


四個條件,四個限制

不需帳號,意味著不能用傳統的帳號密碼系統。沒有 email 驗證、沒有 OAuth(一種透過 Google / Apple 帳號快速登入的技術),也沒有「忘記密碼」這回事。使用者打開 App 就要能用。

掃碼加入,意味著活動裡的成員識別不能靠帳號,得靠別的東西。我需要一個臨時的認證機制,讓陌生人能在現場加入同一個活動。

只傳當下位置,意味著 Server(負責接收和轉發資料的主機)不需要儲存歷史軌跡。它只要知道「這個人現在在哪」,不需要知道「這個人去過哪」。

活動結束資料消失,意味著資料的生命週期要跟著活動走。活動結束,資料就該清掉——不是標記為已刪除,是真的不在了。

四個設計條件,不是功能清單,是限制條件。每一個限制都排除掉一部分現成的做法,剩下來的選項,才是真正需要決定的事。

從設計條件開始規劃系統


系統的輪廓與關鍵決定

把限制條件攤開之後,系統需要的四個部分大致浮出來了:Client(手機端 App)Server(中繼站)資料庫、以及串起兩端的通訊協定

這四個部分的關係其實不複雜:手機取得 GPS 位置傳給 Server,Server 轉發給同活動的其他人,手機收到後顯示在地圖上。活動結束,資料就清掉。

系統架構概覽

看起來簡單,但每一個部分背後都藏著選擇。而且有些決定會影響後面所有的選擇,順序搞錯就得砍掉重來。

我最後理出來的決策順序是這樣的:

第一個決定:Server 自己架,還是用別人的?

Firebase(Google 的雲端開發平台)能讓你不用管伺服器,直接寫 App。那為什麼不選最簡單的路?

最大的原因是成本風險:Firebase 按流量計費,初期測試階段流量小可能感覺不到,但萬一哪天流量爆增,帳單就不是自己能控制的了。加上我剛好有現成的主機和網域,自己寫的 Server 掌控性也最高——效能調校、抓蟲、資料怎麼存怎麼刪,全部自己說了算。

這個決定一旦下了,後面的技術選型全部跟著走。

第二個決定:既然自己架,Server 語言跟資料庫怎麼選?

Server 用 Go。Go 天生擅長處理大量同時連線,而且編譯後就是一個單獨的執行檔——部署到伺服器上就是放一個檔案、跑起來,不用額外裝環境。一個人管伺服器,簡單就是正義。

資料庫用 MySQL + Redis。MySQL 負責存活動、成員、Token 這些需要長期保留的結構化資料。Redis 則專門存即時位置——它的讀寫速度極快,而且可以設定資料「自動過期」,時間一到自己消失,完美配合「位置資料不留存」的設計條件。

第三個決定:沒有帳號,怎麼識別成員?

傳統做法是帳號 + 密碼,或者 OAuth。但我們不要帳號。那用什麼?Token——一組臨時代碼,掃碼或手動輸入就能加入活動。這個決定直接簡化了資料庫——不用設計帳號密碼表,也改變了 API 的認證方式。

第四個決定:手機和 Server 怎麼溝通?

WebSocket(維持持續連線的技術)即時性好,但手機長時間連線耗電量大。HTTP Polling(每隔固定時間主動向伺服器詢問)延遲幾秒,但省電得多。對於戶外活動的場景來說,手機電量是命,所以寧可接受延遲。

第五個決定:App 怎麼寫?為什麼不用跨平台框架?

這部分必須是 iOS 和 Android 雙平台同時開發。為什麼不先做一個平台試水溫?因為這是群體工具。只要車隊裡有一個人拿 Android,而你只做了 iOS 版,那個人整趟旅程就隱形了(或者整個車隊都不能用這套工具)。要讓「臨時加入同一個群體」這件事成立,就不能挑手機。

既然一定要雙平台,為什麼不用 React Native 或 Flutter 這種「寫一份程式碼蓋兩個平台」的省事做法?

因為這個 App 的核心是地圖和 GPS。地圖套件、定位權限、背景執行——這些在每個平台的底層行為都不一樣。用跨平台框架,這些差異不會消失,只是藏到更深的地方。出問題的時候,你要同時理解框架本身和底層平台,debug 的難度是兩倍,不是一半。

所以,我選擇用各自官方的最佳實踐:iOS 用 Swift + SwiftUIAndroid 用 Kotlin + Jetpack Compose

地圖的選擇也值得一提:iOS 用 Apple 原生的 MapKit,而 Android 我選了 OSM(OpenStreetMap,開放街圖)而不是 Google Maps。原因很簡單:Google Maps SDK 也是按用量計費,而 OSM 完全免費、且開源。對於一個還在測試階段的專案,能少一個計費風險就少一個。


獨立開發者的現實

五個決定,如果是一個有完整團隊的公司在做,每一個都可以花好幾週研究、做 PoC(Proof of Concept,概念驗證)、比較方案。

但我是一個人。

一個人的意思是:沒有 DevOps(負責部署和維運的工程師)幫你管伺服器,沒有 DBA(資料庫管理師)幫你調效能,沒有資安團隊幫你做隱私合規。每一個你「選了但不夠理解」的技術,都會在三個月後變成只有你能修的坑。

所以選擇的標準不是「哪個技術最好」,是「哪個技術我能掌控」。

掌控的意思是:出問題的時候,我知道去哪裡找原因、我有能力修、修了之後我理解為什麼這樣修是對的。


系統的藍圖畫出來了,五個決定也都有了方向。接下來,就是把每個決定背後的細節攤開來看——第一個要深入的問題是:自己架 Server,實際上會遇到什麼?


想了解更多 FollowMe8 的設計故事,歡迎造訪 FollowMe8 官方網站

分類: [B] 架構奠基, FollowMe8 短期活動追蹤定位 - 開發手記,標籤: , , , , 。這篇內容的永久連結

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *