为什么 org/arangodb/request 是同步的?
Why is org/arangodb/request synchronous?
为什么新的 JavaScript 模块 request 是同步的?它应该只用于作业队列吗?
有什么方法可以在 ArangoDB 中发出异步 http(s) 请求吗?
完全披露:我是 ArangoDB 开发团队的一员,主要从事 Foxx 和所有工作 JavaScript。我也是编写 org/arangodb/request
模块的人。
ArangoDB 是一个不同于 Node.js 的环境,尽管有许多相似之处(例如使用 V8 JavaScript 引擎)。与 Node.js(或浏览器)不同,ArangoDB 使用基于线程的并发模型并且没有事件循环。但是,JavaScript 中没有公开线程(事实上,在 V8 中,每个线程都是完全隔离的),因此您通常甚至不必考虑它们。
在浏览器和 Node.js 中,像 setTimeout
这样的函数通过事件循环延迟代码执行来工作(直到经过一定的时间或直到发生外部事件)。
在 ArangoDB 中,代码总是线性执行的。例如,传入的 HTTP 请求在 JavaScript 中传递给 Foxx 控制器,响应在控制器 returns 中立即发送。即使您可以使用 setTimeout
,您正在使用的外部资源(甚至 "internal" 诸如文档集合和事务之类的资源)在延迟代码可以执行时也可能已经消失。
正因为如此,org/arangodb/request
模块提供的request
功能也是完全同步的。它不是直接返回承诺或接受回调 returns 传入的响应数据。它也肯定 不是 与 npm 上的 request
相同的模块,而是基于该模块的 API 的同步实现,以实现其 API 在 Node.js 之外是可能的(例如,不包括流并返回远程响应而不是进行回调)。
如果你是Node.js/io.js出身,这可能会感觉不对,因为非阻塞IO可以实现更高的吞吐量,但是要记住ArangoDB和[=45=的设计目标] 很不一样。 Node.js 是围绕流和网络连接构建的。 ArangoDB 被构建为持久数据存储,必须处理事务和锁。
如果您极有可能出现严重的网络延迟或外部 API 的响应不正常,那么直接从 Foxx 控制器访问外部 API 可能不是最佳主意对客户响应至关重要。这就是 Foxx 队列的用途。交易电子邮件就是一个很好的例子。
虽然 Foxx 非常通用,但它的主要重点是允许您将大部分应用程序(尤其是受益于 运行 更接近数据的逻辑)直接移动到数据库中。对于中小型项目,您可能可以在边界内进行外部 API 调用。但是,如果您的应用程序主要关注通过网络与其他服务通信,运行 数据库中的代码可能不是最佳解决方案。
幸运的是 ArangoDB 与其他数据库配合良好,因此如果您发现网络密集型代码在更高负载下成为性能瓶颈,则很容易将其从 Foxx 中移出。 Foxx 并没有消除对应用程序服务器的需求,但它可以大大降低它们的复杂性。
作为对 Brian 回答的更正:遗憾的是,promises 也不会让您在同步环境中编写异步代码。 Promises/A+ spec 将承诺定义为必须异步执行。在它们不受本地支持的地方,它们仍然必须构建在现有函数之上,例如 setTimeout
或 process.nextTick
,ArangoDB 都没有实现。
为什么新的 JavaScript 模块 request 是同步的?它应该只用于作业队列吗?
有什么方法可以在 ArangoDB 中发出异步 http(s) 请求吗?
完全披露:我是 ArangoDB 开发团队的一员,主要从事 Foxx 和所有工作 JavaScript。我也是编写 org/arangodb/request
模块的人。
ArangoDB 是一个不同于 Node.js 的环境,尽管有许多相似之处(例如使用 V8 JavaScript 引擎)。与 Node.js(或浏览器)不同,ArangoDB 使用基于线程的并发模型并且没有事件循环。但是,JavaScript 中没有公开线程(事实上,在 V8 中,每个线程都是完全隔离的),因此您通常甚至不必考虑它们。
在浏览器和 Node.js 中,像 setTimeout
这样的函数通过事件循环延迟代码执行来工作(直到经过一定的时间或直到发生外部事件)。
在 ArangoDB 中,代码总是线性执行的。例如,传入的 HTTP 请求在 JavaScript 中传递给 Foxx 控制器,响应在控制器 returns 中立即发送。即使您可以使用 setTimeout
,您正在使用的外部资源(甚至 "internal" 诸如文档集合和事务之类的资源)在延迟代码可以执行时也可能已经消失。
正因为如此,org/arangodb/request
模块提供的request
功能也是完全同步的。它不是直接返回承诺或接受回调 returns 传入的响应数据。它也肯定 不是 与 npm 上的 request
相同的模块,而是基于该模块的 API 的同步实现,以实现其 API 在 Node.js 之外是可能的(例如,不包括流并返回远程响应而不是进行回调)。
如果你是Node.js/io.js出身,这可能会感觉不对,因为非阻塞IO可以实现更高的吞吐量,但是要记住ArangoDB和[=45=的设计目标] 很不一样。 Node.js 是围绕流和网络连接构建的。 ArangoDB 被构建为持久数据存储,必须处理事务和锁。
如果您极有可能出现严重的网络延迟或外部 API 的响应不正常,那么直接从 Foxx 控制器访问外部 API 可能不是最佳主意对客户响应至关重要。这就是 Foxx 队列的用途。交易电子邮件就是一个很好的例子。
虽然 Foxx 非常通用,但它的主要重点是允许您将大部分应用程序(尤其是受益于 运行 更接近数据的逻辑)直接移动到数据库中。对于中小型项目,您可能可以在边界内进行外部 API 调用。但是,如果您的应用程序主要关注通过网络与其他服务通信,运行 数据库中的代码可能不是最佳解决方案。
幸运的是 ArangoDB 与其他数据库配合良好,因此如果您发现网络密集型代码在更高负载下成为性能瓶颈,则很容易将其从 Foxx 中移出。 Foxx 并没有消除对应用程序服务器的需求,但它可以大大降低它们的复杂性。
作为对 Brian 回答的更正:遗憾的是,promises 也不会让您在同步环境中编写异步代码。 Promises/A+ spec 将承诺定义为必须异步执行。在它们不受本地支持的地方,它们仍然必须构建在现有函数之上,例如 setTimeout
或 process.nextTick
,ArangoDB 都没有实现。