Rails 如何处理多个传入请求?

How does Rails handle multiple incoming requests?

Rails 如何在不发生冲突的情况下处理来自不同用户的多个请求?这是什么逻辑?

例如,用户 1 登录并浏览了该站点。同时,user2,user3,...登录并浏览。 rails 如何在用户之间不发生任何数据冲突的情况下管理这种情况?

这不是由 Rails 保证的,而是由网络服务使用的数据库保证的。你说的属性叫做isolation。这是实用数据库必须满足的几个属性之一,称为 ACID。

作为其他情况,您可以使用类似 "puma" 多线程服务器的东西...

如果您的问题是关于 Rails 如何区分用户,答案将是使用 cookie 来存储会话。您可以阅读更多相关信息 here

数据也不会冲突,因为您为每个请求获取了新的控制器实例

RailsGuides:

When your application receives a request, the routing will determine which controller and action to run, then Rails creates an instance of that controller and runs the method with the same name as the action.

这是使用 a "session" 实现的:一组特定于给定客户端的数据,在服务器端可用。

plenty of ways for a server to store a session, typically Rails uses a cookie:存储在用户浏览器上的小型(通常约为 4 kB)数据集,随每个请求一起发送。出于这个原因,你不想在那里存储太多。然而,你通常不需要太多,你只需要足以识别用户并且仍然很难冒充他。

因此,Rails 将会话本身存储在 cookie 中(如 this guide 所说)。它很简单,不需要设置。有些人认为 cookie 存储不可靠并使用持久性机制代替:数据库、键值存储等。

通常的工作流程如下:

  • 当服务器决定初始化会话时,会话 ID 存储在 cookie 中
  • 服务器收到用户请求,通过id获取session
  • 如果会话说它代表用户 X,Rails 就好像它实际上是他一样

由于不同的用户发送不同的会话 ID,Rails 将它们视为不同的会话 ID,并输出与检测到的会话 ID 相关的数据:基于每个请求。

在你提问之前是的,可以窃取对方的会话 ID 并以该人的名义行事。它称为 session hijacking,它只是您可能 运行 遇到的所有可能的安全问题之一,除非您小心。同一页面提供了更多关于如何防止用户遭受痛苦的见解。

这里要记住的一件事是,即使用户在他们的浏览器中同时使用该站点,服务器仍然可能一次只处理一个请求。请求处理可能需要不到一秒钟的时间,因此请求可以排队等待处理,而不会对用户造成重大延迟。每个响应都从一张白纸开始,仅从请求中获取信息并使用它从数据库中查找数据。它不会从一个请求转移到下一个请求。这称为 "stateless" 范式。

如果负载增加,可以添加更多 rails 服务器。因为无论如何每个响应都是从头开始的,所以添加更多服务器不会对 "sharing of information" 产生任何问题,因为所有信息要么在请求中发送,要么从数据库加载。这只是意味着每秒可以处理更多的请求。

当他们对用户有 "continuity" 的感觉时,例如保持登录网站,这是通过 cookie 完成的,cookie 存储在他们的机器上并作为请求的一部分发送。服务器可以从请求中读取此 cookie 信息,例如,不会将某人重定向到登录页面,因为 cookie 告诉他们他们已经以用户 123 或其他身份登录。