为什么同步SQL"坏"?

时间:2015-11-28 21:18:32

标签: javascript ruby-on-rails node.js activerecord sequelize.js

我的学生在ActiveRecord上为Sinatra和Rails做了一些努力,但他们最终得到了它。

然而,它们完全在Sequelize for Node上烧毁。

在我看来,Sequelize和AR之间的最大区别在于AR是同步的,而Sequelize则不是。

考虑:

# ActiveRecord
@post = Post.find(2)
render json: @post
// Sequelize
Post.findById(2).then(function(post){
  response.json(post);
});

对于像这样的小动作,差异仍然可见,但看起来并不那么糟糕。对于更复杂的查询,很容易发现自己处于回调地狱。

所以我的问题是:为什么ActiveRecord可以同步,但JS ORM同步却不好?

我理解同步与异步的缺点。但同步性的缺点似乎并没有伤害ActiveRecord。

Sequelize的困难并不仅仅是你要写.then(function(){})一千次;它也理解回调的工作方式对Javascript有很大的帮助,而且由于Sequelize是Node的主要关系ORM,它使Node对初学者来说更不容易接近。有人可能会说"初学者不应该使用Node,"但是Rails已经取得了巨大的成功,因为他们努力使新手开发者能够接近它。

1 个答案:

答案 0 :(得分:6)

JS ORM同步是不好的,因为底层执行引擎(Node.js)基于基于execution model的异步事件循环。

Node.js scales well尽管是单线程的唯一原因是因为它使用非阻塞IO并且有active ecosystem个库可以很好地与非阻塞异步模型配合使用。

正是因为这一点,与ruby应用程序服务器不同,一个进程一次只处理一个请求,一个node.js进程很容易将大量请求作为昂贵的IO操作(如从磁盘读取) ,从DB读取,与外部服务通信)do not block the process

换句话说,如果Node是同步的,那么一个用户的数据库查询将导致服务器“挂起”并且对所有其他用户没有响应,直到查询完成。

Traditional threaded model Node Event loop

This post详细阐述了Node.js事件循环的细节。

现在虽然这对于一直处理javascript中的回调的Web开发人员来说是直观的,但它确实使新开发人员变得困难,他们通常不熟悉面向回调的API。然而,Node.js的一些新进展使事情变得更简单。

特别值得注意的是对生成器和异步/等待函数的支持。使用这些功能,我们可以消除回调金字塔,并使用普通的try / catch语法在异步代码中进行错误处理。

使用基于生成器的控制流库(如co异步代码)可以以线性方式编写,利用生成器(最新的Node.js版本已经支持)。

虽然async / await尚未在Node.js中正式提供,但它简化了异步代码even further,无需像co这样的库。使用像babel这样的转录程序可以使用此功能right now - 这就是我建议您考虑在课堂上使用的内容。