最近 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
同時也有2部Youtube影片,追蹤數超過14萬的網紅アスキー,也在其Youtube影片中提到,「週刊アスキー」読み放題!アスキー倶楽部 デジタル版 No.1311(2020年12月1日発行) https://id.ascii.jp/weeklyascii 12 mini?第2世代SE?小さめiPhone究極の選択!ついにGeForceに追いついた最新Radeon RX 6000シリーズ大...
「call javascript」的推薦目錄:
call javascript 在 軟體開發學習資訊分享 Facebook 的最讚貼文
課程簡介
網頁前端設計在現代越來越重要,是許多程式設計師的第一門課程、青壯年轉換職業跑道的門路、平面設計師的必修。此課程會一步一步帶者你走,讓你能夠從頭開始架設屬於你自己的網頁!你不需要有任何的程式設計經驗,也不需要有相關的背景知識。開始學習網頁前端技術,讓你學會一技之長,能夠開啟網頁技術的大門。
在這堂課程結束之後,你將能夠使用:
1 前端網頁技術開發
2 VS Code 操作技巧以及實用熱門Extension
3 HTML5 – HTML5 – 超文件標記語言
4 CSS3 – CSS3 – 階層式樣式表
5 JavaScript – 網頁前端後端程式語言
6 了解DOM, Hoisting, Scope, Closure, Prototype Inheritance, execution context, callbacks, this keyword, bind call apply functions等進階JS觀念與運用
7 Bootstrap
8 Git and GitHub, Source Tree 版本控制
9 Figma – UI/UX設計工具
10 打造有形網站,架構出自己的現代風格網頁
11 將網站架構到雲端主機,讓大家看到你的作品
12 Flexbox開發技術,讓你做RWD事半功倍
13 學習進階前端開發技術,解決你對前端網頁排版的諸多疑惑
https://softnshare.com/html5-css3-z/
call javascript 在 軟體開發學習資訊分享 Facebook 的最佳貼文
--課程已於 2020 年 12 月更新--
本課程是這個領域多年積累的成果,結合了最好的資源、工具和教學內容創建而成的 JavaScript 課程,它將教會你成為高階 JavaScript 開發人員所需的一切知識。
無論你是 Web 開發人員、 React、 Angular、 Vue.js 開發人員(前端開發人員) ,還是 Node.js 後端開發人員,你都將從本課程中受益,因為 Javascript 是這些技術背後的核心。
從這 23.5 小時的課程,你會學到
1. 進階 JavaScript 實踐
2. 物件導向程式設計( OOP )
3. 函數程式設計( Functional Programming )
4. 作用範圍( Scope ) 和執行環境 ( Execution Context )
5. 繼承 + 原型鏈
6. 最新功能 : ES6,ES7,ES8,ES9
7. 閉包( Closures )
8. 非同步 JavaScript + 事件迴圈
9. JavaScript 模組
10. `this` 關鍵字
11. JavaScript 引擎和執行時期( Runtime )
12. 錯誤處理
13. 堆疊溢位( Stack Overflow )
14. 記憶體洩漏( Memory Leaks )
15. 複合( Composition ) vs 繼承( Inheritance)
16. 強制轉型( Type Coersion )
17. 傳址( Pass By Reference ) vs 傳值( Pass by Value )
18. 高階函數( Higher Order Functions )
19. IIFE ( Immediately Invoked Function Expression,一個定義完馬上就執行的 JavaScript 函數)
20. .call(), .apply(), .bind()
21. 直譯器 / 編譯器 / JIT 編譯器
22. 垃圾回收
23. 變數宣告提升( Hoisting )
24. JavaScript 最佳實踐
https://softnshare.com/advanced-javascript-concepts/
call javascript 在 アスキー Youtube 的最讚貼文
「週刊アスキー」読み放題!アスキー倶楽部 デジタル版 No.1311(2020年12月1日発行)
https://id.ascii.jp/weeklyascii
12 mini?第2世代SE?小さめiPhone究極の選択!ついにGeForceに追いついた最新Radeon RX 6000シリーズ大検証!
=========================================
「週刊アスキー」No.1311の中身は?
週刊アスキーNo.1311(2020年12月1日発行)
https://ascii.jp/elem/000/004/035/4035574/
【表紙の人】
松川菜々花
【特集】
iPhone 12 mini vs SE最強コンパクトスマホ決定戦
【ASCII Top Stories】
ASUSがTiger Lake搭載のZenBookなど5機種のノートPCを発表ASCII Top Stories
【特集】
Radeon RX 6000シリーズ超解説
【連載】
LIFEBOOK CH90/E3/ASCII Power Review
【連載】
一目ぼれしたTrackPoint付きキーボード「Shinobi」/T教授の戦略的衝動買い
【連載】
落ちる砂の景色を楽しむサンドピクチャー/JavaScriptの部屋
【連載】
PC自作erオススメ!ドイツの老舗工具メーカーHAZETのツールボックス/ジサトラ!
【連載】
1980年代の冷戦を題材にしたFPS『Call of Duty Black Ops Cold War』/ゲーム部+
【ニュース】
HDD/SSDを10台搭載できる「裸族のスカイタワー」/アスキー秋葉原情報局
【連載】
もう少しで新しいロケットがお目見え! “H3ロケット”/数式なんて知らんし!!
【連載】
画面そのものを手で持つようなiPhone 12 miniの未来感/アップル時評
【連載】
年下の言動にムッとしたらマネしてみる?/週替わりギークス
【連載】
刑事ドラマでよく見る「あのテープ」を購入しました/オヤジホビー
【連載】
iPhone 12 Pro Maxで子猫と戯れる/今週のねこちゃん写真館
【連載】
丸亀製麺で初の「ランチセット」500円〜!/今週のグルメ
【連載】
政府、パスワード付きZIP廃止へ デジタル化の課題は地方か/ASCII倶楽部に行こう!!
【連載】
冬に備えて見直すウイルス対策/アスキーストア通信
【連載】
iPhone SE(第2世代)からiPhone 12 Proにして正解だった/コラムジャングル
【連載】
あしたのヨミヤスミ/カオスだもんね! Plus
【ニュース】
ロジクールG人気の無線マウスがさらに小型化し63g未満に/ASCII.jp News
【連載】
グラドル界で最高峰の超柔軟ポーズを披露! 桜りん/今週のグラビア
【連載】
福田有宵先生が占う! 今週の運勢/12月1日〜12月7日
【連載】
縦長画面は未来であるべし/NeXT=完全予想
CM編集:ラッキー橋本
-----------------------------------
★ムービーサイト「アスキーTV」http://ascii.jp/asciitv/
★ニュースサイト「ASCII.jp」http://ascii.jp/
★超ファンクラブ「ASCII倶楽部」http://ascii.jp/asciiclub/
----------------------------------
![post-title](https://i.ytimg.com/vi/TuLzaAqtFkg/hqdefault.jpg)
call javascript 在 アスキー Youtube 的最佳貼文
「週刊アスキー」読み放題!アスキー倶楽部 デジタル版 No.1224(2019年4月2日発行)
https://id.ascii.jp/weeklyascii
ビジネス効率化に最適なスマホアプリを大特集。パソコン自作ではPCケーストレンドが激変中!
=========================================
「週刊アスキー」No.1224の中身は?
週刊アスキーNo.1224(2019年4月2日発行)
http://ascii.jp/elem/000/001/837/1837905/
【表紙の人】
加藤小夏
【ASCII Power Review】
フルサイズの台風の目 小型軽量低価格で写りは!? キヤノン EOS RP
【ASCII Top Stories】
アップルが「Apple News+」ほか 新たなサービスを続々と発表
【特集】
仕事で役に立つインストール推奨16種類を紹介 スマホアプリで仕事は楽になる!
【特集】
強化ガラス・ベイなし・電源隠し 見た目最優先の“魅せる”がトレンド! 最新PCケースが変わった!
【連載】
数式なんて知らんし!! 再注目されている『iPS細胞』ってどんなもの?
【連載】
週替わりギークス 缶ビールを振っても吹き出さない方法
【連載】
T教授の戦略的衝動買い 人やペットの気配をスマホで感じるIoT「どこでもセンサー」
【連載】
JavaScriptの部屋 球に映る球も描く、レイトレーシングの威力
【連載】
オヤジホビー 間引きされたメロンで作った漬物が超うまいです
【連載】
ジサトラ クトゥルフ神話の世界が味わえる「Call of Cthulhu」
【連載】
アスキー秋葉原情報局 古いテレビで最新ゲーム機が遊べる HDMIをS端子に変換するコンバーター
【連載】
西海岸から見る“it”トレンド 新しい「未来のお金」は日本でも社会を変えるのか?
【連載】
ASCII倶楽部に行こう!! 実は日本ブランド・パイオニアのスマホが中国で脚光を浴びていた
【連載】
カオスだもんね!PLUS 弁当日和な“タイヤ公園”
【連載】
今週のねこちゃん写真館 「はじめてのネコ撮影」講座とやらをやってみた話
【連載】
今週のグルメ プロントは女性も使いやすいカフェ&バー
【連載】
今週のグラビア 極小ビキニはパズル状態! 青山ひかる
【連載】
2019年の運勢 福田有宵先生が占う!今週の運勢
【連載】
NeXT=完全予想 ミラーレスは未来であるべし
編集:ラッキー橋本
----------------------------------------------
★ムービーサイト「アスキーTV」http://ascii.jp/asciitv/
★ニュースサイト「ASCII.jp」http://ascii.jp/
★超ファンクラブ「ASCII倶楽部」http://ascii.jp/asciiclub/
----------------------------------------------
![post-title](https://i.ytimg.com/vi/1xaS3LdrpVg/hqdefault.jpg)
call javascript 在 JavaScript call() Method and Its Practical Applications 的美食出口停車場
Introduction to the JavaScript call() method ... The call() method calls a function functionName with a given this value and arguments. The first argument of the ... ... <看更多>