最近 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
同時也有191部Youtube影片,追蹤數超過12萬的網紅prasertcbs,也在其Youtube影片中提到,ดาวน์โหลด Jupyter Notebook ที่ใช้ในคลิปได้ที่ ► http://bit.ly/2Qf9OWs เชิญสมัครเป็นสมาชิกของช่องนี้ได้ที่ ► https://www.youtube.com/subscription_cente...
「http server python」的推薦目錄:
- 關於http server python 在 Kewang 的資訊進化論 Facebook 的最佳貼文
- 關於http server python 在 軟體開發學習資訊分享 Facebook 的最讚貼文
- 關於http server python 在 緯育TibaMe Facebook 的最讚貼文
- 關於http server python 在 prasertcbs Youtube 的最讚貼文
- 關於http server python 在 prasertcbs Youtube 的最讚貼文
- 關於http server python 在 prasertcbs Youtube 的最佳貼文
- 關於http server python 在 Python 快速建立簡單網頁伺服器http web sever 的評價
- 關於http server python 在 Simple Python 3 HTTP server for logging all GET and POST ... 的評價
- 關於http server python 在 Python SimpleHTTPServer doesn't work - A server error ... 的評價
- 關於http server python 在 How To Create a Simple Web Server Using Python and the ... 的評價
- 關於http server python 在 How can I start the python SimpleHTTPServer on port 80? 的評價
http server python 在 軟體開發學習資訊分享 Facebook 的最讚貼文
由 udemy 熱門講師 Jose Portilla( http://bit.ly/2Kf6isv) 主講
學習如何快速有效地使用SQL!
你將學習如何使用需求最高的技能之一 – PostgreSQL,將複雜查詢讀寫到資料庫。這些技能也適用於任何其他主要的SQL資料庫,如MySQL、Microsoft SQL Server 、Amazon Redshift、Oracle等等。
學習SQL是提高職業前景的最快方法之一,因為它是最需要的技術技能之一!在本課程中,你將快速學習,並接受挑戰和測試,以提升你的理解
在本課程中,你將學習成為 SQL 專家所需的一切!包含:
✅開始使用 PostgreSQL 和 PgAdmin,這兩個世界上最受歡迎的 SQL 工具
✅瞭解 SQL 語法的基礎知識
✅使用 GROUP BY 命令以聚合函數( aggregate functions )分析資料
✅使用字串操作( string operations )和比較操作( comparison operations )執行高階查詢
✅學習使用邏輯運算子將邏輯流( logic flow )加入你的 SQL 查詢
✅學習常見的 SQL JOIN 命令
✅學習建立對資料輸入做限制的表和資料庫
✅學習使用 Python 進一步提高你的 SQL 技能
✅還有更多!
https://softnshare.com/completesqlbootcamp/
http server python 在 緯育TibaMe Facebook 的最讚貼文
【陳宗興老師:建模成本最貴,服務才是王道】
#善用你具有的程式設計能力邁入AI產品開發
🤔如果...
已經具有一個程式語言的設計能力,如Python或者C#或者Java/Ruby等,您可以發揮您的專案,借助現有的人工智慧服務平台,進行AI系統整合構思與架構,並且在低成本與穩定與安全性的考量下,快速完成您的AI產品開發。
🤔例如...
我想開發一個結合Line Bot聊天室的人機介面,讓使用者可以借助Line直接詢問想資料的區域與特約藥局現有口罩存量狀態。透過Line採用聊天方式進行資料查閱與回應。無須借助選單式的功能表操作方式進行 。您又該如何實現這樣的具有自然語言解析能力AI配合的即時性口罩查詢智能查詢聊天室開發?
當我們想實踐一個《聊天機器人自然語意查詢即時剩餘口罩系統》我們需要整合那些技術規範?
1⃣需要具配有HTTP通訊協定開發與整合的能力
2⃣具備有開發RESTful API介接服務的能力
3⃣具備有Line Messaging API服務介接能力
4⃣SQL Server SSIS整合服務Package開發能力
5⃣SQL Server Agent自動化排程管理能力
6⃣Azure LUIS.ai訓練建模能力(自然語意分析建模)
7⃣SQL Server資料庫OLTP處理能力
8⃣Open API資料JSON文件分析能力
#文中將附上如何實現及時口罩人工智慧聊天機器人架構
如上面所列只是一個參考架構,當然可以有不同的解題架構進行設計。我只想說明的一點就是:
《實踐一個AI應用系統的整體架構,是一個整合系統開發,絕非單一程式或者單一經驗即可完成。》
不要小覷你已經具有的程式開發經驗與能力,因為這些經驗都將是實現一個AI系統不可或缺的角色與能力。
#跟陳宗興老師一同學習
◎課程主題:C#介接LUIS.AI自然語意解析
◎課程連結:https://bit.ly/3cw75St
http server python 在 prasertcbs Youtube 的最讚貼文
ดาวน์โหลด Jupyter Notebook ที่ใช้ในคลิปได้ที่ ► http://bit.ly/2Qf9OWs
เชิญสมัครเป็นสมาชิกของช่องนี้ได้ที่ ► https://www.youtube.com/subscription_center?add_user=prasertcbs
สอน MySQL ► https://www.youtube.com/playlist?list=PLoTScYm9O0GFmJDsZipFCrY6L-0RrBYLT
สอน PostgreSQL ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGi_NqmIu43B-PsxA0wtnyH
สอน Microsoft SQL Server 2012, 2014, 2016, 2017 ► https://www.youtube.com/playlist?list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn
สอน SQLite ► https://www.youtube.com/playlist?list=PLoTScYm9O0GHjYJA4pfG38M5BcrWKf5s2
สอน SQL สำหรับ Data Science ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGq8M6HO8xrpkaRhvEBsQhw
การเชื่อมต่อกับฐานข้อมูล (SQL Server, MySQL, SQLite) ด้วย Python ► https://www.youtube.com/playlist?list=PLoTScYm9O0GEdZtHwU3t9k3dBAlxYoq59
การใช้ Excel ในการทำงานร่วมกับกับฐานข้อมูล (SQL Server, MySQL, Access) ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGA2sSqNRSXlw0OYuCfDwYk
#prasertcbs_SQL #prasertcbs #prasertcbs_MySQL
http server python 在 prasertcbs Youtube 的最讚貼文
00:31 download MySQL ODBC driver https://dev.mysql.com/downloads/connector/odbc/
01:53 ติดตั้ง MySQL ODBC driver
05:19 สร้าง DSN (Data Source Name)
06:34 ใช้ Excel ในการดึงข้อมูลจาก MySQL
ดาวน์โหลด MySQL: disney movie database (disney_mysql.sql) ได้ที่ ► http://bit.ly/2M6dHif
เชิญสมัครเป็นสมาชิกของช่องนี้ได้ที่ ► https://www.youtube.com/subscription_center?add_user=prasertcbs
สอน MySQL ► https://www.youtube.com/playlist?list=PLoTScYm9O0GFmJDsZipFCrY6L-0RrBYLT
สอน PostgreSQL ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGi_NqmIu43B-PsxA0wtnyH
สอน Microsoft SQL Server 2012, 2014, 2016, 2017 ► https://www.youtube.com/playlist?list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn
สอน SQLite ► https://www.youtube.com/playlist?list=PLoTScYm9O0GHjYJA4pfG38M5BcrWKf5s2
สอน SQL สำหรับ Data Science ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGq8M6HO8xrpkaRhvEBsQhw
การเชื่อมต่อกับฐานข้อมูล (SQL Server, MySQL, SQLite) ด้วย Python ► https://www.youtube.com/playlist?list=PLoTScYm9O0GEdZtHwU3t9k3dBAlxYoq59
การใช้ Excel ในการทำงานร่วมกับกับฐานข้อมูล (SQL Server, MySQL, Access) ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGA2sSqNRSXlw0OYuCfDwYk
#prasertcbs_SQL #prasertcbs #prasertcbs_PostgreSQL
http server python 在 prasertcbs Youtube 的最佳貼文
ดาวน์โหลดไฟล์ที่ใช้ในคลิปได้ที่ ► http://bit.ly/2zm7qGs
เชิญสมัครเป็นสมาชิกของช่องนี้ได้ที่ ► https://www.youtube.com/subscription_center?add_user=prasertcbs
สอน MySQL ► https://www.youtube.com/playlist?list=PLoTScYm9O0GFmJDsZipFCrY6L-0RrBYLT
สอน PostgreSQL ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGi_NqmIu43B-PsxA0wtnyH
สอน Microsoft SQL Server 2012, 2014, 2016, 2017 ► https://www.youtube.com/playlist?list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn
สอน SQLite ► https://www.youtube.com/playlist?list=PLoTScYm9O0GHjYJA4pfG38M5BcrWKf5s2
สอน SQL สำหรับ Data Science ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGq8M6HO8xrpkaRhvEBsQhw
การเชื่อมต่อกับฐานข้อมูล (SQL Server, MySQL, SQLite) ด้วย Python ► https://www.youtube.com/playlist?list=PLoTScYm9O0GEdZtHwU3t9k3dBAlxYoq59
การใช้ Excel ในการทำงานร่วมกับกับฐานข้อมูล (SQL Server, MySQL, Access) ► https://www.youtube.com/playlist?list=PLoTScYm9O0GGA2sSqNRSXlw0OYuCfDwYk
#prasertcbs_SQL #prasertcbs #prasertcbs_MySQL
http server python 在 Simple Python 3 HTTP server for logging all GET and POST ... 的推薦與評價
Very simple HTTP server in python for logging requests. Usage:: ./server.py [<port>]. """ from http.server import BaseHTTPRequestHandler, HTTPServer. ... <看更多>
http server python 在 Python SimpleHTTPServer doesn't work - A server error ... 的推薦與評價
... <看更多>
http server python 在 Python 快速建立簡單網頁伺服器http web sever 的推薦與評價
利用Python 內建SimpleHTTPServer 模組(對應到Python 3 的http.server 模組),下一個簡單的指令,馬上就建立好一個網頁目錄伺服器,其. ... <看更多>