如果您預期您的應用程式會湧入大量流量(或者更好的是,您已經有流量了),您會希望建立一個可擴展的架構,讓您可以在應用程式受到越來越多請求時新增伺服器。
在生產環境中,Sails 的效能與任何 Connect、Express 或 Socket.io 應用程式類似(範例)。如果您有想要分享的基準測試,請撰寫一篇部落格文章或文章,並在 Twitter 上推文 @sailsjs。但撇開基準測試不談,請記住大多數效能和可擴展性指標都是特定於應用程式的。您的應用程式的實際效能將更多地取決於您實作業務邏輯和模型呼叫的方式,而不是您正在使用的底層框架。
....
/ Sails.js server \ / Database (e.g. Mongo, Postgres, etc)
Load Balancer <--> Sails.js server <--> Socket.io message queue (Redis)
\ Sails.js server / \ Session store (Redis, Mongo, etc.)
....
Node.js(以及隨之而來的 Sails.js)應用程式可以水平擴展。這是一種強大而有效的方法,但需要稍微規劃一下。在規模化時,您會希望能夠將您的應用程式複製到多個 Sails.js 伺服器,並將它們放在負載平衡器後面。
擴展應用程式的一大挑戰是,這些叢集部署無法共享記憶體,因為它們位於不同的實體機器上。最重要的是,無法保證使用者在請求之間(無論是 HTTP 還是 sockets)會「黏著」在同一台伺服器上,因為負載平衡器會將每個請求路由到資源最充裕的 Sails 伺服器。關於擴展伺服器端應用程式,最重要的事情是要記住它應該是無狀態的。這表示您應該能夠將相同的程式碼部署到 _n_ 個不同的伺服器,並期望任何給定的傳入請求由任何給定的伺服器處理,並且一切都應該仍然正常運作。幸運的是,Sails 應用程式幾乎開箱即用就已準備好進行這種部署。但在將您的應用程式部署到多個伺服器之前,您需要做一些事情
config/session.js
中的 adapter
選項),並安裝 "@sailshq/connect-redis" session 配接器作為您應用程式的相依性(例如 npm install @sailshq/connect-redis --save
)。config/env/production.js
中的相關行。npm install @sailshq/socket.io-redis
)production
環境中啟動您的應用程式,和/或考慮完全關閉 Grunt。有關單一伺服器叢集中 Grunt 問題的更多詳細資訊,請參閱此處。config/bootstrap.js
中將資料持久儲存在資料庫中的程式碼,以避免叢集中的每個節點多次執行 bootstrap 時發生衝突。將您的應用程式部署到像 Heroku 或 Modulus 這樣的 PaaS 很簡單!請查看 Hosting 以取得特定於平台的信息。
forever
或 pm2
這樣的守護程式啟動您的應用程式(有關守護程式的更多資訊,請參閱 https://sails.dev.org.tw/documentation/concepts/deployment)。最佳化 Node/Sails 應用程式中的端點與最佳化任何其他伺服器端應用程式中的端點完全相同;例如,識別和手動最佳化慢速查詢、減少查詢數量等。對於 Node 應用程式,如果您發現您有一個流量很大的端點佔用大量 CPU,請尋找可能在迴圈或遞迴深入中被重複呼叫的同步(阻塞)模型方法、服務或機器。
但請記住
過早的最佳化是萬惡之源。—Donald Knuth
無論您使用什麼工具,重要的是花費您的時間和精力編寫高品質、文件完善、可讀性高的程式碼。這樣,如果/當您被迫最佳化應用程式中的程式碼路徑時,您會發現它更容易做到。
- 您不必為您的 sessions 使用 Redis;您實際上可以使用任何與 Connect 或 Express 相容的 session 儲存區。有關更多資訊,請參閱 sails.config.session。
- 一些託管的 Redis 提供商(例如 Redis To Go)設定了 閒置連線的逾時時間。在大多數情況下,您會希望關閉此功能,以避免應用程式中出現意外行為。如何關閉逾時時間的詳細資訊因提供商而異,因此您可能需要聯絡他們的支援團隊。