Rails如何处理来自不同用户的多个请求而不会发生冲突?逻辑是什么?
例如,user1登录并浏览该站点。同时,user2,user3,...登录并浏览。 rails如何管理这种情况而用户之间没有任何数据冲突?
答案 0 :(得分:4)
这里要记住的一件事是,即使用户在浏览器中同时使用该网站,服务器仍然可能一次只处理一个请求。请求处理可能需要不到一秒的时间,因此请求可以排队等待处理而不会对用户造成显着延迟。每个响应都从空白平板开始,仅从请求中获取信息并使用它从数据库中查找数据。它不会从一个请求到下一个请求进行任何操作。这被称为“无国籍”范式。
如果负载增加,可以添加更多的rails服务器。因为无论如何每个响应都从头开始,所以添加更多服务器不会产生与“共享信息”有关的任何问题,因为所有信息都在请求中发送或从数据库加载。这只意味着每秒可以处理更多请求。
当他们对用户感觉“连续性”时,例如保持登录网站,这是通过cookie完成的,cookie存储在他们的机器上并作为请求的一部分发送。服务器可以从请求中读取此cookie信息,例如,不会将某人重定向到登录页面,因为cookie告诉他们他们已经以用户123或其他任何方式登录。
答案 1 :(得分:2)
如果您的问题是关于Rails如何区别用户,答案将是使用cookie来存储会话。您可以阅读更多相关信息here。
此外,数据不会发生冲突,因为您为每个请求获取了新的控制器实例
当您的应用程序收到请求时,路由将确定 要运行哪个控制器和操作,然后Rails创建一个实例 该控制器并运行与操作同名的方法。
答案 2 :(得分:1)
这不是由Rails保证,而是由webservice使用的数据库保证。您提到的属性称为isolation。这是实际数据库必须满足的几个属性之一,称为ACID。
答案 3 :(得分:1)
这是使用a "session"实现的:一组特定于给定客户端的数据,可用服务器端。
服务器有plenty of ways来存储会话,通常Rails使用cookie:一个小的(通常约4 kB)数据集存储在用户的浏览器上,发送给每个人请求即可。出于这个原因,你不想在那里存储太多。但是,你通常不需要太多,你只需要足够的识别用户,但仍然很难冒充他。
因此,Rails将会话本身存储在cookie中(如this guide所述)。它很简单,无需设置。有些人认为cookie存储是不可靠的,而是使用持久性机制:数据库,键值存储等。
通常工作流程如下:
由于不同的用户发送不同的会话ID,Rails会将它们视为不同的会话ID,并输出与检测到的数据相关的数据:基于每个请求。
在您提出之前:是,可以窃取其他人的会话ID并以该人的姓名行事。它被称为session hijacking,它只是您可能遇到的所有可能的安全问题之一,除非您小心。同一页面提供了有关如何防止用户遭受痛苦的更多见解。
答案 4 :(得分:0)
作为附加案例你可以使用类似" puma"多线程服务器...