Rails、redis 和 node.js 如何异步处理请求?

Posted

技术标签:

【中文标题】Rails、redis 和 node.js 如何异步处理请求?【英文标题】:How is request processing with rails, redis, and node.js asynchronous? 【发布时间】:2012-03-21 13:47:05 【问题描述】:

对于 Web 开发,我想混合使用 rails 和 node.js,因为我想充分利用这两个世界(用于快速 Web 开发的 rails 和用于并发的 node)。我知道有些人选择将完整的 ruby​​ 堆栈与集成到 rails 控制器中的 eventmachine 一起使用,这样每个请求都可以通过在 event-loop 模型中使用 Fiber 来实现非阻塞。我已经能够从大局中理解它是如何运作的。

不过,此时我想尝试使用带有消息队列概念的 rails 和 node.js 进行非阻塞请求处理。听说这可以通过redis作为中介来实现。到目前为止,我仍然无法弄清楚它是如何工作的。据我了解:所以我们有 2 个应用程序 A(rails)和 B(node.js)和 redis。 rails 应用程序将处理来自以 REST 方式通过控制器的用户的请求,然后从那里 rails 将通过 redis 传递该请求,然后 redis 将形成队列,node.js 应用程序将拾取该队列并在事后执行任何必要的操作(编写或从后端数据库读取)。

我的问题:

    那么这将如何提高并发性和可扩展性呢?从我 知道因为 rails 通过控制器处理请求 同步,然后写入redis,请求将是 仍然阻塞,即使 node.js 端可以拾取队列 异步。 (我有一种感觉,如果它不是端到端的话,它还不是异步的 非阻塞)。

    如果是redis,node.js在这里会被认为是代理还是应用程序 是中介吗?

    我是 redis 新手,还在学习它。如果我使用 100% noSQL 我的后端数据库(例如 mongoDB 或 couchDB)的解决方案是完全可以用 redis 替换,还是 redis 更多地被视为 像rabbitMQ这样的消息队列工具?

    消息队列是与线程不同的并发概念吗? 事件循环模型还是应该补充它们?

这就是我的全部问题。我是消息队列概念的新手。将感谢任何帮助和指向正确方向的指示以及帮助我​​了解更多信息的文章。谢谢。

【问题讨论】:

【参考方案1】:

你在这里混合了一些不在一起的东西。

让我们首先确保我们在所涉及技术的优势/劣势方面意见一致

Rails:用于它的 Web 开发简单性,非常适合为数据库支持的 Web 应用程序提供服务。 当您必须处理大量长时间运行的请求时性能不佳,因为您的 Ruby 工作线程会用完 - 但非常适合可以使用更多 Web 节点水平扩展的任何东西(多个 Web 服务器 - 1 db) .

Node.js:非常适合高并发场景。在其中编写常规 Web 应用程序不像 rails 那样容易。但可以高效地处理近乎疯狂的长时间运行的低 CPU 任务。

Redis:支持对其数据结构进行操作的键值对存储(递增/递减值、追加/准备推送/弹出到列表 - 所有使此数据库与多个数据库一致工作的操作)客户一次写)

现在您可以看到,让 Rails 和 Node 处理相同的请求没有任何好处——通过 Redis 进行通信。如果请求最终由 Node 服务器处理,则通过 Rails 堆栈不会提供任何好处。 即使您只将一些处理卸载到节点服务器,它仍然是 Rails 网络服务器处理请求并且必须等待来自节点的响应 - 扼杀了所需的可伸缩性。这根本没有意义。

您可以在应用程序的某些区域同时使用 Node 和 Rails 进行设置,这些区域的扩展要求截然不同。

例如,如果您正在编写一个显示足球比赛实时统计数据的网站,您可以很容易地看到您的应用中有两个不同的问题:“正常”网站包含注册、计费和个人资料内容,需要快速通过rails实现。还有网站的“实时”部分,用户可以在其中看到实时结果,并且您希望一次处理大量客户 - 所有人都在等待某事发生(低 cpu - 高并发)。

在这种情况下,将站点的两个部分实际分离为 Ruby 和 Node 应用程序,然后通过 Redis 之类的存储共享有关用户的数据可能是有益的(但实际上您只需要一些共享状态两者都可以查看和写入以进行同步)。

因此,您可以将 Rails 用于注册/登录部分 - 一旦注册,将会话 cookie 连同用户的权限一起写入 redis(允许他关注什么游戏)并将用户交给节点.js 应用程序。 在那里,Node 应用程序可以从 Redis 读取会话信息并为用户提供服务。

忠告: 简单地将 Node.js 放入工具箱是无法获得可扩展性的。您确实必须了解 Node.js 擅长什么(低 CPU 高 io 并发操作),以及如何利用它来解决您当前选择的技术存在的一些问题。

【讨论】:

【参考方案2】:

我可以为你回答 3。 Redis 不保证当您执行操作时结果实际上会在磁盘上,事务处理也有点“不同”。它还要求整个数据库都在内存中。根据情况,这可能是一个问题,也可能不是。然而,它的速度非常快。它不是消息队列,您可以轻松地从中创建一个队列,但这不是它的目的。如果您只想拥有一个排队系统,您可能可以用其他东西做得更好。

【讨论】:

以上是关于Rails、redis 和 node.js 如何异步处理请求?的主要内容,如果未能解决你的问题,请参考以下文章

等价于 Node.js 的 Rails 控制台

Node.js vs Ruby on Rails:哪个最适合Web开发?

Rails / execjs 找不到 Node.js

如何在node js中配置redis客户端

如何实现 Laravel、node.js、socket.io 和 redis 以使用数据库创建实时聊天/通知

在 node.js 中,如何使用 socket.io 和 express 设置 redis?具体使用 RedisStore()