如果您预计应用程序将很快获得大量流量(或者更好的是,您已经拥有了流量),您需要设置一个可扩展的架构,以便在越来越多的请求访问您的应用程序时添加服务器。
在生产环境中,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 还是套接字)都“坚持”使用同一台服务器,因为负载均衡器会将每个请求路由到可用资源最多的 Sails 服务器。关于扩展服务器端应用程序最重要的一点是,它应该**无状态**。这意味着您应该能够将相同的代码部署到 _n_ 个不同的服务器上,并期望任何给定的传入请求由任何给定的服务器处理,并且所有内容仍然可以正常工作。幸运的是,Sails 应用程序几乎可以开箱即用地支持此类部署。但在将您的应用程序部署到多台服务器之前,您需要执行以下操作
config/session.js
中的 adapter
选项)并将“@sailshq/connect-redis”会话适配器作为应用程序的依赖项安装(例如 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 非常简单!查看 托管 以获取特定于平台的信息。
forever
或 pm2
这样的守护进程在每个实例上启动您的应用程序(有关守护进程的更多信息,请参阅 https://sails.js.cn/documentation/concepts/deployment)。优化 Node/Sails 应用程序中的端点与优化任何其他服务器端应用程序中的端点完全相同;例如,识别和手动优化缓慢的查询、减少查询数量等。对于 Node 应用程序,如果您发现有一个流量很大的端点正在占用 CPU,请查找可能在循环或递归遍历中反复调用的同步(阻塞)模型方法、服务或机器。
但请记住
过早优化是万恶之源。—Donald Knuth
无论您使用什么工具,编写高质量、记录良好、可读性强的代码都非常重要。这样,如果您/当您被迫优化应用程序中的代码路径时,您会发现这样做容易得多。
- 您不必为会话使用 Redis;实际上,您可以使用任何与 Connect 或 Express 兼容的会话存储。有关更多信息,请参阅 sails.config.session。
- 一些托管的 Redis 提供商(例如 Redis To Go)会为空闲连接设置 超时。在大多数情况下,您需要关闭此功能以避免应用程序出现意外行为。关闭超时的具体方法因提供商而异,因此您可能需要联系其支持团队。