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

时间:2015-06-25 11:33:48

标签: ruby-on-rails ruby database acid

Rails如何处理来自不同用户的多个请求而不会发生冲突?逻辑是什么?

例如,user1登录并浏览该站点。同时,user2,user3,...登录并浏览。 rails如何管理这种情况而用户之间没有任何数据冲突?

5 个答案:

答案 0 :(得分:4)

这里要记住的一件事是,即使用户在浏览器中同时使用该网站,服务器仍然可能一次只处理一个请求。请求处理可能需要不到一秒的时间,因此请求可以排队等待处理而不会对用户造成显着延迟。每个响应都从空白平板开始,仅从请求中获取信息并使用它从数据库中查找数据。它不会从一个请求到下一个请求进行任何操作。这被称为“无国籍”范式。

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

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

答案 1 :(得分:2)

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

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

RailsGuides:

  

当您的应用程序收到请求时,路由将确定   要运行哪个控制器和操作,然后Rails创建一个实例   该控制器并运行与操作同名的方法。

答案 2 :(得分:1)

这不是由Rails保证,而是由webservice使用的数据库保证。您提到的属性称为isolation。这是实际数据库必须满足的几个属性之一,称为ACID。

答案 3 :(得分:1)

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

服务器有plenty of ways来存储会话,通常Rails使用cookie:一个小的(通常约4 kB)数据集存储在用户的浏览器上,发送给每个人请求即可。出于这个原因,你不想在那里存储太多。但是,你通常不需要太多,你只需要足够的识别用户,但仍然很难冒充他。

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

通常工作流程如下:

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

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

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

答案 4 :(得分:0)

作为附加案例你可以使用类似" puma"多线程服务器...