Skip to content
Console

從 JavaScript 到 Golang:TREM 與 DPIP 的架構變遷

This content is not available in your language yet.

TREM 與 DPIP 從 2022 年 5 月中開始做。當時我完全不會寫程式,邊做邊學;服務也從地震慢慢擴到其他類型。 範圍變廣、系統變複雜之後,維護變難,穩定性也跟著往下掉。

這篇稿放了半年,現在才把故事寫完。要解釋 DPIP 為什麼這麼難用,得先從 TREM 怎麼長出來講起。

起點是 2022 年 3 月 23 日的花蓮地震。人在臺南,搖晃先到,警報才來。我開始想:能不能自己測,看出哪裡正在地震?學測剛考完,時間夠用,同年 5 月這個計畫就開始了。

TREM-net(TREM 地震觀測網)由三種感測器組成:

名稱 感測器 上線 說明
SE-net(Strong Earthquake) MEMS 加速度儀 2022-05-31 強震觀測網
MS-net(Micro Seismographic) 磁電式速度儀 2023-04-09 微地震觀測網
ES-net(Enhanced Sensitivity) MEMS 加速度儀 2025-11-02 增強靈敏度地震觀測網
編號 6732340 地震儀
編號 6732340 地震儀

這台用 MPU6050 + ESP32 做的,編號 6732340,放在我家。從 2022 年 5 月運作到現在(2026 年 8 月),目前仍正常運作。

SE-net 地震儀
SE-net 地震儀

上圖是裝在一般住家的 SE-net 地震儀 ver 1.0。後面幾個版本改的是供電和外殼:

  • ver 1.0:AC 110V 供電,機內降壓到 DC 5V。
  • ver 2.0:改成外部 DC 5V(一般手機充電器)。
  • ver 2.1:透明 Arduino UNO 外殼,加工比較簡單、比較好生產,體積也更小。
  • ver 2.2:第一次試 3D 列印外殼。雖然創新,但當時還沒有自己的 3D 印表機,只做了極少量,後來停產,主力還是 ver 2.1。

2022 年 5 月到 2026 年 8 月,SE-net 一直是 DPIP 即時資訊與強震監視器通知的主要資料來源。時間一久,問題也慢慢出來。2025 年 9 月,在 ttyAMA0 (GitHub @bclswl0827) 的幫助下,開始著手開發新一代 ES-net,目標是更穩定、更靈敏。

以 2026/08/25 臺灣東南部海域 M5.8 地震為例,看兩套地震儀在同一場地震的表現。

臺東縣臺東市 7725352

SE-net 地震儀
SE-net 地震儀

三軸分量

項目 EW NS UD
加速度 (cm/s²) 36.12 19.19 10.51
速度 (cm/s) 1.62 1.16 1.55

綜合指標

項目 數值
3 分量合成加速度 (PGA, gal) 39.07
3 分量合成速度 (PGV, kine) 1.65
最大計測震度 3.9
最大震度階 4 級
速度反應譜 (SVA) 3.43
長周期地震動階級 (LPGM) 0 (3.43 cm/s)
開始時間 2026/08/25 15:00:06
結束時間 2026/08/25 15:01:22
ES-net 地震儀
ES-net 地震儀

穩定性以外,雜訊也差一截:SE-net 高達 400 µg/√Hz,ES-net 則是 60 µg/√Hz。

而且不穩不只發生在強震當下。SE-net 平時就很容易斷線,工作人員得頻繁聯絡用戶,請對方把地震儀重新插拔,維運的工作量因此大很多。

高雜訊、不穩定,再加上大量雜訊誤報,是我們下定決心開發新版地震儀的主要原因。

硬體是一段辛酸史,軟體架構也沒少踩雷。時間拉回最前面,看整個系統怎麼一路長出來,也一路壞掉。

2022 年 5 月,大約高三學測剛考完,開始做 SE-net。當時完全沒有程式基礎,用 PM2 + JavaScript。現在回頭看,選 JavaScript 等於替後面埋了一串炸彈;但那時候,它是我唯一寫得動大型專案的語言。

