Upgrade to Pro — share decks privately, control downloads, hide ads and more …

如何在有限資源下實現十年的後端服務演進

Kewang
August 15, 2023

 如何在有限資源下實現十年的後端服務演進

Kewang

August 15, 2023
Tweet

Other Decks in Programming

Transcript

  1. Kewang • 王慕羣 Kewang • JavaScript / Java • PostgreSQL

    / MongoDB / Elasticsearch / HBase • Git / DevOps • 熱愛開源 Linkedin Linkedin kewangtw kewangtw SlideShare SlideShare kewang kewang Gmail Gmail cpckewang cpckewang Facebook Facebook Kewang 的資訊進化論 Kewang 的資訊進化論 devopsday taipei devopsday taipei '17 '17 hadoopcon hadoopcon '14 '15 '14 '15 jcconf jcconf '16 '17 '18 '16 '17 '18 GitHub GitHub kewang kewang Funliday Funliday kewang kewang modernweb modernweb '18 '19 '20 '21 '18 '19 '20 '21 coscup coscup '20 '21 '20 '21 mopcon mopcon '14 '20 '22 '14 '20 '22
  2. 8 時間軸 • 從 Parse.com 停止服務開始 • 因為 Google Maps

    API 開始收費 • 全世界的災難 COVID-19
  3. 15 在我之前 (2014/9~2018/8) • Funliday 小有一點點名氣 • 剛募到天使輪資金 • 後端從

    Parse.com 轉到 heroku+MongoDB • Google Maps API 開始收費 • Web, Android 殘破不堪
  4. 20 從開發景點資料庫開始 - 背景 (2018/9) • Google Maps API 開始收費

    – 以 Funliday 的使用方式,每個月要幾十萬台幣
  5. 21 從開發景點資料庫開始 - 背景 (2018/9) • Google Maps API 開始收費

    – 以 Funliday 的使用方式,每個月要幾十萬台幣 – 我的第一個專案就是解耦 Google Maps API
  6. 22 從開發景點資料庫開始 - 團隊 (1*2+0.5*2) • iOS 、 Web 、

    Backend 、找錢、會計: 1 • Android : 0.5 • Design : 0.5 • 景點資料庫: 1 一個在日本 part time 一個還有正職工作
  7. 28 從開發景點資料庫開始 - 實作 • OpenStreetMap :景點資料庫基礎 • PostgreSQL :關聯資料庫基礎

    • PostGIS : GIS 新手入門 • Elasticsearch :全文搜尋資料庫 • Redis : Sorted Set 實作 autocomplete
  8. 44 接手後端開發並重構 - 團隊 (1*4) • iOS 、 Web 、找錢、會計:

    1 • Android : 1 • Design : 1 • Backend : 1 都回歸團隊,還缺 Web
  9. 48 接手後端開發並重構 - 實作 • Callback hell – Node.js 早期都是使用

    callback 為主 – 持續調整為 Promise (async/await)
  10. 55 接手後端開發並重構 - 實作 • MongoDB schema 偏亂 – schema

    一開始沒有通盤規劃 – RDBMS 無法套用在 NoSQL 上
  11. 56 接手後端開發並重構 - 實作 • MongoDB schema 偏亂 – schema

    一開始沒有通盤規劃 – RDBMS 無法套用在 NoSQL 上 – 有 NoSQL 基礎,容易理解 schema 設計
  12. 72 接手後端開發並重構 - 實作 • API 沒有 RESTful – API

    全部都是 POST /actionName – 資料塞在 Request body
  13. 73 接手後端開發並重構 - 實作 • API 沒有 RESTful – API

    全部都是 POST /actionName – 資料塞在 Request body • 持續正規化 body 、 header
  14. 74 接手後端開發並重構 - 實作 • API 沒有 RESTful – API

    全部都是 POST /actionName – 資料塞在 Request body • 持續正規化 body 、 header 沒有 HTTP cache
  15. 99 有 team 的話 ... • MongoDB schema 偏亂: 1

    • API 沒有 RESTful+ 擴展 Express.js 函式: 1
  16. 105 老大哥正在看著你 - 團隊 (1*4) • iOS 、 Web 、找錢、會計:

    1 • Android : 1 • Design : 1 • Backend : 1 團隊沒有變化,還在找 Web
  17. 109 老大哥正在看著你 - 實作 • 加上 log – 原本使用 heroku

    合作的 papertrail – 因為有裝 Elasticsearch ,所以整合進 ELK stack
  18. 110 老大哥正在看著你 - 實作 • 加上 log – 原本使用 heroku

    合作的 papertrail – 因為有裝 Elasticsearch ,所以整合進 ELK stack 一開始為了省事,之後為了省錢
  19. 114 老大哥正在看著你 - 實作 • 加上 APM – Application Performance

    Monitoring – 也是使用 heroku 合作的 New Relic
  20. 115 老大哥正在看著你 - 實作 • 加上 APM – Application Performance

    Monitoring – 也是使用 heroku 合作的 New Relic – 原本要改用 Elastic APM ,但安裝失敗
  21. 116 老大哥正在看著你 - 實作 • 加上 APM – Application Performance

    Monitoring – 也是使用 heroku 合作的 New Relic – 原本要改用 Elastic APM ,但安裝失敗 一開始為了省事,之後為了省錢
  22. 134 持續加入各種功能 - 團隊 (1*5) • iOS 、找錢、會計: 1 •

    Web : 1 • Android : 1 • Design : 1 • Backend : 1 新功能上線,需要 Web 實作
  23. 140 持續加入各種功能 - 實作 • 寫遊記 – 上傳圖片: S3+CloudFront –

    縮圖功能 • 第一版使用 Lambda (Python+thumbor) • 第二版自製 image service (Node.js+sharp)
  24. 141 持續加入各種功能 - 實作 • 寫遊記 – 上傳圖片: S3+CloudFront –

    縮圖功能 • 第一版使用 Lambda (Python+thumbor) • 第二版自製 image service (Node.js+sharp) • 第三版新增 Blurhash
  25. 173 總算想到 SEO - 背景 (2019/10) • Funliday 一開始只有 App

    • 要分享給一般使用者,做了 Web • Web 開發使用 React
  26. 174 總算想到 SEO - 背景 (2019/10) • Funliday 一開始只有 App

    • 要分享給一般使用者,做了 Web • Web 開發使用 React • 沒有使用 create-react-app
  27. 175 總算想到 SEO - 背景 (2019/10) • Funliday 一開始只有 App

    • 要分享給一般使用者,做了 Web • Web 開發使用 React • 沒有使用 create-react-app • 開發模式為前後端分離
  28. 176 總算想到 SEO - 團隊 (1*5) • iOS 、找錢、會計: 1

    • Web : 1 • Android : 1 • Design 、找錢: 1 • Backend : 1 黑暗時期,連設計也要出來找錢
  29. 196 有 team 的話 ... • 重要 route 改從 DB

    : 2 • 新 route 改成 SSR : 2
  30. 206 開始導入電商 - 名詞解釋:分銷 • 在 Funliday 找商品 • 在

    Funliday 看商品細節 • 在 Funliday 結帳 • 利潤高
  31. 207 開始導入電商 - 名詞解釋:分銷 • 在 Funliday 找商品 • 在

    Funliday 看商品細節 • 在 Funliday 結帳 • 利潤高 • 各種意義上的開發成本高
  32. 208 開始導入電商 - 團隊 (1*6) • iOS 、找錢、會計: 1 •

    Web : 1 • Android : 1 • Design 、找錢、營運: 1 • Business Development : 1 ( 日本人 ) • Backend : 1 設計開始扛營運 有了一位日本 BD
  33. 218 開始導入電商 - 分銷實作困難點 • 資料庫交易 (transaction) – 避免超賣 •

    租車金額試算 (estimate) – 各家供應商算法不同 – 平日假日算法不同
  34. 219 開始導入電商 - 分銷實作困難點 • 資料庫交易 (transaction) – 避免超賣 •

    租車金額試算 (estimate) – 各家供應商算法不同 – 平日假日算法不同 – 連假算法不同
  35. 220 開始導入電商 - 分銷實作困難點 • 資料庫交易 (transaction) – 避免超賣 •

    租車金額試算 (estimate) – 各家供應商算法不同 – 平日假日算法不同 – 連假算法不同 – 連續租 n 日算法不同
  36. 221 開始導入電商 - 分銷實作困難點 • 資料庫交易 (transaction) – 避免超賣 •

    租車金額試算 (estimate) – 各家供應商算法不同 – 平日假日算法不同 – 連假算法不同 – 連續租 n 日算法不同 – ... 等
  37. 244 開始導入電商 - 分銷營運困難點 • 票券及一日遊有無限組合,上架困難,舉例: – 平日 299 元、假日

    399 元 – 大人票 299 元、小孩票 199 元 – 一個小孩一定要配一個大人
  38. 245 開始導入電商 - 分銷營運困難點 • 票券及一日遊有無限組合,上架困難,舉例: – 平日 299 元、假日

    399 元 – 大人票 299 元、小孩票 199 元 – 一個小孩一定要配一個大人 – 七八月第一週假日特價 99 元
  39. 246 開始導入電商 - 分銷營運困難點 • 票券及一日遊有無限組合,上架困難,舉例: – 平日 299 元、假日

    399 元 – 大人票 299 元、小孩票 199 元 – 一個小孩一定要配一個大人 – 七八月第一週假日特價 99 元 – ... 等
  40. 265 導購真香 - 名詞解釋 • 在 Funliday 找商品 • 在

    OTA 看商品細節 • 在 OTA 結帳 • 利潤低
  41. 266 導購真香 - 名詞解釋 • 在 Funliday 找商品 • 在

    OTA 看商品細節 • 在 OTA 結帳 • 利潤低 • 各種意義上的開發成本低
  42. 267 導購真香 - 名詞解釋 • 在 Funliday 找商品 • 在

    OTA 看商品細節 • 在 OTA 結帳 • 利潤低 • 各種意義上的開發成本低 • 客服成本超低
  43. 268 導購真香 - 名詞解釋 • 在 Funliday 找商品 • 在

    OTA 看商品細節 • 在 OTA 結帳 • 利潤低 • 各種意義上的開發成本低 • 客服成本超低 Online Travel Agency :線上旅行社
  44. 273 導購真香 - 團隊 (1*8) • iOS 、找錢、會計: 1 •

    Web : 1( 香港人 ) • Android : 1 • Design 、營運: 1 • Business Development : 1 ( 日本人 ) • Marketing : 1 • Backend : 2 設計可以專心在營運上面 團隊愈來愈多元 多了一位行銷和後端
  45. 292 永遠迎接更多的困難 • 前端開發很奔放 – 為了前端孤兒,後端要支援舊前端 • 新創資深工程師的 context switch

    要夠快速 – 許多 knowhow 都放在腦子裡 • 創業最缺的就是時間 – 可以用錢解決的就不要花時間研究
  46. 294

  47. 295

  48. 297