最近 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
同時也有3部Youtube影片,追蹤數超過2萬的網紅奮game王紫楓,也在其Youtube影片中提到,#軟體工程師 #Kotlin 👍歡迎訂閱!! 🔔🔔按下小鈴鐺,就可以一有新影片就搶先看! [軟體工程師雜談] 專業Android工程師來聊聊:Kotlin的10大優點 0:00 開場 0:51 紫楓自介 1:39 Kotlin的10大優點 1.完全相容於Java 2.結尾不用分號 3.好用的...
「exception程式」的推薦目錄:
- 關於exception程式 在 Kewang 的資訊進化論 Facebook 的精選貼文
- 關於exception程式 在 軟體開發學習資訊分享 Facebook 的最佳解答
- 關於exception程式 在 91 敏捷開發之路 Facebook 的精選貼文
- 關於exception程式 在 奮game王紫楓 Youtube 的精選貼文
- 關於exception程式 在 吳老師教學部落格 Youtube 的精選貼文
- 關於exception程式 在 吳老師教學部落格 Youtube 的最佳解答
- 關於exception程式 在 例外處理(Exception) - Java學習筆記 的評價
- 關於exception程式 在 第10 章例外處理(Exception Handling) - GitHub 的評價
- 關於exception程式 在 Python 第十三課:Python 程式中的Error 與Exception - YouTube 的評價
exception程式 在 軟體開發學習資訊分享 Facebook 的最佳解答
今天的開源報報( 每週一~週五早上 7:00 準時發刊 )
今天的內容摘要
✅可自訂的黑名單的瀏覽器外
✅利用 OCR 檢查上傳到 prnt.sc 的影像檔是否含有敏感資料
✅在 TypeScript 中使用原始 SQL 成為可能,並保證了資料型別安全
✅簡約,小巧,網頁元素定位引擎。建立高效能,最小的使用空間和最大限度的控制定位行為
✅寫入一個內容 / 目錄,透過類似 MongoDB 的 API 獲取 Markdown、 JSON、 YAML 和 CSV 檔案,充當一個基於 git 的 Headless CMS
✅用於機器學習實驗的影像增強
✅一個漂亮的、可維護的機器學習程式庫,用 Go 語言編寫,旨在支援自然語言處理任務中的相關神經網路架構
✅一個跨平台(Android 和 iOS) ActionSheet( for ReactNative ),具有靈活的 api、本機效能和零依賴程式碼。 在 ActionSheet 中建立你想要的任何東西
✅Flutter 下拉更新功能
✅用於 iOS、 macOS 和 Linux 的 Swift 協同程式( Coroutine )
✅基於 C++ 20 概念設計的 exception-safe RAII 程式庫。比 cstdio 快 10 倍
https://softnshare.com/opensource-133/
exception程式 在 91 敏捷開發之路 Facebook 的精選貼文
#感到窩心
今天在客戶這邊,看到工程師把之前上課的東西,應用在重構 legacy 產品的架構,發揮地淋漓盡致。
把原本散落在每個方法中一大堆無謂的判斷式(例如一堆 error code 的 mapping 判斷)、pre-condition (例如檢查資料的合法性、是否存在該筆資料)、log的紀錄、performance log 、共同的 exception handling 、cache 的存取、身分檢查,全都從原本又髒又肥的 function 內容中拆解出來。
程式碼複雜度指數下降、測試案例個數指數下降、相依物件個數大幅下降,讓設計恢復成原本「簡單」的模樣,關注點分離,實際的 class 都只處理 critical path, 其他的部分拆解出去,透過 DI, decorator, interceptor 來組合。
連我都沒想到他們可以靠自己拆得這麼乾淨、漂亮、簡單。
也難怪上次上完課之後,回公司推薦完又多了好幾位來報名下一梯次。
有興趣的朋友,下一梯次在九月:
https://dotblogs.com.tw/…/dependency-injection-and-aspect-o…
[註]目前此課程只支援 C#,原因是第二天講解到 AOP 的實作,會有一部分依賴於框架,而我對其他語言的框架還不夠熟悉,還不到可以收費培訓的強度,敬請見諒。
另外,這門課也是大幅度的以重構來進行設計的調整,也會寫到單元測試(使用mock framework),也會一併帶到相當多的 JetBrains 重構功能,例如 extract method, extract class, extract interface, move method, constructor generator, introduce field, inline field/variable/parameter/method 系列。
exception程式 在 奮game王紫楓 Youtube 的精選貼文
#軟體工程師 #Kotlin
👍歡迎訂閱!! 🔔🔔按下小鈴鐺,就可以一有新影片就搶先看!
[軟體工程師雜談] 專業Android工程師來聊聊:Kotlin的10大優點
0:00 開場
0:51 紫楓自介
1:39 Kotlin的10大優點
1.完全相容於Java
2.結尾不用分號
3.好用的資料類別
4.變數名稱支援與default
5.IDE提供了良好的支援
6.更清楚的呼叫方式
7.No FXXKing Null exception
8.更好的函式支援
9.簡潔有力 (40% off)
10.生產力提升
Kotlin 實戰手冊: http://l.ovoy.click/vx3xj
程式新手學習發問區,問都給問!!: https://www.facebook.com/groups/914880435669061
紫楓FB專頁: https://www.facebook.com/tbpfs2/
紫楓blog: https://tbpfs1.blogspot.com/
紫楓linkedin: https://www.linkedin.com/in/tbpfs2
斗內專線: https://pse.is/KUYMP
![post-title](https://i.ytimg.com/vi/8WuLsAFnOuc/hqdefault.jpg)
exception程式 在 吳老師教學部落格 Youtube 的精選貼文
JAVA物件導向程式設計課程上課影音(10)
完整影音:
http://www.youtube.com/playlist?list=PLsE34duTsJQwCh30WfQP5XVNMt1ngR3Ue
論壇:
https://groups.google.com/forum/?hl=zh-TW#!forum/java_object
01_巢狀類別與多形與套件
02_C9_1_1巢狀類別範例
03_C9_1_2內層類別的使用
04_C9_2_1類別繼承的匿名內層類別
05_C9_2_2實作介面的匿名內層類別
06_C9_2_3匿名內層類別與this和final關鍵字
07_CH9_4_1使用類別繼承來實作多形
08_CH9_4_2使用介面來實作多形
09_如何加掛Android開發環境
10_如何安裝Android_SDK
11_Android版本分析與套件和import敘述
相關JAVA教學:
JAVA01_基本概說
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA02_流程控制敘述
http://www.youtube.com/playlist?list=PL0EADCF8F06B00BA4&feature=view_all
JAVA03_舉範例說明
http://www.youtube.com/playlist?list=PL64C8D9D3E8DD932D&feature=view_all
AWT視窗窗物
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA05_事件處理
http://www.youtube.com/playlist?list=PLA7BC9C0DA74C9DA1&feature=view_all
TQC_JAVA解題
http://www.youtube.com/playlist?list=PLEAD98F19A4702915&feature=view_all
android入門(淡江)
http://www.youtube.com/playlist?list=PLFCA1F8C48C3FEDC9&feature=view_all
1010109德明資科系TQC+ANDROID研習心得(學生)
https://www.youtube.com/playlist?list=PLE4192ECF9FB645E7&feature=view_all
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
![post-title](https://i.ytimg.com/vi/3A6jV0qWxXM/hqdefault.jpg)
exception程式 在 吳老師教學部落格 Youtube 的最佳解答
JAVA物件導向程式設計課程上課影音(10)
完整影音:
http://www.youtube.com/playlist?list=PLsE34duTsJQwCh30WfQP5XVNMt1ngR3Ue
論壇:
https://groups.google.com/forum/?hl=zh-TW#!forum/java_object
01_巢狀類別與多形與套件
02_C9_1_1巢狀類別範例
03_C9_1_2內層類別的使用
04_C9_2_1類別繼承的匿名內層類別
05_C9_2_2實作介面的匿名內層類別
06_C9_2_3匿名內層類別與this和final關鍵字
07_CH9_4_1使用類別繼承來實作多形
08_CH9_4_2使用介面來實作多形
09_如何加掛Android開發環境
10_如何安裝Android_SDK
11_Android版本分析與套件和import敘述
相關JAVA教學:
JAVA01_基本概說
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA02_流程控制敘述
http://www.youtube.com/playlist?list=PL0EADCF8F06B00BA4&feature=view_all
JAVA03_舉範例說明
http://www.youtube.com/playlist?list=PL64C8D9D3E8DD932D&feature=view_all
AWT視窗窗物
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA05_事件處理
http://www.youtube.com/playlist?list=PLA7BC9C0DA74C9DA1&feature=view_all
TQC_JAVA解題
http://www.youtube.com/playlist?list=PLEAD98F19A4702915&feature=view_all
android入門(淡江)
http://www.youtube.com/playlist?list=PLFCA1F8C48C3FEDC9&feature=view_all
1010109德明資科系TQC+ANDROID研習心得(學生)
https://www.youtube.com/playlist?list=PLE4192ECF9FB645E7&feature=view_all
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
![post-title](https://i.ytimg.com/vi/8gJAdEQVcYQ/hqdefault.jpg)
exception程式 在 第10 章例外處理(Exception Handling) - GitHub 的推薦與評價
Java 的例外處理機制可以協助您避開或是處理程式可能發生的錯誤,「例外」(Exception)在Java 中代表一個錯誤的實體物件,在特定錯誤發生時會丟出特定的例外物件, ... ... <看更多>
exception程式 在 Python 第十三課:Python 程式中的Error 與Exception - YouTube 的推薦與評價
![影片讀取中](/images/youtube.png)
本集為Python 程式 語言入門教學的第十三課主要說明Python 程式 中的Error 與 Exception 在學習如何處理Python 程式 中發生的Error 之前,只要Python 程式 ... ... <看更多>
exception程式 在 例外處理(Exception) - Java學習筆記 的推薦與評價
為讓程式不會因一些不尋常的情況導致崩潰,使用例外處理是非常重要的。 使用例外處理(try、catch、finally). 以下為程式說明:. try{ ... <看更多>