最近 Funliday-旅遊規劃 常發一些精選旅遊回憶的 App 通知給使用者,在去年十一二月的時候發通知 Server 還能撐的了瞬時大流量的 request。
但今年開始發這類通知,總共發了三次,三次都造成 Server 被打掛,而且重開 AP 還緩解不了,瞬間手足無措。大概都要等過了十分鐘左右,Server 才將這些 request 消化完。
這裡就來簡單整理一下時間軸,順便分享一下 Funliday 是如何解決這個問題。
---
* 1/6 1900:系統排程發送精選旅遊回憶的 App 通知
* 1/6 1900+10s 開始:Server 收到極大量的 request
* 1/6 1900+20s:Nginx 出現錯誤訊息 1024 worker not enough,並回傳 http status code 503
* 1/6 1900+25s:PostgreSQL 出現錯誤訊息 could not fork new process for connection (cannot allocate memory)
* 1/6 1900+38s:Node.js 收到 PostgreSQL 的 exception。There was an error establishing an SSL connection error
* 1/6 1900+69s:PostgreSQL 出現錯誤訊息 database system is shut down
* 1/6 1900+546s:PostgreSQL 出現錯誤訊息 the database system is starting up
---
看了時間軸就覺得奇怪,先不論 10s 的時候發了極大量 request,造成 20s 在 Nginx 出現 worker not enough 的錯誤訊息。而是要關注 25s 時的 PostgreSQL 出現 could not fork new process for connection 的錯誤訊息。
Funliday 用了同時可承載 n 個 connection 的資料庫,而且程式碼又有加上 connection pool,理論上根本不該出現這個錯誤訊息。但整個時間軸看下來感覺就是 PostgreSQL 的 capacity 問題,造成系統無法運作。
因為就算將 Nginx 的 worker connection size 再加大 10 倍,只是造成 PostgreSQL 要接受的 request 也跟著被加大 10 倍,但 PostgreSQL 那裡因為 request 變多,原本在 69s 直接關機的時間點只會提早,而無法真正緩解這個狀況。
基於以上狀況,小編就開始回去看自己的程式碼是不是哪裡寫錯了。會這樣想也是覺得 PostgreSQL 應該沒這麼弱,一下就被打掛,一定是自己程式碼的問題 Orz
---
這邊來分享一下自己程式碼的寫法,圖一是原始寫法,在每個 API 都 create 一個 db client instance 來處理該 API 層的所有 db request。這是蠻單純的做法,也是 day 1 開始的處理方式。但有個小問題,就是每個 API 層都要自己 create instance,不好管理,且浪費資源。
後來因為想要做 graceful shutdown 的關係,所以調整了一下 db client instance 的建立方式,用 inject 將 instance 綁在 request 上面,如圖二。這樣只要在 middleware 建立 db client instance 就好,好管理,而且只要有 req 就可以取得 instance,非常方便。而這也是 1/6 時的程式碼,就從這裡開始研究吧。
---
直接切入 node-postgres 的文件,認真讀了一下 pool 有下面兩種使用方式:
1. pool.connect, pool.release:文件寫著 checkout, use, and return,光看描述就應該用這個沒錯。
2. pool.query:適用於不需要 pool 的連線方式,文件上也清楚寫著內部實作是直接 call client.query,所以用了這個方式是完全跟 pool 扯不上邊。
但偏偏小編從 day 1 用的就是第 2 種方式 Orz,雖然看起來應該是寫錯,但也是要修改後實測,才知道是不是真的可以解決問題。
---
如圖三,這是修改後的程式碼。想了一下子,覺得目前在 API 層使用 req.pool.query 還不錯,不想用官方的建議做法:先 create client,然後 query 之後,再使用 release。
如果照官方建議做法,API 層的程式碼會多一堆與商業邏輯無關的程式碼,也不好維護。所以在不想動到 API 層的程式碼,只能使用 monkey patch 的方式來達到這個需求。
monkey patch 可以將原方法利用類似 override 的方式,將整個方法改掉,而不改變 caller 的程式碼,這也是 JavaScript, Ruby, Python 這類動態語言的特性之一,但真的要慎用,一不小心就會把原方法改成完全不同意義的方法了。
所以原本應該要在 API 層實作 connect, query, release 一大堆程式碼,可以用 monkey patch 完美解決這一大堆程式碼。
---
在 dev 壓測後至少 capacity 可以達到原本的 4 倍以上,隔天實際上 production 之後也確實如壓測般的數據,可以承載目前的流量。
其實這篇分享的重點只有一點,文件看仔細才是最重要的事啦!如果沒把文件看仔細,然後開發經驗也不足的話,什麼 RCA、monkey patch 都幫不上忙啦!
---
後記:有夠丟臉,其實完全用不到圖三,只要把圖二的 pool creation 放到最外層就好了,因為 pool.query 的內部實作已經有做 connect, query, release 了。
感謝下面的 Mark T. W. Lin 及 Rui An Huang 的幫忙,實在是太搞笑了 Orz
* Pool 的文件:https://node-postgres.com/features/pooling
* 官方建議寫法:https://node-postgres.com/guides/project-structure
* pool.query 的內部實作:https://github.com/brianc/node-postgres/blob/master/packages/pg-pool/index.js#L332
#expressjs #nodejs #javascript #postgresql
同時也有1部Youtube影片,追蹤數超過5萬的網紅殿下在香港-香港在世界 (Hong Kong in the World),也在其Youtube影片中提到,自學語言的第一天|Tự học ngôn ngữ Day1|Self Learning Language at Day1 ------------- Day1 Tiếng Việt 學習越南文的第一天 學語言第一天通常都是學這個就是字母,但是比起直接學習字母,我做多了一個步驟,就是先簡單了解這種語...
「語言的特性」的推薦目錄:
- 關於語言的特性 在 Kewang 的資訊進化論 Facebook 的最佳貼文
- 關於語言的特性 在 半路出家軟體工程師在矽谷 Facebook 的最佳解答
- 關於語言的特性 在 韓國有事嗎 Facebook 的最佳解答
- 關於語言的特性 在 殿下在香港-香港在世界 (Hong Kong in the World) Youtube 的最佳貼文
- 關於語言的特性 在 [閒聊] 各程式語言特性的優缺點- 看板Programming 的評價
- 關於語言的特性 在 JavaSE6Tutorial/docs/CH01.md at master - GitHub 的評價
- 關於語言的特性 在 各國語言特性大不同德國語言區分性別好難懂 ... - YouTube 的評價
- 關於語言的特性 在 第一部分基本语言特性- C++ 17 The Complete Guide 的評價
- 關於語言的特性 在 Will 保哥的技術交流中心- #JavaScript 這個程式語言有許多很棒 ... 的評價
語言的特性 在 半路出家軟體工程師在矽谷 Facebook 的最佳解答
感恩節感謝 & 一些學習課程推薦
今天是美國的感恩節, 首先要謝謝各位讀者你們的支持,一開始的分享主要是我的轉職及找工作經驗, 後來逐漸擴展到我的矽谷的所見所聞、矽谷人物專訪、以及我的學習成長的筆記。 從 2012 年開始寫部落格, 2017 年開始分享 Facebook page, 也是累積了許多經驗, 文筆說不上變的很好, 但至少越來越熟練把一個靈感大目標從我的思緒整理、輸出成一篇文章分享出來, 這個過程也認識了許多有趣及厲害的人, 訪問了一些我覺得很酷很強的人,召集了許多熱心的朋友一起做了 “歹晚郎內推互助網絡” 幫助更多人在艱難的時期找工作,我個人也覺得在這個過程中有所提升。 如果你有考慮寫作分享, 或是任何創作, 希望我之前的文章“為什麼我建議你開始寫文章、或是任何形式的內容創作” 也能讓你一起加入開始練習寫作/創作/輸出的行列。
我不時會收到讀者詢問如何到美國科技公司工作,或是如何轉職成軟體工程師、如何學習程式等等的問題。 到美國工作問題我之前的文章: “如何到美國科技公司工作?” 已經把非美國人可以到美國工作的模式列出, 轉職軟體工程師及學習程式很多時候是一起的問題, 很多讀者有興趣轉職,但完全不知道軟體工程師在做什麼, 以及應該如何上手學習。 我給過不少次建議, 今天決定用這個機會公開的分享之前回答讀者的方式。
如果完全沒有學習過程式, 可以先玩玩這個 MIT Media Lab 研發的 Scratch , Scratch 可以讓你用拖拉的方式把一些程式的邏輯組合起來, 在還不熟悉電腦運作的時候, 可以很直觀的在遊戲中累積你對程式的理解。
如果玩一下 Scratch 後還有興趣, 我推薦可以上哈佛大學的 CS50 (Computer Science 50: Introduction to Computer Science) (https://bit.ly/3fDcBFG)。 這門課是近年來哈佛大學熱門課程排行榜上的常勝軍,教授 David Malan 是個很好的老師, CS50 把電腦科學的基礎用許多生動及詳細的方式傳授出來,上完這門課後對許多電腦科學領域會有好的基本認識,對課程中所用到的不同程式語言也會有個基本的了解。
當然 CS50 畢竟是大學的課程, 有一週一週制式的格式, 作業也是大學的方式, 我近年來蠻喜歡 Udemy 上的課程, 因為每個領域都有很棒的老師, 課程也更彈性及多元, 作業及測驗也比較靈活。 如果你還沒有學習任何程式的經驗, 可以嘗試從學習 Python 或 Javascript 入門, 因為這 2 們語言的特性, 對初學者上手比較容易。 此外 Javascript 是網頁主要使用的程式語言, 而 Python 在資料處理及機器學習都是首選語言, 所以這 2 個語言學習之後未來都有許多應用及職缺的可能。
如果你有興趣學 Python ,可以先學習這個有 115 萬學生上過的課程: 2020 Complete Python Bootcamp From Zero to Hero in Python (https://bit.ly/2KJDfS6), 了解 Python 語言的基礎及跟著課程建立自己的 app 及遊戲。
Javascript 的話可以看這個有 37 萬學生參與的課程: The Complete JavaScript Course 2020: From Zero to Expert! (https://bit.ly/3fFPcU8) 學習 Javascript 基礎及嘗試建立網頁 app。
如果對資料科學有興趣的, 可以和 34 萬人一起學習 The Data Science Course 2020: Complete Data Science Bootcamp (https://bit.ly/3fD315M), 了解資料科學中數學、統計、 機器學習及各種有關的知識, 因為也會用到 Python,所以也可以增加自己 Python 語言的技能。
如果你對分析資料有興趣, 這個有 32 萬名學生上過的資料課程 The Complete SQL Bootcamp 2020: Go from Zero to Hero (https://bit.ly/33nXQlj), 可以學習如何用 SQL 來查找資料庫, 並分析資料。
因為機器學習的火紅, 近年機器學習的課程也是無敵多, Machine Learning A-Z: Hands-On Python & R In Data Science (https://bit.ly/3fGB6lj) 累積有 72 萬學生學習及好評, 可以讓你了解機器學習在做什麼。
而我親愛的老婆也分享過她喜歡的課程, 以下都是她上過且去蕪存菁強力推薦的課程 (也可以參考她的推薦文章), 她靠著許多線上課程, 沒有再讀一個大學、研究所學位或是參加 bootcamp , 也成功轉職為軟體工程師, 這些課程我也有上過一些, 覺得這個老師 Andrei Neagoie 的教法也是蠻不錯的, 他的課程都很注重實作, 講解也很清楚, :
The Complete Web Developer in 2020: Zero to Mastery (https://bit.ly/3fDcwSq)
Master the Coding Interview: Data Structures + Algorithms (https://bit.ly/3fD7q8V)
The Complete Junior to Senior Web Developer Roadmap (2020) (https://bit.ly/39jeK8s)
Complete Python Developer in 2020: Zero to Mastery (https://bit.ly/37ARPS4) (這篇是她上這門課的詳細心得)
Complete Machine Learning and Data Science: Zero to Mastery (https://bit.ly/2WDBk57) (機器學習及資料科學)
許多 Udemy 的課程都是有 30 天 Money back guarantee , 代表如果你上一下子,覺得老師教的不好, 內容不喜歡, 都是可以要求退費的。 Black Friday 如果你還沒決定要買什麼, 買課程充實自我會是個不錯的決定!歐, 對了, 如果你剛好在美國,要買 Udemy 課程, 可以搭配使用 cash back 網站, 像 Rakuten 最近 Udemy 有 10% 的 cash back, 如果你還沒有用過, 可以使用我的推薦連結註冊, 還可以得到 $40 的註冊獎勵呢 (http://bit.ly/2SeLuXL)!有一些 American Express 信用卡還有 Udemy 買 $20 退 $5 的 offer , 也記得下訂前查看一下!
以上許多課程, 就算不是軟體工程師的初學者也可以得到許多新科技及方法, 我在 Udemy 買了許多課程, 也時常利用時間學習我感興趣的領域。 最後再次感謝大家一直以來的支持, 祝福大家都有個充實、健康、平安的感恩節, 2020 年最後自我學習提升, 為未來做更好的準備!
部落格原文及相關連結:
https://brianhsublog.blogspot.com/2020/11/ThanksgivingAndCourseList.html
語言的特性 在 韓國有事嗎 Facebook 的最佳解答
取名字的學問越來越大了⋯⋯
#愛豆 #名字 #搜尋
語言的特性 在 殿下在香港-香港在世界 (Hong Kong in the World) Youtube 的最佳貼文
自學語言的第一天|Tự học ngôn ngữ Day1|Self Learning Language at Day1
-------------
Day1 Tiếng Việt 學習越南文的第一天
學語言第一天通常都是學這個就是字母,但是比起直接學習字母,我做多了一個步驟,就是先簡單了解這種語言的特性。這個時候要靠Google,發現越南文語言結構跟中文相似,拼音系統也跟中文相似,而且是有入聲韻尾的,有廣東話根底的話可能會有優勢吧。但是也發現越南文主要分為南北兩種口音,而且差異頗大,就是說我將要決定學習哪一種口音。標準河內音聲調有六個,南方只有五個,在這個階段我可能先把兩種口音都學一學。今天一小時,記好了越南字母的寫法和發音,和簡單了解了拼音和聲調,下次可以正式學習了。
-------------
劉殿下のFacebook:
https://www.facebook.com/RyuDenka/
-------------
殿下推薦的廣東話Youtuber!!:
點點dimdim
屎萊姆的3次元
Hein Cream 海恩奶油
HuhuuuTV /廣東話教學
Mira's Garden
疯粤CrazyCanton
頴珊頻道 | The Wingshantsui Channel
MtzCherry
Learn Cantonese with CantoneseClass101.comDandan Chen
にんじんレイ
ようき楽園 / 玉其樂園 - マカオと広東語
CarlosDouh
我は何しに香港へ? Why did I come to HK ?
-------------
關鍵詞:
自學語言,由零開始,越南文,越南語,Tiếng Việt,học Tiếng Việt,越南文中文,語言文化,廣東話越南話,粵語越南語,越南文漢語,Tiếng Việt Tiếng Trung,Tiếng Việt Tiếng Hoa,香港越南,Hồng Kông,廣東話,广东话,香港,教學,道地,粵語,口語,白話,教室,廣東話教學,bensir,歐陽偉豪,广东话教学,打招呼,中英夾雜,港式英文,九聲六調,翻譯,字幕.廣東話髒話,廣東話 黃明志,楊民翠,點點,香港女生,廣東話歌,廣東話卡通,廣東話口音,廣東話 罵人,廣東話 詩歌,廣東話 數字,廣東話粗口,廣東話,廣東話兒歌,廣東話髒話,廣東話 你好,廣東話 謝謝,廣東話 普通話,廣東話打招呼,廣東話旁白,廣東話 翻譯,廣東話 英文,廣東話拜年,廣東話 拼音,廣東話學習,廣東話 發音,廣東話 客家話,廣東話 app,廣東話 母語,廣東話輸入法,廣東話故事廣東話俗語,廣東話歇後語,廣東話 澳門,Cantonese,Hong Kong,Cantonese lesson,広東語,広東語 会話,広東語 挨拶,広東語 発音,広東語 こんにちは,広東語 中国語
語言的特性 在 JavaSE6Tutorial/docs/CH01.md at master - GitHub 的推薦與評價
1.2.1 語言特性. 作為一個程式語言,Java 擁有許多重要的特性:簡單的(Simple)、物件導向的(Object-oriented)、網 ... ... <看更多>
語言的特性 在 各國語言特性大不同德國語言區分性別好難懂 ... - YouTube 的推薦與評價
歡迎訂閱《WTO姐妹會》 ♡➟➟https://reurl.cc/Q3alV9(貼心提醒 別忘記開啟通知小鈴鐺唷!)-WTO姐妹會915集主題:說話一定要這樣嗎?各國 語言特性 ... ... <看更多>
語言的特性 在 [閒聊] 各程式語言特性的優缺點- 看板Programming 的推薦與評價
想和各位閒聊一下大家接觸過的程式語言中
有哪些語言特性是各位喜歡的?
有哪些語言特性是大家討厭的?
也可以包含各語言在OO開發上library或framework所提供的物件導向設計
歡迎大家踴躍討論囉!
我個人是喜歡Python的簡潔語法 將很多不必要的符號給去除 減少coding和閱讀負擔
由於是動態型別 所以在function/method內使用變數就很輕鬆 不用拼命宣告
爽朗的list/dictionary/string..等的操作語法 在開發時更直覺
雖然直譯的語言使用很方便 但是寫大型程式的時候 還是希望有compiler能夠先檢查語法
減少run time error的機會
另外Objective-C中 物件方法的定義和呼叫也很特別 雖然囉嗦但一目了然知道它的作用
它的@protocol功能 能夠明確告知該物件需要實踐哪些方法才能達到使用的目的
@category則可以方便擴充原本存在的物件
我只有接觸過這兩種語言 所以大概只有這些...
--
度步齊~ 欠揍阿,不是老早就叫你別op了嗎?
\ /
_ _ ˋˊ
ε(# @== ~
( \ 〉
|〉 √︶
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.77.52.127
... <看更多>