Session 无状态是否仅传输客户端';什么地方的州?

Session 无状态是否仅传输客户端';什么地方的州?,session,architecture,scalability,stateless,web-architecture,Session,Architecture,Scalability,Stateless,Web Architecture,我花了一整天的时间来理解什么是无状态体系结构。我读了很多帖子和答案,比如 看来无状态只是将一些用户状态转移到 其他地方(数据库/内存缓存或客户端cookies)。是否正确?如果是,则状态仅存储在其他位置,因此必须存在非无状态的东西(客户端或服务器),尽管负载平衡器现在不需要担心路由到哪台机器 如果上面是正确的,如果我们选择将用户信息传输到中心位置(根据一些答案,transfer to client似乎并不总是解决方案),例如数据库或memcache,我们仍然需要为每个请求找到此会话信息。

我花了一整天的时间来理解什么是无状态体系结构。我读了很多帖子和答案,比如

  • 看来无状态只是将一些用户状态转移到 其他地方(数据库/内存缓存或客户端cookies)。是否正确?如果是,则状态仅存储在其他位置,因此必须存在非无状态的东西(客户端或服务器),尽管负载平衡器现在不需要担心路由到哪台机器

  • 如果上面是正确的,如果我们选择将用户信息传输到中心位置(根据一些答案,transfer to client似乎并不总是解决方案),例如数据库或memcache,我们仍然需要为每个请求找到此会话信息。这意味着保存用户状态的地方在同时处理数千万个请求时将面临同样的压力。而且,我们查找会话信息的方式可能就像粘性会话(将信息请求路由到memcache中的单个节点)。那么为什么我们认为转移国家更具有可扩展性呢?只传输压力(而且总是数据库已经有太多负载)

我是否错过了什么或理解错了


谢谢大家!

将状态移动到另一层意味着您的应用程序是有状态的,这是正确的(真正无状态的应用程序很少,大多数只做纯数学的应用程序)

这并不意味着单个层不能是无状态的,并且那些无状态的层的伸缩性将不同于有状态的层。其思想是,通过使应用程序的特定部分成为无状态,您将能够扩展它,而不是垂直扩展,从而能够通过购买更多硬件来响应更多的请求

您仍然需要将该状态扩展到任何地方。因此,如果要将其推出数据库,则需要能够相应地扩展该数据库。如果您可以将其推出到一个可以廉价扩展的层(如memcached),那么这种方法效果很好

通常目标是使业务层和web层无状态,因为它们通常比数据存储层的扩展成本更高,但这并不总是正确的。如果您在数据存储层上施加了大量负载,而在应用程序或web层上施加了很少的负载(如数据驱动的应用程序和交互驱动的应用程序),那么您的数据层将过载


因此,像其他事情一样,是否使应用程序无状态归结为“视情况而定”。通常,有状态的业务层和web层往往在数据层过载之前很久就会过载。尤其是在执行重要的OOP时。

用户状态可以保留在客户端,前提是客户端可以在不违反任何业务规则的情况下对服务器进行有意义的调用。@AshleyFrieze,是的,但有时这并不是一个解决方案r某个敏感或大型用户状态,不是吗?我们是在谈论状态?还是数据?您可以使用持久性服务来存储内容。状态通常是一种“我们到目前为止都做了些什么”的东西,而不仅仅是“用户到目前为止键入的所有内容”@AshleyFrieze,转移到客户端是一种选择,但并不总是如此。所以现在,我们仍然使用central place来存储状态,这是我问题的主要关注点谢谢!所以,在你看来,价格/规模的便利性是转移状态的最重要因素?但我混淆的是这一点(以数据库存储状态为例),数据库总是会有很大的负载,需要减少负载,所以如果我们转移“压力”对于db来说,为什么这被认为更容易/更易于扩展?memcache上的问题也是如此。上面的问题让我最困惑,请您更新您的答案并提供更多详细信息。谢谢!数据库通常没有更多的负载。即使有,您通常也可以重构它,将内容拆分为多个可以扩展的表er多台机器。事实上,性能通常会随着您这样做而提高。数据库性能通常更多地是关于磁盘IO而不是内存/cpu。但是,在应用程序/web服务器上,您自然无法将域分割为比服务请求所需的域更小的域。这将建立最小的“分片”为通常非常接近您的域大小的用户会话提供服务。还有可靠性限制。数据库服务器(当然还有memcached)通常不会像应用程序服务器那样频繁地宕机。这主要是因为数据库服务器都比较成熟,并且没有程序员针对它们编写重要的应用程序代码,从而导致它们宕机(就像应用程序服务器那样)。我见过开发人员坚持编写大型存储过程或复杂连接的数据库密集型应用程序,这些应用程序会导致数据库层不稳定……但我见过应用程序服务器中出现更多无限循环或内存不足错误。性能如何?在我们转移压力后性能会更好吗?为什么?请告诉我更新你的答案,我会接受的。谢谢!再一次,“视情况而定”。性能将在您设置为无状态的层上更线性地扩展。这并不意味着每个请求都会更快,只是意味着您可以通过添加更多计算机来处理更多负载。但如果您已经被数据库阻塞,则会使问题更糟。无状态应用层不是一个灵丹妙药。最好的方法是找到答案在应用程序中使用负载测试工具,并找出失败的地方。