请求处理如何与rails,redis和node.jsasynchronous?

对于Web开发,我想混合使用rails和node.js,因为我想从两个世界中获得最好的效果(rails for fast web development and node for concurrency)。 我知道有些人select使用完整的ruby stack,并将eventmachine集成到rails controller中,这样每个请求在事件循环模型中都可以使用光纤进行非阻塞。 我已经能够理解这是如何工作的大局。

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

我的问题:

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

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

  3. 我是redis的新手,仍然在学习。 如果我为我的后端数据库(如mongoDB或couchDB)使用100%的noSQL解决scheme,它们可以被redis完全replace,或者redis更像是一个类似rabbitMQ的消息队列工具吗?

  4. 消息队列是一个不同于线程或事件循环模型的并发概念,还是应该补充它们?

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

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

首先要确定我们在涉及技术的优势/弱点方面处于同一页面

Rails :用于Web开发的简单性和完美的服务数据库支持的Web应用程序。 当您不得不提供大量长时间运行的请求(因为您的Ruby工作线程中的线程不够用),但却非常适合于可以通过更多Web节点(多个Web服务器 – 1分贝)水平扩展的任何事情, 。

Node.js :非常适合高并发情况。 并不像写一个普通的web应用程序那样容易。 但是可以有效地处理几乎长时间运行的低cpu任务。

Redis :一个支持数据结构操作的键值存储(递增/递减值,向列表追加/预先推送/popup – 使这个数据库与多个客户一次写入的操作保持一致)

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

如果您将Node和Rails设置在一起,那么您的应用程序的某些区域的缩放需求将大不相同。

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

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

因此,您可以使用Rails作为注册/login部分 – 注册后一次将会话cookie写入redis,并与用户的权限(他允许遵循哪些游戏)相关联,然后将用户移交给Node.js应用程序。 那里的Node应用程序可以从Redis读取会话信息并为用户提供服务。

build议的意思:只要将Node.js投入到您的工具箱中,就无法获得可扩展性。 你真的必须找出Node.js擅长什么(低CPU高并发操作),以及如何利用它来弥补当前select的技术存在的一些问题。

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