當時沒有 AI 可以問。身邊沒有朋友或家人在做這行,也沒有人可以請教(別指望普通高中的老師,高職或許有機會)。

過程中認識了蛋捲PVP,學到很多,主要是地球科學。在蛋捲的推動下,開始在全臺各地部署 SE-net 地震儀。

同年,一位熱心人士引薦,認識了 CWB 地震測報中心科長陳達毅。從他那邊學到非常多 EEW 系統的知識,12 月正式與交通部中央氣象局(CWB)簽約合作。

簽約半年後,在東華大學放上第一台 MS-net 磁電式速度儀。做法很粗:ADS1115 + Geophone(4.5 Hz)+ ESP32,就這三樣,卻一直運作到現在。我覺得已經是奇蹟了。要高精度的磁電式地震儀,可以看 AnyShake。

2021 年的電腦
2021 年的電腦

當時的主力電腦是家人汰換下來的 ASUS X55V:CPU Pentium 2020M、記憶體 4GB DDR3。開個 VSCode 都卡到炸——天崩開局。SE-net 就是在這樣的環境下誕生的。沒錯,它現在還活著。再說一次:當時真的沒有 AI 可以問。

2021 年的伺服器
2021 年的伺服器

當時的主力伺服器是 AMD Ryzen 5 5600X。現在還在服役(笑),只是從主力換成打雜,負責各類非即時資料整理。

PM2 用到 2024 年初,然後大改一次:PM2 換成 Docker,Node.js 換成 Bun.js(還是 JavaScript)。改完當下,「看似」還不錯。

好景不常。幾個月後,JavaScript 沒有型別的問題冒出來。新功能一直往上疊,錯誤變得很頻繁,於是開始加 TypeScript,想把這類問題壓下來。

0403 之後,意外認識了更多人,也來了很強的外援。

個人電腦與伺服器

巨科資訊有限公司 贊助個人電腦(換掉那台 ASUS X55V)和伺服器(AMD Ryzen 9 7900X)。

地震觀測本來就冷門,這兩家願意幫忙,真的非常感激。

整個 2025 年上半年都在修修補補,沒有多少實質進展。

真正的改變在同年 9 月。在 ttyAMA0 (GitHub @bclswl0827) 的推薦下,開始嘗試 Golang,再逐步、分批把舊服務全部用 Golang 重寫(是 rewrite,不是 native port)。

效果很明顯:跟 JavaScript 比,總算能有效用上多核;記憶體用量更低;同樣的計算,CPU 用量更低;打包出來的 Image 也更小,等等。

架構也砍掉一大塊。以前太複雜、太冗餘,常常不穩。

項目 以前 現在
Balance Server Nginx 後面還有一層 Server 拿掉那層,改成 Openresty + Lua,快取控得更細
儲存 JSON SQLite(歷史遺留。嚴肅,別笑)
資料庫 MariaDB ClickHouse(波形)+ HA PostgreSQL(解算資料)
內部通訊 WebSocket NATS。不用維護健康狀態,邏輯比較簡單,也比較穩,而且本身就有異地備援

去 YouTube 翻地震紀錄影片,會發現現在延遲超級低。差在改用 Lua JIT。

新系統
新系統

地震儀裝置監控面板

舊版異地多活

兩個節點都會發報,但解算結果通常差很多。實際使用時只能固定單一節點,故障時要手動切換。

新系統

兩邊一樣都會解算,最後用仲裁決定哪個節點有發布權限(自動故障轉移)。也會自動補齊兩邊的差異測站,避免特定測站只存在單邊(例如一邊連不上)。

TREM 檢知報告

新系統
新系統

狀態監測

高一到高三,成績應該都是全校倒數(不是班排,是校排)。我其實有認真在讀書,大概吧。高中念了 4 年,大一還回高中重補修,全校大概只有我。

當時多半被當成怪人(不上課,都在胡搞瞎搞)加上廢人(成績爛)。家人一開始很生氣,後來就放棄了。他們很討厭我用 3C,希望我好好讀書,手機還被折成兩半(喜提折疊機)。經過好幾次家庭革命,才勉強能做自己想做的事。說到底,也只能說是運氣好,一路上遇到很多願意幫忙的人。