根据PM:https://pm2.io/docs/runtime/guide/load-balancing/的文档,为了利用其负载平衡特性(使用节点的集群生成多个节点进程),我需要一个无状态的nodejs应用程序。
在集群的上下文中,首先需要确保应用程序没有内部状态。内部状态通常是存储在其进程中的一些本地数据。例如,它可以是一个websocket连接数组,也可以是一个本地会话内存。使用Redis或其他数据库来共享进程之间的状态。
我如何知道我的nodejs应用程序是否是无状态的?
发布于 2021-03-29 16:01:11
您可能需要首先检查什么定义了无状态应用程序?。实际上,与有状态web应用程序相比,无状态web应用程序不会将其信息保存在服务器内存中的多个请求之间,而是依赖于数据库、外部缓存系统等。
有状态应用程序有什么问题?假设一个博客引擎依赖于内存中的缓存来存储生成的页面,每篇文章都有一个缓存条目。当某人更改项目时,缓存将失效。如果您在一台服务器上托管博客,它会运行得很好。另一方面,如果您开始拥有多台服务器,那么缓存失效可能会转到其中一台服务器上,而其他服务器将继续为该页面的过时版本服务--一些访问者将看到新的文章,而另一些人仍将访问旧的。
因此,状态阻止应用程序托管在多台计算机上(在某些情况下甚至是多个进程),并且在单个计算机上被单个进程卡住会阻止对应用程序进行缩放。随着用户数量的增加,您将需要更强大的服务器来承载该应用程序,而且在某些时候,您将无法应付负载。
我如何知道我的nodejs应用程序是否是无状态的?
如果您开发了应用程序,那么您应该已经知道了,现在您已经了解了无状态意味着什么。
如果你不知道的话,研究一下密码。检查变量是如何使用的。有全局变量吗?在请求之间有什么东西吗?
一个很好的起点是检查以下部分:
这是你最常发现的状态。如果您在这里没有看到任何有状态行为,这并不一定意味着应用程序是无状态的。如果它不是在编写时考虑到了无国籍状态,那么它很有可能就不是了。一种很好的方法是在几个节点上托管它,然后看看会发生什么。它从来没有给你明确的答案,它是否是无状态的,但有时它变得非常清楚,状态涉及。
我想知道如何使用套接字或“本地会话内存”使nodejs应用程序“有状态”。
如果本地会话内存是指JavaScript代码中的实际全局变量,那么是的,应用程序是有状态的。
至于套接字,我不确定您是谈论实际插座,还是键入错误的WebSocket协议。在套接字的情况下,它与状态无关。在WebSocket的情况下,这完全取决于消息队列的实现方式。您可以有一个完全无状态的实现,它依赖于消息队列服务或Redis pub-sub,因为您可以以全局变量的形式对队列进行ersatz,这意味着应用程序是有状态的。
https://softwareengineering.stackexchange.com/questions/424916
复制相似问题