2012-03-03 72 views
1

对于Web开发,我想混合使用rails和node.js,因为我想从两个世界中获得最佳效果(用于快速Web开发的rails和用于并发的节点)。我知道有些人选择使用带有eventmachine的完整ruby堆栈,并将其集成到rails控制器中,以便每个请求都可以在事件循环模型中使用光纤进行非阻塞。我已经能够理解这是如何运作的。使用rails,redis和node.js进行异步请求处理的方式是什么?

在这个moement但是我想尝试使用rails和node.js与消息队列概念做非阻塞请求处理。我听说这可以通过使用redis作为中介来实现。我仍然无法弄清楚现在的工作方式。从我能理解的情况来看:所以我们有2个应用程序A(rails)和B(node.js)和redis。 rails应用程序将处理来自用户的请求,这些用户通过REST方式通过控制器,然后从那里通过redis传递,然后redis将形成队列,node.js应用程序将拾取该队列并事后做任何必要的事情(写或从后端数据库读取)。

我的问题:

  1. 因此,如何将改善并发性和可扩展性?从我知道,因为rails同步通过控制器 处理请求,然后写入redis,即使node.js结束可以异步地拾取队列 ,请求仍然会阻止 。 (我有一种感觉,它不是异步的,但如果它不是非阻塞的端到端 )。

  2. 如果redis 是中介,那么node.js会被认为是代理还是应用程序?

  3. 我是redis的新手,还在学习它。如果我为我的后端数据库(如mongoDB或couchDB)使用100%noSQL 解决方案,它们是否可以完全由redis替换,或者redis更像 类似rabbitMQ的消息队列工具?

  4. 消息传递队列与线程或事件循环模型不同,它是否应该补充它们?

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

回答

2

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

让我们先确保我们对于优势在同一页/所涉及的技术

的Rails的弱点:用于它的网络开发的简单性和完美的服务数据库支持的Web应用程序。 由于您的Ruby工作线程中没有线程,因此不得不提供大量长时间运行的请求 - 但非常适合于通过更多Web节点(多个Web服务器 - 1 db )。

Node.js:适用于高并发情况。不像铁轨那么容易编写一个普通的Web应用程序。但是可以有效处理大量长时间运行的低CPU任务。

Redis的:一个支持它的操作键 - 值存储的数据结构(递增/递减值,追加/ prepent推/流行到列表 - 使这种DB工作始终与多个客户端同时写入所有操作)

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

如果您将Node和Rails设置在一起,那么您的应用程序的某些区域的缩放需求会有很大差异。

如果您正在编写一个显示足球比赛实时统计数据的网站,您可以很容易地看到在您的应用中存在两个不同的问题:包含注册,帐单和个人资料的“正常”网站,通过导轨快速实施。用户看到实时结果的网站“实时”部分,您希望能够同时处理大量客户端 - 所有这些都在等待发生的事情(低cpu - 高并发性)。

在这种情况下,将网站的两部分实际分成Ruby和Node应用程序,然后通过像Redis这样的商店共享有关用户的数据可能会有所帮助(但实际上您只需要一些共享状态为了同步目的,两者都可以查看和写入)。

因此,您将使用Rails作为注册/登录部分 - 注册后,将会话cookie写入redis以及用户权限(他允许遵循哪些游戏),然后将用户关闭Node.js应用程序。 那里Node应用程序可以从Redis读取会话信息并为用户提供服务。

建议的问题: 通过简单地将Node.js引入到您的工具箱中,您无法获得可伸缩性。你真的必须找出Node.js擅长什么(低CPU高并发操作)以及如何利用它来弥补当前选择的技术存在的一些问题。

0

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