# Node.js 成为堆栈的一部分了吗？ SimpleGeo 说是的。

> 原文： [http://highscalability.com/blog/2011/2/22/is-nodejs-becoming-a-part-of-the-stack-simplegeo-says-yes.html](http://highscalability.com/blog/2011/2/22/is-nodejs-becoming-a-part-of-the-stack-simplegeo-says-yes.html)

![](img/1ff747da24156c99060dda1b8dbd71b3.png)

这是对 [SimpleGeo](http://simplegeo.com/) 的基础架构工程师 Wade Simmons 的采访，这项服务使*易于开发人员根据[节点的使用情况轻松创建位置感知应用程序](http://nodejs.org/)*。 js 作为后端服务组件，取代了一次用 Java，Python 或 Ruby 编写的代码。 这些天，Node.js 发现它进入了很多堆栈，我很好奇为什么会这样。 我在编写多个消息传递系统时的经验是，程序员不喜欢异步模型，而像 Node.js 这样的纯异步编程模型（尤其是使用服务器端 Javascript 的异步编程模型）将脱颖而出，这真是令人惊讶。 韦德（Wade）足够慷慨地帮助他们解释在 SimpleGeo 使用 Node.js 的背后原因。 我非常感谢 Wade 抽出宝贵时间接受采访。 他做得非常出色，并为现代 Web 堆栈如何在现实生活的坩埚中发展提供了很多见识。

从这里开始对韦德·西蒙斯的采访：

从一开始，在 SimpleGeo，我们一直是事件驱动，无阻塞网络服务器的粉丝。 我们的核心 API 服务器是用 Python 编写在 Tornado Web 服务器（ [http://www.tornadoweb.org](http://www.tornadoweb.org) /）之上的。 我们也有使用 Twisted 编写的内部服务器（ [http://twistedmatrix.com/](http://twistedmatrix.com/) ）。 当您的服务器将主要是与 IO 绑定时，事件驱动框架非常有意义，并且我们的许多内部服务基本上都是围绕不同类型的索引和数据库进行包装的。

您可能想知道为什么我们已经在其他人中开发和部署了代码之后，为什么现在要尝试基于事件的不同框架呢？ 答案是我们希望 Node.js 可以避免的其他框架存在一些缺点。

### 未设计为异步的语言将阻塞

龙卷风的主要问题是图书馆的支持。 Tornado 提供了一个非阻塞的 HTTP 客户端，但是对其他协议的支持是有限的或不存在的。 这意味着很容易尝试使用大量可用于 Python 的库。 一旦发生这种情况，您将不可避免地开始阻止事件线程，并且到服务器的并发连接将开始彼此阻塞。 这意味着您遇到了两个世界中最糟糕的一个：单线程服务器，没有任何潜在的好处。

### Twisted 与 Python 的配合不佳

Python 的 Twisted 框架具有更好的库支持，因为已经为其实现了许多协议。 没有我们想要的那样广泛的支持，但是至少它比龙卷风要好得多。 不过，SimpleGeo 上的很多人都不是 Twisted 的粉丝，因为它与 Python 的其余部分无法很好地融合在一起。 例如，方法的命名约定为驼峰式，而不是 python 标准的“带下划线的小写”。 Twisted 的学习曲线也可能更陡峭，因为可以在网上找到更少的示例（尽管确实存在的示例非常好，并且也有一些好书）。

### 协作多任务模型更易于调试

我们还考虑了协程库，例如 Eventlet（ [http://eventlet.net/](http://eventlet.net/)）。 在 SimpleGeo 中有很多关于协作多任务或协程是否是更好的样式的争论。 决定继续使用 Node.js 的团队喜欢协作方法，因为它使调试并发问题更容易测试。 您确切地知道您的程序将控制权交给其他任务，因此追踪与共享状态有关的问题要容易得多。

### 异步浏览器体验正在转移到服务器

我认为 Node.js 受到青睐的主要原因之一是人们已经习惯了 JavaScript 的异步编程风格。 即使是主要从事后端工作的程序员也可能会不时地涉足客户端 JavaScript。 JavaScript 并不是完美的语言，但是它的功能却比大多数更好，并且有许多文献记载的方法可以避免它的陷阱。 离开浏览器世界后，不必再担心向后兼容性，美好的事物就会开始闪耀。

### 主要用作服务之间的胶水

当前，Node.js 的主要用途是作为 API 的入口点。 我们有许多不同的内部服务器，我们不同的 API 端点需要为每个请求命中一个或多个。 Node.js 服务器进行身份验证，发出并行内部请求，然后将结果合并为请求的输出格式。 该服务器还负责记录统计信息并记录详细的请求信息以供以后解析。

### 易于调试，测试和良好表现

到目前为止，我们的经验是编写 Node.js 代码非常直观并且易于测试。 生产部署非常稳定，我们还没有出现内存泄漏问题或使用如此年轻的平台（敲敲敲打）会遇到的其他问题。 我们计划在内部将 Node.js 用于我们框架的其他一些“胶合”样式； 主要充当后端和客户端之间的路由器/转换器的组件。 这些是已经或将要用 Tornado / Twisted 用 Pyt​​hon 编写的组件。 Python 在我们的堆栈中仍然有很多用途，但是随着我们对它的适应程度不断提高，Node.js 开始渗透。

### Node.js 没有计划实现 CPU 密集型服务

我们没有计划在 Node.js 中做任何占用大量 CPU 的工作。 我们正在 Cassandra 之上使用 Java 进行数据库层的开发，我们暂时可能会坚持使用它。 我们正在那里而不是在远程网络服务器上实施空间逻辑，因此我们可以在数据旁边进行尽可能多的处理。 我不相信对 v8 中的内存模型有足够的控制权（某些数据结构实际上可能是肿的），无法完成诸如 Node.js 中的数据库这样的密集型操作。

### 代码由 SimpleGeo 提供

尽管 Node.js 还很年轻，但社区发展非常迅速，在 github 和 npm（Node 包管理器）上可以找到大量的库。 SimpleGeo 喜欢开源，因此当我们发现缺少或缺少的图书馆时，请确保释放所有改进，以便其他人可以使用它们。

从我们的工作中创建的一些库示例：

*   [https://github.com/wadey/node-thrift](https://github.com/wadey/node-thrift)
*   [https://github.com/wadey/node-microtime](https://github.com/wadey/node-microtime)
*   [https://github.com/wadey/decimaljson](https://github.com/wadey/decimaljson)

在 [https://github.com/simplegeo](https://github.com/simplegeo) 上可以找到更多内容。

## 相关文章

*   Quora： [SimpleGeo 的 API 平台使用哪种语言编码？](http://www.quora.com/What-language-is-SimpleGeos-API-platform-coded-in/answer/Joe-Stump)
*   [HackerNews 线程](http://hackerne.ws/item?id=2251490)

“找到 ITS 方式”。 没有撇号。